├── .gitignore ├── Arduino_CurrentSense_ML ├── arduino_constants.cpp ├── arduino_main.cpp ├── arduino_output_handler.cpp ├── constants.h ├── current_ML.ino ├── main_functions.h ├── model.cpp ├── model.h └── output_handler.h ├── DataCollection ├── LED_blink.ino ├── LED_off.ino ├── LED_on.ino └── get_current_data.ino ├── LICENSE ├── README.md ├── TinyML-CurrentSense-Writeup.ipynb ├── example_data ├── led-off2.log └── led-on2.log ├── media ├── LED_model.png ├── LED_model_quantized.png ├── currentsense-ML-init.png ├── currentsense-ML-photo.jpeg ├── currentsense-ML-schematic.png ├── proof_of_concept.gif └── tensorflow.png └── model_data ├── LED_model.tflite ├── LED_model_quantized.cc ├── LED_model_quantized.tflite ├── checkpoint ├── pre-fit.weights.data-00000-of-00001 └── pre-fit.weights.index /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | #*.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | -------------------------------------------------------------------------------- /Arduino_CurrentSense_ML/arduino_constants.cpp: -------------------------------------------------------------------------------- 1 | /* Copyright 2019 The TensorFlow Authors. All Rights Reserved. 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | ==============================================================================*/ 15 | 16 | #include "constants.h" 17 | 18 | // This is tuned so that a full cycle takes ~4 seconds on an Arduino MKRZERO. 19 | const int kInferencesPerCycle = 1000; 20 | -------------------------------------------------------------------------------- /Arduino_CurrentSense_ML/arduino_main.cpp: -------------------------------------------------------------------------------- 1 | /* Copyright 2019 The TensorFlow Authors. All Rights Reserved. 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | ==============================================================================*/ 15 | 16 | #include "main_functions.h" 17 | 18 | // Arduino automatically calls the setup() and loop() functions in a sketch, so 19 | // where other systems need their own main routine in this file, it can be left 20 | // empty. 21 | -------------------------------------------------------------------------------- /Arduino_CurrentSense_ML/arduino_output_handler.cpp: -------------------------------------------------------------------------------- 1 | /* Copyright 2019 The TensorFlow Authors. All Rights Reserved. 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | ==============================================================================*/ 15 | 16 | #include "output_handler.h" 17 | 18 | #include "Arduino.h" 19 | #include "constants.h" 20 | 21 | // The pin of the Arduino's built-in LED 22 | int led = LED_BUILTIN; 23 | 24 | // Track whether the function has run at least once 25 | bool initialized = false; 26 | 27 | // Track previous inference outputs... 28 | bool prev_out[3]; 29 | 30 | // Animates a dot across the screen to represent the current x and y values 31 | void HandleOutput(tflite::ErrorReporter* error_reporter, float x_1, float x_2) { 32 | // Do this only once 33 | if (!initialized) { 34 | // Set the LED pin to output 35 | pinMode(led, OUTPUT); 36 | initialized = true; 37 | } 38 | bool output = (x_2 == 0) ? HIGH : LOW; // we'll use x_2 as we wanna focus on 'LED ON'. 39 | // if the previous outputs are the same as the current, then the LED is likely on... 40 | // this is to remove noisey false outputs from the model... 41 | if (prev_out[0] == prev_out[1] && prev_out[1] == output){ 42 | digitalWrite(led, output); 43 | } 44 | TF_LITE_REPORT_ERROR(error_reporter, "LED guess: %d\n", output); 45 | prev_out[0] = prev_out[1]; 46 | prev_out[1] = output; 47 | } 48 | -------------------------------------------------------------------------------- /Arduino_CurrentSense_ML/constants.h: -------------------------------------------------------------------------------- 1 | /* Copyright 2019 The TensorFlow Authors. All Rights Reserved. 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | ==============================================================================*/ 15 | 16 | #ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_CONSTANTS_H_ 17 | #define TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_CONSTANTS_H_ 18 | 19 | // This constant represents the range of x values our model was trained on, 20 | // which is from 0 to (2 * Pi). We approximate Pi to avoid requiring additional 21 | // libraries. 22 | //const float kXrange = 2.f * 3.14159265359f; 23 | 24 | // This constant determines the number of inferences to perform across the range 25 | // of x values defined above. Since each inference takes time, the higher this 26 | // number, the more time it will take to run through the entire range. The value 27 | // of this constant can be tuned so that one full cycle takes a desired amount 28 | // of time. Since different devices take different amounts of time to perform 29 | // inference, this value should be defined per-device. 30 | extern const int kInferencesPerCycle; 31 | 32 | #endif // TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_CONSTANTS_H_ 33 | -------------------------------------------------------------------------------- /Arduino_CurrentSense_ML/current_ML.ino: -------------------------------------------------------------------------------- 1 | /* Copyright 2020 The TensorFlow Authors. All Rights Reserved. 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | ==============================================================================*/ 15 | 16 | // Dirrrrty Haxx... 17 | #define private public 18 | #define protected public 19 | 20 | //for the current sensor 21 | #include 22 | Adafruit_INA219 ina219; 23 | int8_t curr_array[16]; 24 | int8_t ctr = 0; 25 | 26 | #include 27 | 28 | #include "main_functions.h" 29 | 30 | #include "tensorflow/lite/micro/all_ops_resolver.h" 31 | #include "constants.h" 32 | #include "model.h" 33 | #include "output_handler.h" 34 | #include "tensorflow/lite/micro/micro_error_reporter.h" 35 | #include "tensorflow/lite/micro/micro_interpreter.h" 36 | #include "tensorflow/lite/schema/schema_generated.h" 37 | #include "tensorflow/lite/version.h" 38 | 39 | // Globals, used for compatibility with Arduino-style sketches. 40 | namespace { 41 | tflite::ErrorReporter* error_reporter = nullptr; 42 | const tflite::Model* model = nullptr; 43 | tflite::MicroInterpreter* interpreter = nullptr; 44 | TfLiteTensor* input = nullptr; 45 | TfLiteTensor* output = nullptr; 46 | int inference_count = 0; 47 | 48 | constexpr int kTensorArenaSize = 2000; 49 | uint8_t tensor_arena[kTensorArenaSize]; 50 | } // namespace 51 | 52 | // The name of this function is important for Arduino compatibility. 53 | void setup() { 54 | if (! ina219.begin()) { 55 | Serial.println("Failed to find INA219 chip"); 56 | while (1) { delay(10); } 57 | } 58 | 59 | 60 | // Set up logging. Google style is to avoid globals or statics because of 61 | // lifetime uncertainty, but since this has a trivial destructor it's okay. 62 | // NOLINTNEXTLINE(runtime-global-variables) 63 | static tflite::MicroErrorReporter micro_error_reporter; 64 | error_reporter = µ_error_reporter; 65 | 66 | // Map the model into a usable data structure. This doesn't involve any 67 | // copying or parsing, it's a very lightweight operation. 68 | model = tflite::GetModel(g_model); 69 | if (model->version() != TFLITE_SCHEMA_VERSION) { 70 | TF_LITE_REPORT_ERROR(error_reporter, 71 | "Model provided is schema version %d not equal " 72 | "to supported version %d.", 73 | model->version(), TFLITE_SCHEMA_VERSION); 74 | return; 75 | } 76 | 77 | // This pulls in all the operation implementations we need. 78 | // NOLINTNEXTLINE(runtime-global-variables) 79 | static tflite::AllOpsResolver resolver; 80 | 81 | // Build an interpreter to run the model with. 82 | static tflite::MicroInterpreter static_interpreter( 83 | model, resolver, tensor_arena, kTensorArenaSize, error_reporter); 84 | interpreter = &static_interpreter; 85 | 86 | // Allocate memory from the tensor_arena for the model's tensors. 87 | TfLiteStatus allocate_status = interpreter->AllocateTensors(); 88 | if (allocate_status != kTfLiteOk) { 89 | TF_LITE_REPORT_ERROR(error_reporter, "AllocateTensors() failed"); 90 | return; 91 | } 92 | 93 | // Obtain pointers to the model's input and output tensors. 94 | input = interpreter->input(0); 95 | output = interpreter->output(0); 96 | 97 | // Keep track of how many inferences we have performed. 98 | inference_count = 0; 99 | } 100 | 101 | void load_data(const int8_t * data, TfLiteTensor * input) 102 | { 103 | //for (int i = 0; i < input->bytes; ++i) 104 | for (int i = 0; i < 16; ++i) 105 | { 106 | // quantize the input, then send to the model... 107 | //int8_t x_quantized = data[i] / input->params.scale + input->params.zero_point; 108 | input->data.int8[i] = data[i]; 109 | } 110 | } 111 | 112 | int i; 113 | 114 | // The name of this function is important for Arduino compatibility. 115 | void loop() { 116 | int param; 117 | for(i=0;i < 16; i += 1){ 118 | param = ina219.getCurrent_raw(); 119 | curr_array[i] = param / input->params.scale + input->params.zero_point; 120 | } 121 | load_data(curr_array, input); 122 | 123 | // Run inference, and report any error 124 | TfLiteStatus invoke_status = interpreter->Invoke(); 125 | if (invoke_status != kTfLiteOk) { 126 | TF_LITE_REPORT_ERROR(error_reporter, "Invoke failed"); 127 | return; 128 | } 129 | 130 | // Obtain the quantized output from model's output tensor 131 | float y_1 = output->data.f[0]; // get last byte of output... 132 | float y_2 = output->data.f[1]; 133 | 134 | // Output the results. A custom HandleOutput function can be implemented 135 | // for each supported hardware target. 136 | HandleOutput(error_reporter, y_1, y_2); 137 | 138 | // Increment the inference_counter, and reset it if we have reached 139 | // the total number per cycle 140 | inference_count += 1; 141 | if (inference_count >= kInferencesPerCycle) inference_count = 0; 142 | 143 | } 144 | -------------------------------------------------------------------------------- /Arduino_CurrentSense_ML/main_functions.h: -------------------------------------------------------------------------------- 1 | /* Copyright 2019 The TensorFlow Authors. All Rights Reserved. 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | ==============================================================================*/ 15 | 16 | #ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_MAIN_FUNCTIONS_H_ 17 | #define TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_MAIN_FUNCTIONS_H_ 18 | 19 | // Expose a C friendly interface for main functions. 20 | #ifdef __cplusplus 21 | extern "C" { 22 | #endif 23 | 24 | // Initializes all data needed for the example. The name is important, and needs 25 | // to be setup() for Arduino compatibility. 26 | void setup(); 27 | 28 | // Runs one iteration of data gathering and inference. This should be called 29 | // repeatedly from the application code. The name needs to be loop() for Arduino 30 | // compatibility. 31 | void loop(); 32 | 33 | #ifdef __cplusplus 34 | } 35 | #endif 36 | 37 | #endif // TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_MAIN_FUNCTIONS_H_ 38 | -------------------------------------------------------------------------------- /Arduino_CurrentSense_ML/model.cpp: -------------------------------------------------------------------------------- 1 | /* Copyright 2020 The TensorFlow Authors. All Rights Reserved. 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | ==============================================================================*/ 15 | 16 | // Automatically created from a TensorFlow Lite flatbuffer using the command: 17 | // xxd -i model.tflite > model.cc 18 | 19 | // This is a standard TensorFlow Lite model file that has been converted into a 20 | // C data array, so it can be easily compiled into a binary for devices that 21 | // don't have a file system. 22 | 23 | // See train/README.md for a full description of the creation process. 24 | 25 | #include "model.h" 26 | 27 | // Keep model aligned to 8 bytes to guarantee aligned 64-bit accesses. 28 | alignas(8) const unsigned char g_model[] = { 29 | 0x24, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x00, 0x00, 0x00, 0x00, 30 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x1c, 0x00, 0x04, 0x00, 31 | 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x18, 0x00, 32 | 0x12, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xfc, 0x21, 0x00, 0x00, 33 | 0x40, 0x18, 0x00, 0x00, 0x28, 0x18, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 34 | 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 35 | 0x08, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 36 | 0x08, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 37 | 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 38 | 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x00, 0x0f, 0x00, 0x00, 0x00, 39 | 0xd4, 0x17, 0x00, 0x00, 0xc0, 0x17, 0x00, 0x00, 0xa4, 0x16, 0x00, 0x00, 40 | 0x90, 0x15, 0x00, 0x00, 0x6c, 0x15, 0x00, 0x00, 0x48, 0x15, 0x00, 0x00, 41 | 0x34, 0x11, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 42 | 0x80, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 43 | 0x44, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 44 | 0xae, 0xe7, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 45 | 0x31, 0x2e, 0x35, 0x2e, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 46 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 47 | 0x00, 0x00, 0x00, 0x00, 0x14, 0xe1, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 48 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xe1, 0xff, 0xff, 49 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 50 | 0x34, 0xe1, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 51 | 0x00, 0x00, 0x00, 0x00, 0x44, 0xe1, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 52 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0xe1, 0xff, 0xff, 53 | 0x00, 0x00, 0x00, 0x00, 0x1e, 0xe8, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 54 | 0x80, 0x00, 0x00, 0x00, 0x55, 0x3c, 0x28, 0xe7, 0xdc, 0x20, 0xca, 0x2e, 55 | 0x12, 0x61, 0x14, 0xa2, 0xb2, 0x25, 0x15, 0x2b, 0x31, 0x5b, 0xf6, 0xb0, 56 | 0x0d, 0x4e, 0x73, 0xec, 0xa8, 0xc3, 0xef, 0xd4, 0x23, 0x07, 0x32, 0xeb, 57 | 0x3d, 0x08, 0xdc, 0x50, 0xeb, 0xb3, 0xc5, 0x28, 0x33, 0xf9, 0x04, 0x41, 58 | 0x91, 0xbc, 0x06, 0x88, 0xdb, 0x13, 0x3b, 0x3d, 0x2a, 0xc9, 0xd5, 0x7f, 59 | 0xf1, 0xdc, 0xb7, 0xde, 0xac, 0xf4, 0x7b, 0x03, 0xcc, 0xf4, 0xa3, 0xf2, 60 | 0x6e, 0x23, 0x47, 0xcd, 0x15, 0xb9, 0x0b, 0x36, 0x3a, 0xa1, 0x3b, 0x07, 61 | 0xc5, 0xdc, 0x13, 0x51, 0x35, 0xe5, 0x98, 0x17, 0x48, 0x52, 0x23, 0x50, 62 | 0xbf, 0xdd, 0xa7, 0xe5, 0xe5, 0xf2, 0x03, 0xb8, 0x28, 0x2f, 0x44, 0xf1, 63 | 0x1f, 0xf5, 0x2e, 0xec, 0x53, 0x30, 0x0a, 0x2a, 0x4c, 0xd5, 0xf1, 0xb4, 64 | 0xdb, 0x2f, 0xd4, 0xa9, 0x21, 0xe6, 0x31, 0x4b, 0x34, 0x18, 0xbc, 0xba, 65 | 0x00, 0x00, 0x00, 0x00, 0xae, 0xe8, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 66 | 0x00, 0x10, 0x00, 0x00, 0xff, 0xe5, 0x02, 0xf8, 0x09, 0x01, 0x02, 0xfd, 67 | 0x0a, 0xfe, 0x03, 0x10, 0x03, 0xfd, 0xfd, 0xf5, 0x0b, 0xfb, 0xff, 0xff, 68 | 0x00, 0xfe, 0x04, 0xfe, 0x0a, 0xff, 0xf4, 0x02, 0x05, 0x0b, 0x04, 0x0b, 69 | 0x0b, 0xf8, 0x01, 0xfd, 0x07, 0xfd, 0xf6, 0xfa, 0xfe, 0xfe, 0x00, 0xf5, 70 | 0x08, 0x09, 0x00, 0xf5, 0xfa, 0xfa, 0x0d, 0x0c, 0xff, 0xff, 0xf5, 0x08, 71 | 0xf8, 0xfc, 0x04, 0x0d, 0x09, 0xf9, 0x17, 0xf9, 0x0e, 0x0a, 0xec, 0xf6, 72 | 0xfd, 0xe2, 0x01, 0x04, 0xfd, 0xff, 0xf4, 0x0c, 0x0d, 0xf0, 0xfb, 0xfb, 73 | 0xff, 0xff, 0x14, 0x12, 0x0c, 0x01, 0xee, 0x08, 0x00, 0xfb, 0x05, 0x0f, 74 | 0xf8, 0xf8, 0x0a, 0xea, 0x02, 0xf5, 0x0f, 0x00, 0x08, 0x09, 0x09, 0x09, 75 | 0xf5, 0xfa, 0xf9, 0xfd, 0x02, 0xf3, 0x04, 0xec, 0xf4, 0x04, 0xf8, 0x08, 76 | 0x1f, 0xf5, 0xf5, 0xfc, 0xfc, 0x14, 0xeb, 0xfd, 0x01, 0xf4, 0xf7, 0x06, 77 | 0xfc, 0x01, 0x0b, 0xe8, 0xfe, 0x05, 0x06, 0x06, 0x0a, 0xfa, 0xfa, 0x04, 78 | 0x00, 0x05, 0x05, 0xf9, 0x01, 0x02, 0xf1, 0xff, 0x00, 0x0a, 0xf4, 0x03, 79 | 0x07, 0x0a, 0x02, 0x0c, 0x05, 0xfa, 0x09, 0x05, 0x02, 0xfd, 0x00, 0x07, 80 | 0x04, 0xdf, 0xf8, 0xf8, 0xfa, 0xff, 0xfa, 0x09, 0xf9, 0x0a, 0x00, 0xfb, 81 | 0xf8, 0xff, 0xf6, 0x00, 0xf7, 0xfa, 0x0c, 0xfa, 0x00, 0xff, 0x03, 0xf4, 82 | 0x09, 0x05, 0xf7, 0xfe, 0xf9, 0x01, 0xfd, 0xfe, 0xef, 0xf7, 0x06, 0x02, 83 | 0xfb, 0xf7, 0xfb, 0x09, 0xf4, 0x09, 0xf6, 0xf7, 0xff, 0x03, 0xf6, 0xfa, 84 | 0x03, 0x08, 0x05, 0xf7, 0xff, 0xf9, 0x0a, 0xff, 0x06, 0xfc, 0x06, 0x03, 85 | 0xf5, 0xf1, 0x00, 0x06, 0x00, 0x05, 0x04, 0x01, 0x09, 0xff, 0xfe, 0x03, 86 | 0xf7, 0xf8, 0xfe, 0x05, 0xfd, 0xfe, 0xfc, 0x04, 0x06, 0xf7, 0x01, 0xfb, 87 | 0x09, 0xf7, 0xf4, 0xfe, 0x02, 0x04, 0x06, 0x00, 0x0c, 0x06, 0x06, 0xfb, 88 | 0x09, 0x04, 0xf5, 0x0a, 0xfa, 0x0a, 0x04, 0x05, 0x03, 0x01, 0xfd, 0xff, 89 | 0x09, 0xfe, 0xf0, 0xfe, 0x03, 0xf6, 0x00, 0x0a, 0xf5, 0x00, 0x0d, 0x06, 90 | 0x09, 0x06, 0xf9, 0x0b, 0xf8, 0xfe, 0xf6, 0xfd, 0xfe, 0xfe, 0xff, 0xfd, 91 | 0x09, 0x03, 0xfb, 0xf6, 0x08, 0x08, 0xf5, 0x04, 0x0b, 0x06, 0xf2, 0xf9, 92 | 0x0c, 0x08, 0xfc, 0xf9, 0xf9, 0xfb, 0x0c, 0xfe, 0x08, 0x0b, 0x04, 0x02, 93 | 0xfe, 0x03, 0xfa, 0xfa, 0xf3, 0xf1, 0xf7, 0xfb, 0xf7, 0xfb, 0x02, 0x09, 94 | 0xf7, 0x06, 0x06, 0xf5, 0xfa, 0x02, 0x0b, 0x08, 0xfa, 0xff, 0xf8, 0xf7, 95 | 0x0b, 0xfe, 0xf4, 0x05, 0x04, 0xfd, 0xfb, 0x09, 0xf7, 0xef, 0x09, 0xff, 96 | 0xf6, 0x03, 0xff, 0xfd, 0xfa, 0xfd, 0xf9, 0xfc, 0xf9, 0xf6, 0x07, 0xf8, 97 | 0x04, 0x08, 0x07, 0xf4, 0x01, 0x04, 0x05, 0xfd, 0xfd, 0x01, 0xed, 0xfe, 98 | 0xf9, 0x01, 0x09, 0x05, 0x06, 0xfd, 0x04, 0x03, 0x0a, 0x02, 0xfd, 0xfc, 99 | 0xf6, 0x02, 0x04, 0x0e, 0x0a, 0x08, 0x08, 0x08, 0x00, 0x01, 0xfc, 0x01, 100 | 0xfd, 0xf4, 0x0f, 0x10, 0x04, 0x0e, 0x0d, 0x07, 0xf6, 0x06, 0xf6, 0x1b, 101 | 0x0f, 0x08, 0xf2, 0x0a, 0xfd, 0x03, 0x09, 0x09, 0xf8, 0x0c, 0x06, 0x04, 102 | 0x03, 0x0a, 0x0b, 0x0b, 0x06, 0x00, 0x0f, 0x06, 0x0e, 0x11, 0xfd, 0xf8, 103 | 0x05, 0x0a, 0x00, 0x1c, 0xff, 0x02, 0xfe, 0x02, 0x0c, 0xfa, 0xff, 0xf4, 104 | 0x01, 0x8a, 0xe4, 0xf8, 0x05, 0x01, 0xfa, 0x06, 0x05, 0x22, 0xf4, 0xff, 105 | 0xf0, 0x04, 0x07, 0x12, 0x02, 0x0b, 0xfc, 0x09, 0x01, 0xff, 0x01, 0xac, 106 | 0xfc, 0x0b, 0x16, 0xea, 0x05, 0xe2, 0xfd, 0xfe, 0xf8, 0xfd, 0x29, 0xf6, 107 | 0xfd, 0x06, 0x01, 0xfb, 0xfd, 0xfe, 0xfc, 0xf0, 0x05, 0x03, 0x02, 0x01, 108 | 0xfe, 0xf8, 0x10, 0xff, 0x04, 0xf4, 0x01, 0xfe, 0x0a, 0x00, 0x14, 0xfc, 109 | 0x02, 0xf5, 0x01, 0xfa, 0xf6, 0xfc, 0xfd, 0xf2, 0x0a, 0x06, 0xf5, 0xf6, 110 | 0xfb, 0xf8, 0xf5, 0xff, 0xfa, 0x04, 0xf5, 0x03, 0xf5, 0xf4, 0xfd, 0xf2, 111 | 0x02, 0xfc, 0xf6, 0xf8, 0x0b, 0xf6, 0x00, 0xfd, 0x00, 0xfa, 0xfd, 0x0b, 112 | 0xff, 0x00, 0xf1, 0xf1, 0xfc, 0x00, 0xf8, 0x01, 0x09, 0x00, 0x06, 0xf0, 113 | 0x04, 0xfe, 0xf8, 0xf8, 0xf3, 0x06, 0xf8, 0x02, 0xfe, 0x10, 0xfa, 0x06, 114 | 0xf4, 0xf2, 0xf9, 0x00, 0x00, 0xf0, 0xfd, 0x0f, 0x00, 0x04, 0xf9, 0xf8, 115 | 0x03, 0xf7, 0x11, 0xfa, 0x01, 0xfe, 0x01, 0x04, 0xfb, 0xfb, 0xfe, 0xfc, 116 | 0xfa, 0xf0, 0xf4, 0xfa, 0xf5, 0xf4, 0x0a, 0xff, 0x09, 0xfd, 0xf8, 0xfa, 117 | 0x03, 0xff, 0xf3, 0xfb, 0x0a, 0xfe, 0x07, 0xfd, 0xf8, 0x07, 0x08, 0xfe, 118 | 0xf9, 0xff, 0xf4, 0x05, 0xf5, 0xfd, 0x07, 0x07, 0x08, 0xf7, 0x02, 0x06, 119 | 0xf9, 0xfa, 0x00, 0xf6, 0x0a, 0xff, 0xfb, 0x09, 0x00, 0x01, 0x05, 0x0b, 120 | 0xfa, 0x01, 0xfc, 0xfe, 0xf8, 0x08, 0xfd, 0x00, 0x01, 0x00, 0xfe, 0xf8, 121 | 0x04, 0xf6, 0x04, 0xf3, 0x00, 0xf6, 0x07, 0x08, 0x0b, 0x01, 0x06, 0xf1, 122 | 0x0b, 0xfa, 0xfe, 0xf6, 0x04, 0xf3, 0x04, 0xfe, 0x02, 0xf9, 0xfa, 0xf6, 123 | 0xfb, 0x01, 0xf9, 0x04, 0x02, 0x06, 0x00, 0xfe, 0x01, 0xf6, 0x01, 0xfe, 124 | 0x03, 0xff, 0xfe, 0xf4, 0xfc, 0xf8, 0xf6, 0x01, 0x07, 0xf4, 0xfe, 0x0b, 125 | 0x07, 0x0d, 0xf6, 0xfb, 0x07, 0xfe, 0xfa, 0xfd, 0x03, 0xfc, 0x09, 0xf3, 126 | 0xfd, 0xf9, 0xfb, 0x02, 0x12, 0x0b, 0xf9, 0xf7, 0xfd, 0xf9, 0x0a, 0xed, 127 | 0x04, 0x05, 0xff, 0xfe, 0x06, 0xe4, 0x0f, 0x07, 0x04, 0xfa, 0x06, 0x0d, 128 | 0x02, 0x01, 0x04, 0x00, 0x07, 0x03, 0x06, 0x08, 0xf5, 0x09, 0x01, 0x00, 129 | 0xff, 0x04, 0xff, 0x00, 0xff, 0x0c, 0xf9, 0x0a, 0x05, 0xef, 0x07, 0xf6, 130 | 0xfd, 0xfb, 0xf8, 0x0a, 0x06, 0x03, 0x0c, 0x09, 0xf9, 0x07, 0xf5, 0x0b, 131 | 0x02, 0xfe, 0xf8, 0x00, 0xfe, 0x00, 0x0c, 0xfa, 0xf7, 0x08, 0x05, 0x0c, 132 | 0xf8, 0xf4, 0x0e, 0x02, 0x02, 0x05, 0xf9, 0x06, 0xf9, 0xfe, 0xfd, 0x08, 133 | 0x0c, 0x05, 0xfd, 0xfa, 0xfd, 0x07, 0xfe, 0xff, 0xf7, 0xf7, 0xf8, 0xfa, 134 | 0xf6, 0xfa, 0x02, 0xfc, 0x03, 0xf9, 0xfa, 0x07, 0x04, 0x03, 0xff, 0x05, 135 | 0xff, 0x0c, 0x04, 0x0a, 0x04, 0xf8, 0x06, 0x07, 0x01, 0x05, 0x08, 0xff, 136 | 0x03, 0x03, 0x05, 0x08, 0x0b, 0xf9, 0x0c, 0xf5, 0xfe, 0x06, 0x01, 0x07, 137 | 0xfc, 0xfd, 0xf4, 0xff, 0xf9, 0x10, 0x00, 0xff, 0x0c, 0xff, 0xf4, 0x0b, 138 | 0xfd, 0xfd, 0x08, 0xea, 0xfd, 0xff, 0xfd, 0x05, 0xfe, 0xfa, 0xf7, 0x07, 139 | 0x05, 0x02, 0x0a, 0xf6, 0x00, 0xf6, 0x09, 0xfb, 0xf3, 0xf2, 0xfd, 0x06, 140 | 0x03, 0x03, 0x08, 0x08, 0x0b, 0x05, 0xfd, 0x02, 0xe4, 0x04, 0xf8, 0x07, 141 | 0xfb, 0xfe, 0xf3, 0xf2, 0x0b, 0x0a, 0xe3, 0xfb, 0x02, 0x04, 0xf0, 0xf9, 142 | 0xf1, 0x0c, 0xf2, 0xeb, 0xf7, 0x07, 0x04, 0x0d, 0xf3, 0xf8, 0xfe, 0x06, 143 | 0x00, 0x08, 0xfe, 0x15, 0x00, 0x09, 0x02, 0xf4, 0xff, 0xef, 0xe6, 0x00, 144 | 0x0b, 0xe2, 0xfc, 0x08, 0x02, 0xf8, 0x01, 0x05, 0x00, 0x16, 0xfc, 0x09, 145 | 0xf0, 0xeb, 0x01, 0xf0, 0xfa, 0x03, 0x25, 0x06, 0x02, 0x13, 0x07, 0xff, 146 | 0xfc, 0xf2, 0x0b, 0x04, 0xf1, 0xfb, 0x01, 0xfb, 0x00, 0x00, 0xf7, 0xf5, 147 | 0xf6, 0x0c, 0x05, 0xf9, 0xfb, 0x05, 0xf1, 0xfd, 0xf7, 0x04, 0xf6, 0x03, 148 | 0x08, 0xf8, 0x06, 0xf5, 0xf7, 0xfc, 0x0c, 0xf9, 0xfd, 0x01, 0xfd, 0x0b, 149 | 0xfa, 0xe4, 0xfe, 0x03, 0xf5, 0xea, 0xf9, 0xfa, 0xff, 0x03, 0xf7, 0xf3, 150 | 0x02, 0xfc, 0x08, 0x03, 0x09, 0x03, 0xf9, 0x03, 0xf4, 0xfb, 0x05, 0xf8, 151 | 0xf1, 0xff, 0xf8, 0x13, 0x04, 0xf0, 0x04, 0xf6, 0x05, 0x0a, 0x04, 0xf5, 152 | 0x07, 0x00, 0x03, 0xf9, 0x04, 0xef, 0x0a, 0x08, 0x00, 0x02, 0xf3, 0x01, 153 | 0xfe, 0xf0, 0x09, 0xf5, 0xfa, 0xfe, 0xfb, 0xfa, 0x02, 0x11, 0xf3, 0x01, 154 | 0x09, 0xf8, 0xfc, 0x01, 0xf2, 0x05, 0xfb, 0xf2, 0xf9, 0x00, 0xf7, 0x0a, 155 | 0xf8, 0xff, 0x05, 0xe3, 0x05, 0x0c, 0x01, 0x0c, 0xfd, 0xf9, 0xf0, 0x00, 156 | 0x01, 0xf5, 0x00, 0x07, 0x01, 0x04, 0xfe, 0xee, 0xf6, 0x05, 0x06, 0x01, 157 | 0x05, 0xfa, 0xfa, 0x0c, 0xf8, 0xfb, 0xfc, 0x01, 0xf8, 0x05, 0xff, 0x05, 158 | 0x01, 0x01, 0x08, 0x03, 0x05, 0x05, 0x05, 0xf1, 0x04, 0xff, 0xfd, 0x00, 159 | 0x03, 0x07, 0xfa, 0x00, 0x02, 0x04, 0x06, 0x09, 0xfc, 0x03, 0x06, 0xfc, 160 | 0x06, 0x04, 0x03, 0xff, 0xf7, 0xf7, 0xf7, 0xff, 0x07, 0x04, 0x08, 0x08, 161 | 0x04, 0x01, 0xff, 0xfb, 0x05, 0xff, 0x13, 0xfa, 0x02, 0x04, 0x03, 0x04, 162 | 0xf8, 0x02, 0xfb, 0x0c, 0xfd, 0x18, 0xee, 0xf8, 0x02, 0x09, 0x05, 0xfd, 163 | 0x0b, 0x0b, 0x0b, 0x01, 0xfc, 0xfe, 0xf4, 0xfd, 0xf5, 0x04, 0x19, 0x11, 164 | 0x06, 0xfb, 0x08, 0x1e, 0xf7, 0x07, 0xfb, 0x1d, 0x09, 0xfe, 0xf8, 0x00, 165 | 0x04, 0xda, 0x09, 0x08, 0xfc, 0x1a, 0xeb, 0x09, 0x00, 0xfb, 0xfb, 0xf8, 166 | 0x07, 0xf5, 0xfe, 0x10, 0xf3, 0x03, 0xfd, 0xf3, 0xf5, 0xf8, 0x03, 0x0d, 167 | 0x12, 0x0d, 0xfa, 0x07, 0xed, 0x04, 0xfb, 0xf9, 0xea, 0x13, 0xf4, 0x10, 168 | 0x0a, 0x08, 0xe6, 0xf9, 0x0c, 0x1b, 0xfb, 0x00, 0x08, 0x0b, 0x0e, 0xff, 169 | 0x01, 0xf2, 0x0a, 0x09, 0x04, 0xf8, 0xf8, 0x09, 0x09, 0x0c, 0x13, 0xfb, 170 | 0xfd, 0xf2, 0xf3, 0x18, 0x16, 0x10, 0xef, 0x08, 0xfa, 0x12, 0x02, 0xf3, 171 | 0xf5, 0xf9, 0x06, 0x0c, 0xfe, 0xf9, 0x03, 0x11, 0x0b, 0xf8, 0x1e, 0xf1, 172 | 0x04, 0x0c, 0xf7, 0x0c, 0xf5, 0x0b, 0xee, 0x01, 0x03, 0xf0, 0x00, 0x0a, 173 | 0xeb, 0x09, 0xf3, 0x06, 0x05, 0x0b, 0xfd, 0xfd, 0x03, 0xfd, 0x10, 0xfc, 174 | 0x04, 0x04, 0x04, 0x06, 0xf3, 0xf4, 0xfd, 0xff, 0x0a, 0xfe, 0x0e, 0xfd, 175 | 0xf9, 0x04, 0x02, 0x15, 0xfb, 0x05, 0xf6, 0x11, 0x11, 0xf1, 0xf5, 0xfd, 176 | 0xfb, 0x02, 0x0d, 0xf3, 0xf8, 0xf8, 0x08, 0x0a, 0x02, 0x06, 0xfb, 0x12, 177 | 0x0b, 0xfb, 0x0f, 0xfe, 0x0c, 0x01, 0x03, 0xf7, 0xeb, 0x0c, 0x01, 0x03, 178 | 0xf6, 0xfe, 0x14, 0x0a, 0x00, 0x01, 0xff, 0x01, 0x05, 0x02, 0x06, 0x01, 179 | 0x01, 0x05, 0x0c, 0x04, 0xfc, 0x02, 0xf8, 0x06, 0x02, 0xfc, 0xfa, 0xfd, 180 | 0x06, 0x09, 0xfe, 0x01, 0x00, 0xf8, 0x00, 0x06, 0x06, 0xfb, 0x11, 0x08, 181 | 0x04, 0xf4, 0x06, 0x03, 0x05, 0x05, 0x05, 0x00, 0xf5, 0xfa, 0x09, 0xfe, 182 | 0xf7, 0xf6, 0xfc, 0x06, 0xf9, 0xfb, 0x07, 0x06, 0x00, 0x01, 0x0d, 0x05, 183 | 0xf8, 0x09, 0x03, 0xfb, 0xfc, 0x07, 0x03, 0x0a, 0xf7, 0x08, 0xfe, 0x01, 184 | 0x03, 0xe7, 0x02, 0x02, 0x03, 0x01, 0x07, 0x04, 0xf8, 0xf6, 0x02, 0xf7, 185 | 0x10, 0x05, 0xf4, 0x12, 0x01, 0xf9, 0xfd, 0xfc, 0x09, 0xe7, 0xea, 0xff, 186 | 0xfd, 0xfd, 0xfc, 0x03, 0x05, 0x01, 0x01, 0xfa, 0xfe, 0xfe, 0xf1, 0x00, 187 | 0xfd, 0x01, 0xff, 0xff, 0x03, 0xed, 0x04, 0x00, 0x01, 0xf9, 0x02, 0x07, 188 | 0x07, 0x03, 0x02, 0x00, 0x06, 0xfb, 0x04, 0x06, 0xfd, 0xff, 0xfe, 0xf3, 189 | 0x04, 0x05, 0xf8, 0x0a, 0x03, 0x05, 0xfd, 0xff, 0xfb, 0x03, 0x01, 0x05, 190 | 0x06, 0x16, 0xf2, 0x01, 0x13, 0x00, 0x1a, 0xf9, 0xfe, 0xf9, 0xff, 0x03, 191 | 0x03, 0x13, 0x07, 0xd3, 0xf6, 0x06, 0xf9, 0x12, 0x0a, 0xfa, 0xf4, 0x0f, 192 | 0x0c, 0x15, 0x27, 0xfd, 0x04, 0xff, 0x16, 0xfd, 0x06, 0xf5, 0xff, 0xfd, 193 | 0x09, 0x04, 0x0a, 0x11, 0x0d, 0x06, 0xf4, 0x07, 0xed, 0x02, 0xed, 0x0b, 194 | 0x17, 0xef, 0x0b, 0xfb, 0x00, 0xfc, 0x05, 0xf7, 0x0a, 0xf6, 0x08, 0x05, 195 | 0x00, 0x08, 0xfc, 0xf9, 0xf7, 0x01, 0xfe, 0x00, 0x08, 0xf3, 0x0a, 0x0b, 196 | 0x07, 0x03, 0xff, 0x04, 0x02, 0x09, 0x07, 0x01, 0xf9, 0x05, 0xf9, 0xfd, 197 | 0x01, 0x04, 0xf5, 0xf5, 0x04, 0xff, 0x02, 0x09, 0x07, 0xf5, 0xfd, 0xf6, 198 | 0x06, 0xf8, 0x02, 0x04, 0x09, 0xf8, 0xff, 0xf9, 0x0a, 0x00, 0x0b, 0xfd, 199 | 0x07, 0x07, 0x0a, 0x08, 0xf8, 0x03, 0x09, 0x00, 0xf7, 0x10, 0x04, 0xfd, 200 | 0x06, 0x0b, 0xfc, 0x0a, 0xfb, 0x0d, 0xfa, 0xf5, 0xfc, 0xfe, 0x05, 0x04, 201 | 0xff, 0xfc, 0xf4, 0x02, 0x02, 0x0d, 0x03, 0x0a, 0x03, 0x04, 0xf8, 0x09, 202 | 0x02, 0x05, 0x04, 0x00, 0xf6, 0xfa, 0x00, 0x02, 0xfb, 0xfc, 0x0b, 0xfb, 203 | 0xf8, 0xff, 0xff, 0xfc, 0xf7, 0x07, 0xfa, 0x05, 0x03, 0xfe, 0xf9, 0x08, 204 | 0x05, 0xf8, 0xfe, 0x08, 0xfc, 0xee, 0x0b, 0xfb, 0x02, 0x01, 0xfd, 0x06, 205 | 0x01, 0x0f, 0x01, 0x0b, 0xf3, 0x03, 0x0c, 0x0c, 0xf5, 0x02, 0xf5, 0xfe, 206 | 0x08, 0xea, 0xf9, 0xf8, 0x01, 0x0f, 0xf9, 0xfd, 0x0c, 0xf8, 0xe9, 0x06, 207 | 0xff, 0x0d, 0x09, 0x05, 0xf4, 0xfb, 0x03, 0xed, 0x02, 0xf7, 0xfe, 0x11, 208 | 0x04, 0xfa, 0x09, 0x09, 0x03, 0x0a, 0xf2, 0x11, 0x0c, 0x04, 0x0a, 0xfd, 209 | 0x08, 0x03, 0x08, 0xf6, 0xff, 0xfe, 0x03, 0xfb, 0xfb, 0x04, 0xf1, 0xfa, 210 | 0x08, 0xff, 0xee, 0x0a, 0x06, 0xf7, 0x02, 0xfc, 0x02, 0x05, 0x06, 0x01, 211 | 0x06, 0xfb, 0x01, 0xf4, 0xfc, 0x03, 0xff, 0x0b, 0xfe, 0x00, 0x0b, 0xf9, 212 | 0x03, 0xf9, 0x09, 0x0d, 0x08, 0x09, 0x0c, 0x04, 0xfd, 0x01, 0x00, 0x09, 213 | 0x05, 0x07, 0x0a, 0xf8, 0x05, 0x08, 0x04, 0x03, 0x03, 0xff, 0x0a, 0x03, 214 | 0xfb, 0xf5, 0xf9, 0x08, 0xf6, 0x03, 0x04, 0x0a, 0x0b, 0x0b, 0xff, 0x09, 215 | 0xfe, 0xfa, 0x03, 0x0a, 0xfb, 0xfa, 0xfe, 0xfe, 0x0c, 0x07, 0x08, 0xfb, 216 | 0x04, 0xfd, 0xfb, 0x0a, 0xf9, 0x02, 0xf5, 0x00, 0x08, 0xfb, 0x08, 0x09, 217 | 0x0f, 0x03, 0x02, 0x07, 0xfd, 0x02, 0x08, 0xfd, 0xf8, 0xfb, 0xfd, 0x04, 218 | 0x06, 0x0a, 0x01, 0x02, 0x00, 0xfc, 0x07, 0x04, 0xf9, 0xf9, 0xfe, 0x05, 219 | 0xf8, 0x07, 0x02, 0x07, 0xf6, 0x02, 0xff, 0x03, 0x05, 0x03, 0xfd, 0xfd, 220 | 0xff, 0x0b, 0x04, 0xfc, 0xf7, 0x07, 0x07, 0x05, 0x08, 0x0a, 0x09, 0x0c, 221 | 0x02, 0xec, 0x0e, 0xfb, 0xf6, 0xff, 0xf0, 0xfe, 0x01, 0xf9, 0xf7, 0x0c, 222 | 0x0a, 0xeb, 0x0a, 0x04, 0x0d, 0x07, 0xfd, 0xfc, 0xf4, 0xf9, 0x00, 0xf1, 223 | 0x01, 0x09, 0xec, 0xdf, 0x00, 0xfd, 0x07, 0xf1, 0xef, 0xe6, 0xf9, 0xf9, 224 | 0xfd, 0x0b, 0xee, 0xf5, 0x04, 0xff, 0xff, 0x01, 0x0b, 0x09, 0x08, 0x00, 225 | 0x05, 0xff, 0xf0, 0xfd, 0xfe, 0x06, 0x02, 0xef, 0xfa, 0xf9, 0xf0, 0xf8, 226 | 0xeb, 0xf2, 0x14, 0xf6, 0xff, 0xf9, 0xfb, 0xf9, 0x09, 0x07, 0x03, 0x01, 227 | 0xf9, 0xfc, 0xff, 0x0d, 0x04, 0x08, 0xfa, 0x03, 0x00, 0xf9, 0xfb, 0x07, 228 | 0xff, 0x05, 0xf7, 0xf6, 0xf8, 0xfe, 0x03, 0x01, 0x03, 0xfe, 0xf4, 0xfa, 229 | 0x06, 0xfc, 0x01, 0x00, 0xf5, 0xfe, 0xfd, 0x09, 0xf5, 0xf6, 0x05, 0x07, 230 | 0x03, 0x06, 0xf8, 0x07, 0xf9, 0x06, 0x09, 0x0b, 0x01, 0xf8, 0x09, 0xf7, 231 | 0x04, 0x0c, 0x02, 0x00, 0xfd, 0x01, 0x08, 0x05, 0xfd, 0x07, 0xf1, 0x01, 232 | 0xf9, 0xff, 0xff, 0x0a, 0x03, 0xf6, 0x0a, 0xf7, 0x02, 0x05, 0xfd, 0xf4, 233 | 0xf9, 0xfd, 0xf9, 0x00, 0xf5, 0x00, 0x03, 0x04, 0x01, 0xfa, 0x0b, 0xf8, 234 | 0x0b, 0xfd, 0xff, 0xf6, 0xf2, 0xf5, 0x07, 0x06, 0x07, 0xf8, 0xf0, 0xfb, 235 | 0x06, 0x03, 0xf1, 0xf7, 0xff, 0xfb, 0xf9, 0x05, 0x08, 0xf5, 0xfc, 0xfe, 236 | 0xf6, 0x06, 0xf7, 0xf4, 0x07, 0xf9, 0xfa, 0x05, 0x00, 0xee, 0xf5, 0xff, 237 | 0xff, 0xfe, 0xfa, 0x0d, 0x02, 0xfb, 0x02, 0xf4, 0x01, 0xfd, 0xf8, 0x03, 238 | 0x05, 0xfa, 0x07, 0x06, 0x0c, 0xfe, 0x03, 0x04, 0xf9, 0xfa, 0x00, 0x00, 239 | 0xf7, 0x0b, 0x05, 0x00, 0xf9, 0x02, 0x02, 0x01, 0x05, 0x04, 0xf2, 0x03, 240 | 0x06, 0xf9, 0x0a, 0x03, 0x0a, 0x07, 0xf5, 0xfa, 0xff, 0x03, 0x02, 0x00, 241 | 0x00, 0xf7, 0xf9, 0xfa, 0xfc, 0x07, 0x09, 0x09, 0x03, 0xf5, 0x06, 0xfd, 242 | 0x07, 0x0b, 0xf7, 0x02, 0xe6, 0x08, 0xdd, 0xf3, 0xe3, 0xfc, 0xf8, 0xee, 243 | 0x03, 0xfb, 0xf3, 0x11, 0xfb, 0x09, 0x00, 0xf5, 0xec, 0x03, 0xf4, 0x00, 244 | 0x07, 0x05, 0xf8, 0x00, 0xf5, 0xff, 0x07, 0xed, 0x06, 0xfe, 0x1c, 0xec, 245 | 0x04, 0xf8, 0xf0, 0xfc, 0x02, 0x02, 0x08, 0x02, 0xf6, 0xf9, 0x04, 0xf8, 246 | 0xf9, 0x0d, 0xfa, 0xf8, 0x03, 0xfc, 0xfc, 0xfe, 0xd4, 0x04, 0x0b, 0x0d, 247 | 0xf8, 0xea, 0xfb, 0x1b, 0x04, 0xee, 0x09, 0x05, 0x04, 0xf9, 0xf8, 0x0a, 248 | 0xf5, 0x08, 0x15, 0x00, 0x09, 0x09, 0x02, 0x03, 0xfe, 0xfc, 0xfc, 0xfc, 249 | 0xf8, 0xfd, 0x11, 0xf9, 0xf3, 0xf5, 0xf8, 0x00, 0xf9, 0x0c, 0x02, 0x09, 250 | 0x01, 0x0b, 0xef, 0x14, 0x1d, 0xfb, 0x00, 0x04, 0xf8, 0xf1, 0x20, 0x06, 251 | 0xf7, 0xf6, 0x10, 0xf8, 0xf9, 0xeb, 0x04, 0x06, 0x06, 0xf1, 0x05, 0xf3, 252 | 0xef, 0x06, 0x08, 0x01, 0x01, 0xf7, 0xfb, 0x18, 0x15, 0x18, 0x1d, 0x09, 253 | 0x06, 0xf0, 0xfc, 0x04, 0x07, 0xff, 0x0a, 0x09, 0xfe, 0x02, 0xf4, 0x0d, 254 | 0xfd, 0xfe, 0x08, 0x0b, 0x07, 0xfe, 0x03, 0x0b, 0x06, 0xf2, 0x03, 0xf8, 255 | 0x03, 0xfe, 0xf7, 0x03, 0x05, 0x00, 0x00, 0xfd, 0xfe, 0xfd, 0x03, 0x02, 256 | 0x05, 0x00, 0xfd, 0x02, 0xff, 0x00, 0x01, 0xf5, 0xfd, 0xf7, 0x03, 0x02, 257 | 0x04, 0x06, 0xf5, 0x08, 0x07, 0x09, 0xfc, 0x08, 0x00, 0xfc, 0x02, 0xf3, 258 | 0xfd, 0xff, 0x0b, 0x04, 0xdc, 0x12, 0x05, 0x08, 0xf2, 0xff, 0x07, 0xf6, 259 | 0x00, 0xfe, 0x09, 0x03, 0xee, 0xf9, 0x06, 0x09, 0x0c, 0x08, 0x04, 0xf4, 260 | 0x0a, 0x06, 0xfc, 0xfd, 0x05, 0x09, 0x0b, 0x12, 0xfb, 0x08, 0xf3, 0x13, 261 | 0xfe, 0xe4, 0x0f, 0x12, 0x03, 0x05, 0xf9, 0xf3, 0xfe, 0x0a, 0xff, 0xe2, 262 | 0x02, 0xf5, 0x05, 0xef, 0x0c, 0x07, 0xec, 0x07, 0xfc, 0x05, 0xfc, 0x00, 263 | 0xf7, 0x0d, 0x05, 0xf1, 0x0a, 0xfb, 0x09, 0x0e, 0x03, 0x0b, 0x07, 0x08, 264 | 0xf6, 0x0a, 0x02, 0x09, 0x07, 0xfd, 0x03, 0x03, 0x06, 0xfc, 0x01, 0xfc, 265 | 0x0a, 0xf7, 0xf8, 0x07, 0xfb, 0xff, 0xfc, 0xf9, 0xfd, 0xf7, 0x0b, 0x0d, 266 | 0x03, 0xf8, 0xf7, 0xfe, 0xf9, 0x00, 0x03, 0x05, 0x07, 0xf5, 0x0b, 0xf7, 267 | 0xf6, 0x0a, 0x04, 0xf4, 0x02, 0xf6, 0xf9, 0x03, 0xfb, 0x06, 0x07, 0x09, 268 | 0xf9, 0xf9, 0xfc, 0xfb, 0x0a, 0x0a, 0x0d, 0x02, 0xfc, 0xfc, 0xff, 0xf1, 269 | 0x08, 0x09, 0x02, 0xf8, 0x04, 0x00, 0x08, 0xfb, 0x0a, 0x0a, 0xff, 0xf8, 270 | 0x03, 0xfb, 0x01, 0x08, 0x06, 0x01, 0x0b, 0xfa, 0x01, 0xf4, 0x00, 0xfc, 271 | 0xfc, 0xfb, 0x00, 0xfc, 0xfa, 0x07, 0xff, 0xf9, 0x04, 0x0b, 0xfe, 0x05, 272 | 0x03, 0xfa, 0xff, 0xf9, 0xf6, 0xfa, 0xfc, 0xfb, 0x04, 0xff, 0xf8, 0xf6, 273 | 0xfd, 0xfa, 0xff, 0x0a, 0x07, 0x0b, 0x03, 0x07, 0x03, 0xfe, 0x05, 0xfa, 274 | 0x0d, 0x06, 0x01, 0x05, 0xfd, 0x05, 0xff, 0x04, 0x01, 0xf9, 0xfc, 0xfe, 275 | 0xfb, 0x06, 0xf5, 0x0a, 0xf8, 0x02, 0xf6, 0xfd, 0x05, 0x07, 0x08, 0xfd, 276 | 0xf8, 0x0b, 0xff, 0xfd, 0x06, 0x03, 0xfd, 0xfe, 0x06, 0x02, 0xf6, 0xfb, 277 | 0xfa, 0xf9, 0xf8, 0xff, 0xf6, 0xf7, 0xfe, 0x06, 0x05, 0x04, 0xfc, 0x08, 278 | 0x0b, 0x05, 0xf4, 0xf9, 0xf8, 0xf6, 0x0a, 0xfa, 0xfb, 0x04, 0x0b, 0x07, 279 | 0xf5, 0x08, 0xf3, 0x00, 0xf8, 0xfc, 0x01, 0x0b, 0xf7, 0x0f, 0xf2, 0xf5, 280 | 0xf1, 0x05, 0x09, 0x01, 0x01, 0xf9, 0xfa, 0xf5, 0xf4, 0x18, 0xff, 0xef, 281 | 0xfc, 0x01, 0x03, 0xff, 0xf8, 0xfb, 0x04, 0xf3, 0xf8, 0xfe, 0xff, 0xe4, 282 | 0x09, 0xf9, 0xf7, 0xf4, 0xf3, 0xec, 0x01, 0xf5, 0x07, 0x0b, 0xe9, 0x07, 283 | 0xf8, 0xfb, 0x0b, 0xf1, 0xf6, 0xfa, 0xfa, 0xfd, 0x07, 0xf0, 0xf8, 0x00, 284 | 0xf1, 0xfa, 0xf8, 0xfb, 0xf9, 0xf9, 0xf3, 0xfa, 0xfc, 0xf7, 0x06, 0xf3, 285 | 0x01, 0xfa, 0xf3, 0xf5, 0xed, 0xff, 0xf4, 0x02, 0xfb, 0x01, 0xfe, 0xf9, 286 | 0xeb, 0xfc, 0xfd, 0x06, 0x00, 0xfb, 0x07, 0x0b, 0x06, 0xfb, 0xf5, 0xf5, 287 | 0xf6, 0x02, 0x08, 0xee, 0x05, 0x0c, 0xf9, 0xfe, 0xf4, 0xee, 0xe8, 0xfc, 288 | 0xfd, 0x07, 0x08, 0xe7, 0xfd, 0x09, 0xef, 0x16, 0x00, 0x04, 0x00, 0xf5, 289 | 0xfa, 0x01, 0xfc, 0xf8, 0xea, 0x07, 0xfa, 0x06, 0x00, 0xf8, 0xf6, 0x03, 290 | 0x0f, 0xf8, 0x0d, 0xf4, 0xe5, 0xfd, 0x12, 0x01, 0x04, 0xff, 0x06, 0xf8, 291 | 0xf7, 0x04, 0x08, 0xf5, 0x10, 0x12, 0x0f, 0x01, 0xfa, 0xff, 0x10, 0x0b, 292 | 0x03, 0xf5, 0x09, 0xf8, 0xf7, 0x01, 0x08, 0xfc, 0x07, 0xf4, 0xf9, 0xf6, 293 | 0x00, 0x01, 0x0a, 0xfe, 0x01, 0xe3, 0xfa, 0xff, 0x05, 0x04, 0x01, 0x15, 294 | 0x12, 0x16, 0x06, 0xf8, 0x08, 0xf3, 0xec, 0xf7, 0x0b, 0x20, 0xed, 0x13, 295 | 0xee, 0x0b, 0xf6, 0x03, 0x08, 0xf2, 0xfe, 0x08, 0x01, 0x08, 0x05, 0xfe, 296 | 0x07, 0xfd, 0x07, 0x00, 0x05, 0x09, 0x09, 0x0a, 0xf8, 0x00, 0x06, 0xfb, 297 | 0xfc, 0xfc, 0x00, 0xfd, 0x01, 0xfb, 0x06, 0xf9, 0xf8, 0xfd, 0x03, 0xf9, 298 | 0x01, 0x0d, 0x16, 0xf8, 0xf6, 0x07, 0x01, 0x04, 0xfe, 0xff, 0xfe, 0xfd, 299 | 0xf7, 0x01, 0x02, 0x00, 0xf7, 0x00, 0x06, 0x04, 0x07, 0xff, 0x08, 0xfc, 300 | 0x01, 0xf6, 0xf0, 0x0a, 0x09, 0x0a, 0x01, 0x0a, 0xf8, 0xff, 0xf3, 0xff, 301 | 0x05, 0x06, 0x05, 0xf7, 0x09, 0x00, 0x0a, 0xfb, 0xf9, 0x08, 0xfc, 0xf8, 302 | 0x06, 0x00, 0x04, 0xfe, 0x08, 0xf6, 0xf4, 0xfa, 0x06, 0xfe, 0x01, 0x0b, 303 | 0xf8, 0x06, 0xf5, 0x01, 0x08, 0x04, 0x08, 0x01, 0x0a, 0x00, 0x07, 0x09, 304 | 0x09, 0xfc, 0x09, 0x08, 0xfb, 0xf7, 0x06, 0x09, 0xfd, 0xfb, 0x02, 0x04, 305 | 0xfe, 0x04, 0x0d, 0x09, 0xf4, 0xfc, 0x04, 0x0a, 0xfa, 0x08, 0x06, 0x0b, 306 | 0xfc, 0xfa, 0xf6, 0x08, 0xc3, 0xfb, 0x0a, 0x1a, 0x09, 0x10, 0x04, 0x06, 307 | 0x04, 0x10, 0x16, 0xfe, 0xf0, 0x17, 0x10, 0x03, 0xed, 0x0f, 0xf5, 0xf4, 308 | 0x03, 0x0c, 0x11, 0x18, 0x00, 0x13, 0x23, 0x06, 0x06, 0xf2, 0x0f, 0x17, 309 | 0x0e, 0x0f, 0x16, 0xf2, 0xf8, 0x12, 0x1a, 0x02, 0x01, 0x08, 0x00, 0x17, 310 | 0x0a, 0x0c, 0xff, 0xfb, 0x0d, 0xf3, 0x0e, 0xed, 0x05, 0x04, 0x02, 0x01, 311 | 0x0b, 0x07, 0xfa, 0x0d, 0xf3, 0xf8, 0x10, 0x06, 0xf8, 0xf9, 0x03, 0x00, 312 | 0xf6, 0xf9, 0xf7, 0x00, 0x00, 0xfa, 0x09, 0xfa, 0xfb, 0xfa, 0xf2, 0xfe, 313 | 0x05, 0xf9, 0xf5, 0xf5, 0xff, 0xfa, 0x02, 0xf6, 0xfb, 0x03, 0x08, 0xf4, 314 | 0x08, 0xfb, 0xfd, 0xff, 0xf9, 0xf4, 0xf5, 0x09, 0xff, 0xf9, 0x00, 0x08, 315 | 0xfc, 0x02, 0xf7, 0xff, 0x02, 0xfd, 0x0a, 0x01, 0xfd, 0x03, 0x0a, 0xf3, 316 | 0x03, 0x0a, 0xfa, 0x06, 0xf2, 0xfa, 0xfd, 0x09, 0xfe, 0xf5, 0x02, 0x0a, 317 | 0xf5, 0xfb, 0xfa, 0x16, 0xf4, 0xd3, 0x09, 0x00, 0xfb, 0x00, 0x18, 0xfd, 318 | 0x1b, 0xf9, 0x06, 0x04, 0xfc, 0x08, 0xfb, 0xfb, 0x0a, 0x04, 0x01, 0xec, 319 | 0xf5, 0xf3, 0xf8, 0xf5, 0x02, 0xf9, 0x15, 0x01, 0x0a, 0x00, 0x06, 0x02, 320 | 0xf5, 0xfa, 0xf4, 0x0c, 0x06, 0x06, 0xf3, 0x05, 0xf9, 0x0a, 0xf9, 0x08, 321 | 0xfa, 0x04, 0x1a, 0x00, 0xff, 0x0c, 0xea, 0xf2, 0xfe, 0x0a, 0x08, 0xf3, 322 | 0xfc, 0x12, 0x07, 0x0a, 0xfb, 0x04, 0x02, 0x03, 0x03, 0x03, 0x06, 0x09, 323 | 0xfb, 0xf7, 0x08, 0xfa, 0xf3, 0xf9, 0x04, 0xf9, 0x07, 0xf8, 0x07, 0xf9, 324 | 0x01, 0xf2, 0xfa, 0x02, 0xfe, 0x01, 0x07, 0x02, 0x01, 0xfa, 0x01, 0x09, 325 | 0x0b, 0x06, 0x06, 0xfe, 0x00, 0x09, 0x00, 0xf4, 0xfc, 0x0a, 0x04, 0x0b, 326 | 0x09, 0xf4, 0xf4, 0x06, 0xfa, 0xfc, 0x02, 0x0a, 0xfd, 0x02, 0x07, 0x02, 327 | 0x07, 0xfa, 0x04, 0xfa, 0x01, 0x05, 0xf6, 0x03, 0x04, 0x06, 0x0f, 0xfe, 328 | 0xfa, 0x81, 0x01, 0x07, 0x0b, 0xfd, 0x04, 0xf9, 0x07, 0xfb, 0x07, 0xf8, 329 | 0x0f, 0x01, 0x05, 0xf7, 0xf6, 0x08, 0x08, 0x0c, 0xf6, 0xfa, 0x06, 0x17, 330 | 0xfc, 0x0b, 0xff, 0xeb, 0xe8, 0x03, 0x03, 0x0e, 0x05, 0x11, 0xd8, 0xf5, 331 | 0x04, 0x00, 0x0a, 0xfc, 0x02, 0x09, 0xfe, 0xf8, 0xf0, 0xfb, 0xe0, 0xff, 332 | 0xef, 0x02, 0x10, 0xf5, 0x04, 0xff, 0xf6, 0xf5, 0xff, 0x0a, 0x0b, 0xfb, 333 | 0xe1, 0xf6, 0x02, 0xf4, 0xff, 0xea, 0x0c, 0xe7, 0xfa, 0x04, 0x02, 0x04, 334 | 0xf3, 0x05, 0xfb, 0x05, 0xe8, 0x13, 0xec, 0x1b, 0x0e, 0x0a, 0xfc, 0xf6, 335 | 0x01, 0xfe, 0x0d, 0xb7, 0x0b, 0xf9, 0x12, 0xce, 0xe5, 0xcf, 0x07, 0xfe, 336 | 0x02, 0xfa, 0x09, 0xfc, 0xfa, 0x0a, 0xf0, 0x02, 0x0b, 0xf4, 0xff, 0x08, 337 | 0x0d, 0x0a, 0x12, 0xe9, 0x0a, 0x09, 0xf5, 0xf9, 0x0c, 0xfc, 0xfd, 0x13, 338 | 0x10, 0xe2, 0x1a, 0xf4, 0xfb, 0x05, 0x06, 0xff, 0x04, 0x04, 0xf7, 0xf4, 339 | 0x07, 0xf5, 0x07, 0x03, 0xf8, 0x05, 0xed, 0x03, 0xf9, 0x0b, 0xf8, 0xfb, 340 | 0xf7, 0x03, 0x00, 0x06, 0xf4, 0xe3, 0xf3, 0xfe, 0xf8, 0x0f, 0xfb, 0xee, 341 | 0x06, 0x05, 0x0c, 0xf7, 0x04, 0x02, 0xfd, 0xff, 0xf5, 0x01, 0xff, 0xe4, 342 | 0x01, 0xfc, 0xf8, 0xf9, 0xfb, 0xfa, 0xf9, 0xf9, 0xf7, 0xf3, 0x06, 0xf2, 343 | 0x04, 0x06, 0xfd, 0xea, 0x02, 0x06, 0xfd, 0x00, 0xf1, 0xf9, 0xf6, 0xe9, 344 | 0xca, 0xe3, 0x02, 0xfa, 0xf5, 0xf5, 0x18, 0x07, 0x03, 0x04, 0xf0, 0xff, 345 | 0xe9, 0x00, 0x08, 0xe4, 0x08, 0x05, 0x05, 0xf8, 0x07, 0x01, 0x03, 0xbb, 346 | 0xf7, 0xf8, 0x04, 0x0f, 0xe3, 0x00, 0xf9, 0xec, 0x05, 0xc5, 0xf4, 0xfa, 347 | 0x05, 0x03, 0xf2, 0xee, 0x0a, 0xea, 0xfd, 0x0d, 0xfa, 0x05, 0xd6, 0x02, 348 | 0xf5, 0xfb, 0x15, 0xf3, 0xf9, 0xff, 0x09, 0xfa, 0xf1, 0xf5, 0x08, 0x07, 349 | 0x21, 0x03, 0x05, 0xf9, 0xff, 0xff, 0xfa, 0xf8, 0xfd, 0x07, 0xfd, 0x06, 350 | 0x07, 0xf1, 0xfb, 0x07, 0xf7, 0xee, 0x0a, 0x15, 0x0d, 0xf9, 0x08, 0x10, 351 | 0x05, 0x07, 0xfd, 0xfd, 0x02, 0xfc, 0xfa, 0x0b, 0xf0, 0xf5, 0xf8, 0xfd, 352 | 0xfe, 0xe9, 0x0a, 0x0d, 0x01, 0xfb, 0xfb, 0x08, 0xf6, 0xfc, 0x05, 0x10, 353 | 0x09, 0xf9, 0x06, 0xe7, 0x02, 0x11, 0x09, 0x11, 0x15, 0x08, 0xf3, 0x19, 354 | 0x0a, 0x05, 0xfe, 0x00, 0xfe, 0xee, 0xfa, 0x16, 0xf8, 0xd7, 0xf2, 0x02, 355 | 0xff, 0x04, 0x08, 0x05, 0xfb, 0xff, 0xf9, 0x10, 0x08, 0x18, 0x09, 0x05, 356 | 0x0b, 0x0b, 0xf6, 0x06, 0x09, 0xfe, 0x0e, 0xfe, 0x0a, 0xf8, 0x01, 0xfe, 357 | 0x11, 0xf9, 0x02, 0xfa, 0xff, 0xf2, 0xef, 0xf5, 0xf6, 0x06, 0xf9, 0x02, 358 | 0xf7, 0x0a, 0xf9, 0x0c, 0x03, 0x04, 0x17, 0xff, 0xfa, 0x0e, 0xf8, 0xf6, 359 | 0xfc, 0xfe, 0xfe, 0xfd, 0x0a, 0x06, 0xfc, 0x02, 0xfd, 0x0b, 0x0a, 0xf7, 360 | 0xfd, 0x01, 0x0b, 0x03, 0x06, 0x00, 0x0c, 0xfc, 0xfe, 0xf4, 0x06, 0xf2, 361 | 0x09, 0xf9, 0xfa, 0x07, 0x0a, 0x06, 0x09, 0xfb, 0x0c, 0x04, 0x05, 0xff, 362 | 0xfb, 0x11, 0x05, 0xf7, 0xf5, 0x03, 0xfc, 0x07, 0xfe, 0x00, 0x04, 0x01, 363 | 0xfb, 0x09, 0x04, 0x01, 0x01, 0x06, 0x09, 0x08, 0x07, 0x04, 0xda, 0x0b, 364 | 0x06, 0x0a, 0x06, 0x09, 0x07, 0x0a, 0xfe, 0xfb, 0xff, 0x01, 0xf5, 0x09, 365 | 0x04, 0x03, 0x08, 0xf0, 0x07, 0xf9, 0xf6, 0xfa, 0x06, 0x0c, 0x15, 0xfb, 366 | 0xfe, 0x19, 0xff, 0x05, 0xf6, 0xe5, 0xfd, 0xf0, 0xfe, 0xff, 0x01, 0x0e, 367 | 0xf8, 0x10, 0x09, 0xf4, 0x09, 0xea, 0xf4, 0xff, 0x03, 0xf7, 0x00, 0x06, 368 | 0x04, 0xfe, 0xfc, 0xfb, 0xfc, 0xfa, 0x13, 0xf9, 0x08, 0x0b, 0xfe, 0x0b, 369 | 0xfe, 0x01, 0x05, 0xed, 0x11, 0xf8, 0x1e, 0xfe, 0x03, 0x09, 0xf3, 0x0f, 370 | 0x0b, 0xf9, 0x01, 0x00, 0xf4, 0xfe, 0xf8, 0x0a, 0xf8, 0x04, 0x10, 0xf3, 371 | 0xf9, 0x08, 0x06, 0xf9, 0xfc, 0x03, 0x06, 0x01, 0x00, 0x17, 0x09, 0x1b, 372 | 0xec, 0xfd, 0xfe, 0xfa, 0xfc, 0x0b, 0x1e, 0xfa, 0x05, 0xf9, 0x05, 0x28, 373 | 0xf3, 0xfe, 0xf4, 0xfa, 0x0a, 0x08, 0x02, 0x0c, 0x03, 0x07, 0x1c, 0x04, 374 | 0x05, 0xf7, 0xfb, 0xf3, 0x06, 0xf3, 0x06, 0x00, 0xf6, 0x12, 0x01, 0xf1, 375 | 0x01, 0xfc, 0xf7, 0x01, 0xf5, 0x0a, 0x04, 0x05, 0xfa, 0xfb, 0xfa, 0x02, 376 | 0x00, 0x08, 0x09, 0xff, 0xf7, 0x03, 0x07, 0xff, 0x03, 0x0b, 0x07, 0x00, 377 | 0xfa, 0xf3, 0xff, 0x0b, 0xfb, 0x00, 0x0a, 0x08, 0xff, 0x00, 0x08, 0x03, 378 | 0x03, 0xf0, 0xff, 0x05, 0xff, 0x00, 0x0a, 0x09, 0xff, 0x0d, 0x0c, 0x02, 379 | 0x02, 0x09, 0x0a, 0x05, 0x06, 0x0e, 0xfb, 0x06, 0xfd, 0xfb, 0xfc, 0x06, 380 | 0x0c, 0x08, 0xfc, 0x0c, 0x06, 0x05, 0x0a, 0xfa, 0x07, 0x08, 0x00, 0xf7, 381 | 0xfa, 0xf7, 0x03, 0x07, 0x0d, 0x01, 0x03, 0xfd, 0xf9, 0xfe, 0xfc, 0x07, 382 | 0x01, 0xf7, 0xf4, 0xf4, 0x01, 0xf8, 0xf6, 0x09, 0xfc, 0xfa, 0x0b, 0x08, 383 | 0xfc, 0xeb, 0x02, 0x08, 0xff, 0xfb, 0x04, 0x0c, 0x04, 0xf3, 0xe6, 0x00, 384 | 0xfa, 0x05, 0xfa, 0x07, 0xff, 0x07, 0xff, 0x15, 0xf3, 0x04, 0x08, 0xef, 385 | 0xfb, 0xea, 0xfd, 0x0a, 0x00, 0x0e, 0xee, 0x06, 0x04, 0x02, 0x06, 0x01, 386 | 0xeb, 0xfa, 0xf7, 0x09, 0xf7, 0xf5, 0x06, 0x0c, 0xf3, 0x05, 0x04, 0x05, 387 | 0x09, 0xfd, 0xf7, 0xf8, 0xf5, 0x09, 0xf2, 0x01, 0xfb, 0x05, 0x11, 0x00, 388 | 0x05, 0xfc, 0xe5, 0x06, 0xfc, 0xf6, 0xf8, 0x05, 0x00, 0xfb, 0x0b, 0xfd, 389 | 0x11, 0xfc, 0x00, 0x01, 0x00, 0x0a, 0x03, 0xf8, 0xfd, 0xf8, 0xfe, 0xfe, 390 | 0x0b, 0x11, 0x01, 0xee, 0xfe, 0xfd, 0x10, 0x00, 0xec, 0x01, 0x02, 0xff, 391 | 0x02, 0xfc, 0xf2, 0x08, 0xf5, 0xff, 0x19, 0xf7, 0xfe, 0xff, 0xff, 0xf9, 392 | 0xfe, 0xf8, 0x09, 0xf5, 0x03, 0x03, 0xfe, 0xf8, 0x06, 0x0a, 0xfb, 0xfc, 393 | 0xfc, 0x08, 0xff, 0x01, 0xf9, 0xff, 0xfe, 0xfb, 0x00, 0xf5, 0x02, 0xff, 394 | 0x04, 0x0a, 0x05, 0xff, 0x00, 0xf7, 0x03, 0x01, 0x06, 0x03, 0xf4, 0xfc, 395 | 0x02, 0xfa, 0x09, 0x04, 0xf8, 0xfb, 0x00, 0xff, 0xf8, 0x06, 0xff, 0xfd, 396 | 0x05, 0xfd, 0x00, 0x01, 0x00, 0xfc, 0xf7, 0x0a, 0x06, 0x04, 0xf8, 0xf7, 397 | 0x05, 0x01, 0xfd, 0xe9, 0x01, 0x06, 0x0a, 0x0a, 0xf9, 0x04, 0xfd, 0x03, 398 | 0xf8, 0xfb, 0x03, 0xfe, 0xfd, 0xf7, 0xff, 0xfb, 0x03, 0xff, 0xfe, 0xff, 399 | 0x04, 0xf7, 0x07, 0x05, 0x0a, 0xff, 0x0b, 0x0c, 0xfe, 0xfd, 0x04, 0xfb, 400 | 0xf8, 0x00, 0x09, 0xfe, 0x00, 0x04, 0xfc, 0x09, 0xf6, 0x09, 0xfd, 0xff, 401 | 0xfc, 0xfa, 0x0d, 0x06, 0x08, 0xf8, 0xfd, 0x02, 0x09, 0x07, 0xff, 0x09, 402 | 0x02, 0x08, 0xfb, 0xf9, 0x07, 0xe5, 0x08, 0xf0, 0xfe, 0x10, 0xfb, 0xf9, 403 | 0x09, 0x02, 0xff, 0xf6, 0xff, 0xe2, 0xfe, 0x07, 0xfa, 0xf8, 0x01, 0xfa, 404 | 0x02, 0x1e, 0x08, 0xfe, 0x05, 0xf8, 0xfa, 0xd3, 0x06, 0x0c, 0x16, 0xfb, 405 | 0xf3, 0x01, 0xee, 0xf7, 0xf4, 0xee, 0xe3, 0xf0, 0x0b, 0xf4, 0x03, 0xf9, 406 | 0xf6, 0xfd, 0x05, 0x07, 0xfb, 0x09, 0xdb, 0xf9, 0x0c, 0x04, 0x05, 0x06, 407 | 0x0b, 0xec, 0xf6, 0xf6, 0x08, 0xf0, 0x0a, 0xfe, 0x00, 0x00, 0x00, 0x00, 408 | 0xbe, 0xf8, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 409 | 0xe2, 0xf2, 0xf9, 0xe9, 0xf9, 0xef, 0xe2, 0xfe, 0xf7, 0xf7, 0xef, 0x42, 410 | 0xff, 0x40, 0x45, 0xe5, 0xe3, 0xf8, 0xf7, 0xd1, 0x2b, 0x16, 0x0e, 0xe7, 411 | 0xde, 0x02, 0xec, 0xfa, 0x0a, 0x0e, 0xda, 0xdc, 0xf4, 0xfd, 0xf9, 0xe5, 412 | 0xd2, 0xf6, 0x0c, 0x29, 0xfe, 0xf8, 0x04, 0x06, 0xfa, 0xd5, 0xf8, 0xe1, 413 | 0x3b, 0x0f, 0xc4, 0xed, 0xf6, 0xea, 0x24, 0xc6, 0x02, 0x0a, 0xfa, 0xb4, 414 | 0xcc, 0x24, 0xe8, 0x02, 0xda, 0xf7, 0xe8, 0x08, 0xe1, 0xf4, 0x04, 0xd3, 415 | 0x02, 0x0c, 0x18, 0xf6, 0x14, 0xd9, 0x09, 0xe4, 0xbc, 0x12, 0x15, 0x18, 416 | 0x0a, 0x0a, 0x0a, 0x06, 0x00, 0x0b, 0x13, 0x00, 0x04, 0x04, 0x05, 0xb7, 417 | 0xe9, 0xeb, 0xf9, 0xf2, 0xf4, 0xeb, 0xe3, 0x26, 0x37, 0xe5, 0xfc, 0xfd, 418 | 0xfa, 0xe8, 0xe7, 0xed, 0xff, 0xef, 0xd9, 0xe4, 0xfa, 0xdb, 0xf7, 0xfc, 419 | 0xeb, 0x0f, 0xfb, 0xf6, 0xfe, 0x0f, 0xfd, 0x11, 0xfc, 0xd9, 0xf6, 0x11, 420 | 0x0f, 0xda, 0xef, 0x1e, 0xea, 0xe0, 0x2f, 0xfd, 0xe9, 0xf9, 0xf5, 0xd5, 421 | 0xde, 0x06, 0xf8, 0xe8, 0xd0, 0x1b, 0xd3, 0xd7, 0x23, 0x22, 0x19, 0xd0, 422 | 0xd7, 0xf4, 0x1f, 0xd4, 0x01, 0x22, 0xc5, 0xe1, 0xd5, 0x0f, 0xfc, 0xd9, 423 | 0x26, 0xf2, 0xee, 0xb4, 0xef, 0xdb, 0xee, 0x23, 0x06, 0xf3, 0x2b, 0x04, 424 | 0x2a, 0xdc, 0xd1, 0xe2, 0xdc, 0xf8, 0x2f, 0xef, 0xe2, 0xd9, 0xc6, 0xf9, 425 | 0xee, 0xfc, 0xd6, 0xdd, 0xfd, 0xf6, 0xe8, 0xbf, 0xcd, 0x0e, 0xd9, 0x13, 426 | 0xe9, 0xeb, 0x0e, 0x29, 0x1e, 0x09, 0xe9, 0xc5, 0xf6, 0x0f, 0xcf, 0xdd, 427 | 0x2a, 0x24, 0x1f, 0xc7, 0xce, 0xdd, 0xe1, 0xd4, 0xfd, 0xe8, 0xdf, 0xf8, 428 | 0xd9, 0x12, 0x15, 0x24, 0xe7, 0x06, 0xf9, 0xc6, 0xfe, 0xfd, 0x07, 0xed, 429 | 0xf5, 0x0b, 0xe3, 0xee, 0xd5, 0x0d, 0x0d, 0x0f, 0xec, 0xed, 0xee, 0xf6, 430 | 0xf5, 0xd3, 0x16, 0x13, 0xe6, 0xf0, 0xc8, 0xce, 0xec, 0xfd, 0xee, 0xe0, 431 | 0xfd, 0xde, 0x0d, 0x0e, 0x08, 0xf5, 0x1e, 0x02, 0xc9, 0x24, 0x2c, 0xdb, 432 | 0xdb, 0xde, 0x11, 0x02, 0xea, 0xdc, 0xdc, 0xed, 0xde, 0x12, 0xf4, 0x19, 433 | 0xc9, 0x19, 0xfd, 0x22, 0x13, 0xe8, 0xaf, 0xfd, 0xfa, 0xe6, 0xeb, 0x16, 434 | 0xfc, 0xd3, 0x08, 0xdc, 0x06, 0xd0, 0x1d, 0xf8, 0x29, 0x18, 0xc7, 0xdb, 435 | 0xed, 0xe6, 0x18, 0xd7, 0x04, 0xd9, 0x16, 0xca, 0xf7, 0xd4, 0xfc, 0x02, 436 | 0xf9, 0xea, 0x14, 0xe8, 0xf0, 0xe1, 0xf0, 0xe7, 0xd9, 0x1b, 0xf6, 0x23, 437 | 0x30, 0xd6, 0xc2, 0xbc, 0xe2, 0xd3, 0xef, 0x1a, 0x11, 0x05, 0x03, 0xfc, 438 | 0xee, 0x11, 0x1f, 0xcd, 0x02, 0xea, 0xdb, 0x19, 0xeb, 0xe2, 0x19, 0xc9, 439 | 0x04, 0x09, 0x1c, 0x03, 0x03, 0xf5, 0xbd, 0xf2, 0x00, 0xed, 0x01, 0xd5, 440 | 0xfa, 0xfc, 0xfc, 0x11, 0xd4, 0x20, 0xde, 0xf6, 0x26, 0xd6, 0x1f, 0xc0, 441 | 0xe7, 0xd5, 0xfa, 0xd7, 0x0a, 0xe7, 0x28, 0xe9, 0x01, 0xd5, 0x14, 0xe9, 442 | 0xfb, 0xfe, 0xd6, 0xf2, 0xca, 0xdb, 0x18, 0xe4, 0xf3, 0x1f, 0xf2, 0x0b, 443 | 0xc7, 0x07, 0xe5, 0xd6, 0xfc, 0xc1, 0x17, 0x05, 0xda, 0xde, 0xe9, 0x01, 444 | 0xb8, 0x0d, 0xfa, 0x31, 0x0d, 0x01, 0x26, 0xfb, 0xdd, 0xbd, 0xf0, 0x11, 445 | 0x0c, 0x1d, 0x14, 0xc8, 0x08, 0xc4, 0x0c, 0xfe, 0x0d, 0x16, 0x04, 0x01, 446 | 0x00, 0x01, 0xfe, 0xfc, 0x0f, 0xec, 0xed, 0x14, 0xd6, 0x06, 0xe2, 0x24, 447 | 0xd7, 0xea, 0xe4, 0xee, 0x12, 0x02, 0xd0, 0x04, 0xfd, 0xf4, 0xd0, 0xb8, 448 | 0xba, 0x14, 0x16, 0xbe, 0xfb, 0xf0, 0xf4, 0xfd, 0xe6, 0x18, 0x03, 0xe1, 449 | 0x26, 0x1a, 0x02, 0xef, 0x0f, 0xdc, 0xbb, 0x17, 0xf2, 0xb6, 0xd8, 0xe6, 450 | 0xd4, 0xfa, 0xf0, 0x13, 0xfe, 0xef, 0xeb, 0xee, 0xed, 0xef, 0x38, 0xed, 451 | 0x06, 0xc3, 0x0d, 0xfa, 0x19, 0x2e, 0xb6, 0xf2, 0xef, 0xbd, 0x05, 0x16, 452 | 0xf6, 0xe4, 0xe2, 0x02, 0xf8, 0x12, 0xcf, 0xc9, 0x1d, 0xda, 0x28, 0x18, 453 | 0x0f, 0xdf, 0xde, 0xe9, 0x0e, 0xfb, 0x0b, 0x08, 0x0b, 0x0e, 0x23, 0xfe, 454 | 0x09, 0x06, 0x06, 0x0e, 0x12, 0xf8, 0xc8, 0xee, 0x81, 0xc3, 0xd7, 0xe1, 455 | 0xf4, 0xed, 0x22, 0xe0, 0x09, 0xf5, 0x0e, 0x0d, 0xd5, 0x0b, 0xf0, 0xf2, 456 | 0xcb, 0xca, 0xd7, 0xe9, 0x1d, 0x03, 0xc0, 0x1a, 0xf0, 0xf5, 0x0c, 0xf8, 457 | 0xf2, 0x0c, 0x12, 0xe1, 0xe7, 0xed, 0xd5, 0xfb, 0x2e, 0xef, 0xf3, 0xd4, 458 | 0xd8, 0x17, 0xf0, 0x0e, 0x03, 0x10, 0x0e, 0xfd, 0x05, 0xfb, 0xaf, 0x05, 459 | 0x08, 0x08, 0x0b, 0x07, 0x00, 0xfd, 0xf8, 0xf8, 0xc1, 0xee, 0xe0, 0xdd, 460 | 0x27, 0xfa, 0xeb, 0xfe, 0xf3, 0xe8, 0xde, 0xb0, 0x0a, 0x24, 0x28, 0x3c, 461 | 0xf7, 0x22, 0x0a, 0xe7, 0xf7, 0xf1, 0xe8, 0xe6, 0xed, 0xf0, 0xeb, 0x0f, 462 | 0xff, 0xfa, 0xde, 0xe9, 0x07, 0x1c, 0xd7, 0xeb, 0x12, 0xe9, 0xee, 0xdc, 463 | 0x06, 0xe7, 0xd2, 0x01, 0x00, 0x16, 0xdc, 0xd6, 0xdc, 0xf0, 0xf0, 0xee, 464 | 0xf4, 0x2c, 0x09, 0x00, 0xf8, 0xda, 0xde, 0x09, 0xe2, 0x07, 0xd9, 0xfc, 465 | 0xd0, 0xfc, 0x0f, 0x0b, 0x02, 0x10, 0xbc, 0x0e, 0xfb, 0x04, 0x14, 0xf5, 466 | 0xdf, 0xf1, 0xf2, 0xd0, 0x07, 0xa2, 0x27, 0x07, 0x02, 0x10, 0xf0, 0xd2, 467 | 0xf5, 0x16, 0xfc, 0xd8, 0xce, 0xc8, 0xf7, 0x14, 0xd9, 0xe3, 0xf2, 0x12, 468 | 0xe8, 0xfe, 0xfb, 0x15, 0xcf, 0x20, 0x15, 0xf9, 0xdd, 0xf3, 0xf4, 0xd2, 469 | 0x2d, 0xf0, 0xcf, 0xe2, 0x23, 0xde, 0x15, 0xeb, 0xdd, 0xf7, 0x0a, 0xf7, 470 | 0xbb, 0xf1, 0x06, 0xeb, 0x1e, 0xde, 0xdf, 0xd1, 0x09, 0xfd, 0x02, 0xd1, 471 | 0x1a, 0x03, 0x05, 0xde, 0x03, 0xf9, 0xef, 0xd1, 0x11, 0xd9, 0xf8, 0xdd, 472 | 0xf7, 0x0d, 0x22, 0xe4, 0x08, 0xe6, 0xd5, 0xf0, 0xe9, 0xcb, 0x24, 0x11, 473 | 0xd3, 0xef, 0xee, 0xec, 0xf9, 0x0e, 0xf5, 0x0b, 0x03, 0xdd, 0xeb, 0xfc, 474 | 0xd7, 0x0e, 0x07, 0xf6, 0xf6, 0x08, 0xe7, 0xe6, 0x08, 0xeb, 0x19, 0x09, 475 | 0xe1, 0xda, 0xdf, 0xde, 0x14, 0xf6, 0x1a, 0xea, 0x05, 0xd3, 0xc3, 0xdb, 476 | 0x1d, 0xf6, 0xed, 0x2e, 0x06, 0xf0, 0x0a, 0xb5, 0x22, 0xf8, 0xf2, 0xfd, 477 | 0xf5, 0x05, 0xd7, 0xf3, 0x01, 0x00, 0x06, 0xf8, 0xee, 0x07, 0xe9, 0x01, 478 | 0xdb, 0x01, 0x0b, 0x0c, 0xe3, 0xf5, 0xea, 0xf0, 0xf5, 0xed, 0xf6, 0xf2, 479 | 0xde, 0x15, 0x2d, 0xf7, 0x29, 0xdd, 0xe6, 0xec, 0x15, 0xe8, 0xbc, 0x1c, 480 | 0xcb, 0x1b, 0xff, 0x12, 0xe1, 0x20, 0xd6, 0xf2, 0x1b, 0xed, 0xd2, 0xe6, 481 | 0xfb, 0xfb, 0xee, 0x00, 0xea, 0xd0, 0x0a, 0xb3, 0x85, 0xe7, 0xb6, 0x1a, 482 | 0x20, 0x0a, 0xe2, 0xc8, 0xed, 0xdf, 0x2a, 0x27, 0x06, 0x04, 0xf8, 0xdc, 483 | 0xe8, 0xe2, 0xf0, 0xf6, 0xe7, 0xfb, 0x16, 0xcd, 0x1e, 0x28, 0x13, 0xec, 484 | 0xdf, 0xeb, 0xe9, 0xfd, 0xe3, 0xea, 0xe2, 0xe6, 0x19, 0xe4, 0xe2, 0xe6, 485 | 0x23, 0xba, 0x00, 0xde, 0xd3, 0xd1, 0xd8, 0x06, 0xfa, 0xfb, 0x08, 0x1c, 486 | 0xf7, 0xf2, 0xf7, 0xe3, 0x1b, 0x0f, 0x0d, 0x1a, 0xfd, 0x13, 0x14, 0xfe, 487 | 0xff, 0xfd, 0xf9, 0xff, 0xfc, 0xfc, 0xfc, 0x1c, 0x1e, 0x07, 0x20, 0xd8, 488 | 0xd6, 0xcb, 0x1d, 0x0f, 0x22, 0xef, 0xd0, 0xd3, 0xff, 0xf8, 0xf2, 0xa8, 489 | 0x24, 0x08, 0xef, 0xed, 0xd8, 0xfd, 0x26, 0x00, 0xda, 0xd5, 0x0a, 0xdb, 490 | 0xd8, 0xf4, 0xef, 0xc6, 0x0d, 0xdd, 0xde, 0xcd, 0xf1, 0xde, 0xf9, 0x16, 491 | 0x11, 0xfd, 0xd9, 0xff, 0x0d, 0xef, 0xf2, 0xfa, 0x20, 0x17, 0xc8, 0xc9, 492 | 0x14, 0xbb, 0xc7, 0x24, 0xe9, 0xe2, 0xea, 0x11, 0xd8, 0xfe, 0x05, 0xe6, 493 | 0xea, 0xf9, 0xf6, 0x08, 0xd5, 0xfb, 0xcc, 0xfe, 0xe1, 0x15, 0x0a, 0x11, 494 | 0x1b, 0xf9, 0xc4, 0xf9, 0x00, 0x00, 0x00, 0x00, 0xce, 0xfc, 0xff, 0xff, 495 | 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 496 | 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 497 | 0x00, 0x00, 0x00, 0x00, 0xee, 0xfc, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 498 | 0x08, 0x00, 0x00, 0x00, 0x22, 0x0e, 0x00, 0x00, 0xde, 0xf1, 0xff, 0xff, 499 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 500 | 0x0e, 0xfd, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 501 | 0x1f, 0x02, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x05, 0x02, 0x00, 0x00, 502 | 0xf4, 0xff, 0xff, 0xff, 0xf1, 0xfd, 0xff, 0xff, 0xf2, 0xff, 0xff, 0xff, 503 | 0x20, 0xfe, 0xff, 0xff, 0x2c, 0x00, 0x00, 0x00, 0xeb, 0xff, 0xff, 0xff, 504 | 0xf8, 0x01, 0x00, 0x00, 0xf1, 0xff, 0xff, 0xff, 0x25, 0xfe, 0xff, 0xff, 505 | 0x07, 0xfe, 0xff, 0xff, 0xdc, 0x01, 0x00, 0x00, 0x46, 0xff, 0xff, 0xff, 506 | 0xfd, 0xff, 0xff, 0xff, 0xe7, 0x01, 0x00, 0x00, 0xfe, 0x01, 0x00, 0x00, 507 | 0x9e, 0xff, 0xff, 0xff, 0x82, 0xff, 0xff, 0xff, 0x79, 0xff, 0xff, 0xff, 508 | 0xfc, 0x01, 0x00, 0x00, 0x06, 0x02, 0x00, 0x00, 0xc8, 0xff, 0xff, 0xff, 509 | 0x09, 0xfe, 0xff, 0xff, 0x05, 0xfe, 0xff, 0xff, 0xce, 0xff, 0xff, 0xff, 510 | 0xfb, 0xfd, 0xff, 0xff, 0xf5, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 511 | 0xf4, 0x01, 0x00, 0x00, 0xf6, 0xff, 0xff, 0xff, 0xf7, 0x01, 0x00, 0x00, 512 | 0x97, 0x00, 0x00, 0x00, 0xcd, 0xff, 0xff, 0xff, 0xfb, 0x01, 0x00, 0x00, 513 | 0x04, 0xff, 0xff, 0xff, 0x09, 0xfe, 0xff, 0xff, 0x06, 0xfe, 0xff, 0xff, 514 | 0xfd, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0xf9, 0xff, 0xff, 0xff, 515 | 0x69, 0xff, 0xff, 0xff, 0xf6, 0x01, 0x00, 0x00, 0xdd, 0xfd, 0xff, 0xff, 516 | 0x13, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0x63, 0xfe, 0xff, 0xff, 517 | 0xf8, 0xfd, 0xff, 0xff, 0xa3, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, 518 | 0xf8, 0x01, 0x00, 0x00, 0x31, 0x01, 0x00, 0x00, 0xd0, 0xff, 0xff, 0xff, 519 | 0x71, 0xff, 0xff, 0xff, 0x09, 0x02, 0x00, 0x00, 0xc3, 0xff, 0xff, 0xff, 520 | 0xc4, 0xff, 0xff, 0xff, 0xf5, 0xfd, 0xff, 0xff, 0x4a, 0xfe, 0xff, 0xff, 521 | 0xe7, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x0e, 0x02, 0x00, 0x00, 522 | 0x82, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xfe, 0xff, 0xff, 523 | 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x62, 0xfc, 0xff, 0xff, 524 | 0xed, 0xff, 0xff, 0xff, 0x14, 0xfd, 0xff, 0xff, 0x9a, 0xff, 0xff, 0xff, 525 | 0x40, 0x01, 0x00, 0x00, 0x2a, 0xfc, 0xff, 0xff, 0x2f, 0xfe, 0xff, 0xff, 526 | 0x64, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xf3, 0xff, 0xff, 0xff, 527 | 0x9b, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 528 | 0xfa, 0xff, 0xff, 0xff, 0x55, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 529 | 0xf8, 0x00, 0x00, 0x00, 0xe5, 0xfe, 0xff, 0xff, 0x7d, 0xff, 0xff, 0xff, 530 | 0xe1, 0xff, 0xff, 0xff, 0x69, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 531 | 0xbc, 0xff, 0xff, 0xff, 0x55, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 532 | 0x99, 0xff, 0xff, 0xff, 0x65, 0xff, 0xff, 0xff, 0x35, 0xfc, 0xff, 0xff, 533 | 0xfa, 0xff, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 534 | 0x6e, 0xff, 0xff, 0xff, 0x94, 0xfe, 0xff, 0xff, 0x4b, 0xfb, 0xff, 0xff, 535 | 0x4c, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 536 | 0xae, 0xfc, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0xb7, 0x00, 0x00, 0x00, 537 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd7, 0xff, 0xff, 0xff, 538 | 0x00, 0x00, 0x00, 0x00, 0xf5, 0xff, 0xff, 0xff, 0x6e, 0x00, 0x00, 0x00, 539 | 0x07, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, 0x97, 0x01, 0x00, 0x00, 540 | 0xbd, 0x01, 0x00, 0x00, 0x49, 0xff, 0xff, 0xff, 0x59, 0xfc, 0xff, 0xff, 541 | 0x93, 0xff, 0xff, 0xff, 0xde, 0xff, 0xff, 0xff, 0x14, 0x00, 0x00, 0x00, 542 | 0xda, 0xff, 0xff, 0xff, 0x39, 0xfd, 0xff, 0xff, 0x39, 0x00, 0x00, 0x00, 543 | 0x2b, 0xfc, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xbe, 0x00, 0x00, 0x00, 544 | 0x19, 0x02, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0xc6, 0xff, 0xff, 0xff, 545 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 546 | 0x74, 0xf8, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 547 | 0x00, 0x00, 0x00, 0x00, 0x84, 0xf8, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 548 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 549 | 0x4d, 0x4c, 0x49, 0x52, 0x20, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 550 | 0x65, 0x64, 0x2e, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 551 | 0x00, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0c, 0x00, 552 | 0x10, 0x00, 0x14, 0x00, 0x0e, 0x00, 0x00, 0x00, 0xcc, 0x01, 0x00, 0x00, 553 | 0xc0, 0x01, 0x00, 0x00, 0xb4, 0x01, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 554 | 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 555 | 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00, 556 | 0x48, 0x01, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, 557 | 0x64, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 558 | 0xae, 0xfe, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 559 | 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 560 | 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x4a, 0xff, 0xff, 0xff, 561 | 0x00, 0x00, 0x00, 0x09, 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 562 | 0x18, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 563 | 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 564 | 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 565 | 0x0b, 0x00, 0x00, 0x00, 0xca, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x08, 566 | 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 567 | 0x04, 0x00, 0x00, 0x00, 0x74, 0xf9, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 568 | 0x0b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 569 | 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 570 | 0x18, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x07, 0x00, 0x14, 0x00, 571 | 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 572 | 0x1c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 573 | 0xb6, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 574 | 0x0a, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 575 | 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 576 | 0x1a, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x07, 0x00, 0x14, 0x00, 577 | 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 578 | 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 579 | 0x00, 0x00, 0x06, 0x00, 0x08, 0x00, 0x07, 0x00, 0x06, 0x00, 0x00, 0x00, 580 | 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 581 | 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 582 | 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x0c, 0x00, 0x00, 0x00, 583 | 0x04, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 584 | 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 585 | 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 586 | 0x00, 0x00, 0x0a, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0c, 0x00, 587 | 0x0a, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 588 | 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 589 | 0x01, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 590 | 0x0e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 591 | 0x0f, 0x00, 0x00, 0x00, 0x38, 0x07, 0x00, 0x00, 0x9c, 0x06, 0x00, 0x00, 592 | 0x0c, 0x06, 0x00, 0x00, 0x90, 0x05, 0x00, 0x00, 0x44, 0x05, 0x00, 0x00, 593 | 0xc8, 0x04, 0x00, 0x00, 0x44, 0x04, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 594 | 0x2c, 0x03, 0x00, 0x00, 0x70, 0x02, 0x00, 0x00, 0xac, 0x01, 0x00, 0x00, 595 | 0x00, 0x01, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 596 | 0x04, 0x00, 0x00, 0x00, 0xc8, 0xff, 0xff, 0xff, 0x28, 0x00, 0x00, 0x00, 597 | 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 598 | 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 599 | 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x00, 0x00, 0x00, 0x00, 600 | 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 601 | 0x14, 0x00, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 602 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x00, 0x00, 603 | 0x2c, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 604 | 0x02, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 605 | 0x0d, 0x00, 0x00, 0x00, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x5f, 606 | 0x69, 0x6e, 0x70, 0x75, 0x74, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 607 | 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xa0, 0xf9, 0xff, 0xff, 608 | 0x00, 0x00, 0x00, 0x09, 0x54, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 609 | 0x38, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 610 | 0x02, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 611 | 0x34, 0xfa, 0xff, 0xff, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 612 | 0x01, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 613 | 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3b, 0x0d, 0x00, 0x00, 0x00, 614 | 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x6e, 0x74, 615 | 0x38, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 616 | 0x02, 0x00, 0x00, 0x00, 0x08, 0xfa, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, 617 | 0x94, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 618 | 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 619 | 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0xf4, 0xf9, 0xff, 0xff, 620 | 0x2c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 621 | 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xe1, 0xff, 0xff, 0xff, 622 | 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xc0, 0x3e, 623 | 0x01, 0x00, 0x00, 0x00, 0x21, 0xbb, 0x6e, 0x42, 0x01, 0x00, 0x00, 0x00, 624 | 0x00, 0xa3, 0x11, 0xc2, 0x34, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, 625 | 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 0x65, 0x6e, 0x73, 0x65, 626 | 0x5f, 0x32, 0x2f, 0x4d, 0x61, 0x74, 0x4d, 0x75, 0x6c, 0x3b, 0x73, 0x65, 627 | 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 0x65, 0x6e, 628 | 0x73, 0x65, 0x5f, 0x32, 0x2f, 0x42, 0x69, 0x61, 0x73, 0x41, 0x64, 0x64, 629 | 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 630 | 0x02, 0x00, 0x00, 0x00, 0xb0, 0xfa, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, 631 | 0xac, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 632 | 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 633 | 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x9c, 0xfa, 0xff, 0xff, 634 | 0x2c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 635 | 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 636 | 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x47, 0xd5, 0x43, 0x3e, 637 | 0x01, 0x00, 0x00, 0x00, 0x72, 0x11, 0x43, 0x42, 0x01, 0x00, 0x00, 0x00, 638 | 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, 639 | 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 0x65, 0x6e, 0x73, 0x65, 640 | 0x5f, 0x31, 0x2f, 0x4d, 0x61, 0x74, 0x4d, 0x75, 0x6c, 0x3b, 0x73, 0x65, 641 | 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 0x65, 0x6e, 642 | 0x73, 0x65, 0x5f, 0x31, 0x2f, 0x52, 0x65, 0x6c, 0x75, 0x3b, 0x73, 0x65, 643 | 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 0x65, 0x6e, 644 | 0x73, 0x65, 0x5f, 0x31, 0x2f, 0x42, 0x69, 0x61, 0x73, 0x41, 0x64, 0x64, 645 | 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 646 | 0x40, 0x00, 0x00, 0x00, 0x70, 0xfb, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, 647 | 0xa4, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 648 | 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 649 | 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x5c, 0xfb, 0xff, 0xff, 650 | 0x2c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 651 | 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 652 | 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xa1, 0x34, 0xfd, 0x3e, 653 | 0x01, 0x00, 0x00, 0x00, 0x6c, 0x37, 0xfc, 0x42, 0x01, 0x00, 0x00, 0x00, 654 | 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, 655 | 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 0x65, 0x6e, 0x73, 0x65, 656 | 0x2f, 0x4d, 0x61, 0x74, 0x4d, 0x75, 0x6c, 0x3b, 0x73, 0x65, 0x71, 0x75, 657 | 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 0x65, 0x6e, 0x73, 0x65, 658 | 0x2f, 0x52, 0x65, 0x6c, 0x75, 0x3b, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 659 | 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x2f, 0x42, 660 | 0x69, 0x61, 0x73, 0x41, 0x64, 0x64, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 661 | 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x28, 0xfc, 0xff, 0xff, 662 | 0x00, 0x00, 0x00, 0x09, 0x7c, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 663 | 0x54, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 664 | 0x02, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 665 | 0x14, 0xfc, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 666 | 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 667 | 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 668 | 0x01, 0x00, 0x00, 0x00, 0xba, 0xb9, 0x39, 0x3f, 0x01, 0x00, 0x00, 0x00, 669 | 0x00, 0x00, 0x39, 0x43, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 670 | 0x1a, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 671 | 0x61, 0x6c, 0x2f, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x2f, 0x52, 672 | 0x65, 0x73, 0x68, 0x61, 0x70, 0x65, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 673 | 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x4a, 0xfd, 0xff, 0xff, 674 | 0x00, 0x00, 0x00, 0x09, 0x6c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 675 | 0x44, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x94, 0xfc, 0xff, 0xff, 676 | 0x30, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 677 | 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 678 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 679 | 0xb7, 0xd0, 0xd2, 0x3b, 0x01, 0x00, 0x00, 0x00, 0x16, 0x2b, 0x51, 0x3f, 680 | 0x01, 0x00, 0x00, 0x00, 0xc8, 0x55, 0x46, 0xbf, 0x19, 0x00, 0x00, 0x00, 681 | 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 682 | 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x32, 0x2f, 0x4d, 0x61, 0x74, 0x4d, 0x75, 683 | 0x6c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 684 | 0x40, 0x00, 0x00, 0x00, 0xca, 0xfd, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, 685 | 0x6c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 686 | 0x04, 0x00, 0x00, 0x00, 0x14, 0xfd, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 687 | 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 688 | 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 689 | 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x19, 0xb0, 0x96, 0x3c, 690 | 0x01, 0x00, 0x00, 0x00, 0x30, 0x49, 0x41, 0x3f, 0x01, 0x00, 0x00, 0x00, 691 | 0xb9, 0x82, 0x15, 0xc0, 0x19, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, 692 | 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 0x65, 0x6e, 0x73, 0x65, 693 | 0x5f, 0x31, 0x2f, 0x4d, 0x61, 0x74, 0x4d, 0x75, 0x6c, 0x00, 0x00, 0x00, 694 | 0x02, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 695 | 0x4a, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, 0x64, 0x00, 0x00, 0x00, 696 | 0x06, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 697 | 0x94, 0xfd, 0xff, 0xff, 0x2c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 698 | 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 699 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 700 | 0x77, 0x39, 0xbc, 0x3b, 0x01, 0x00, 0x00, 0x00, 0xe6, 0x50, 0xca, 0x3e, 701 | 0x01, 0x00, 0x00, 0x00, 0x04, 0xc1, 0x3a, 0xbf, 0x17, 0x00, 0x00, 0x00, 702 | 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 703 | 0x65, 0x6e, 0x73, 0x65, 0x2f, 0x4d, 0x61, 0x74, 0x4d, 0x75, 0x6c, 0x00, 704 | 0x02, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 705 | 0xc2, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0x38, 0x00, 0x00, 0x00, 706 | 0x05, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 707 | 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 708 | 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x66, 709 | 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x2f, 0x43, 0x6f, 0x6e, 0x73, 0x74, 710 | 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 711 | 0x0a, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0x68, 0x00, 0x00, 0x00, 712 | 0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 713 | 0xfc, 0xfe, 0xff, 0xff, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 714 | 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 715 | 0x01, 0x00, 0x00, 0x00, 0x9e, 0x44, 0xa1, 0x3a, 0x32, 0x00, 0x00, 0x00, 716 | 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 717 | 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x32, 0x2f, 0x42, 0x69, 0x61, 0x73, 0x41, 718 | 0x64, 0x64, 0x2f, 0x52, 0x65, 0x61, 0x64, 0x56, 0x61, 0x72, 0x69, 0x61, 719 | 0x62, 0x6c, 0x65, 0x4f, 0x70, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 720 | 0x63, 0x65, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 721 | 0x82, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0x6c, 0x00, 0x00, 0x00, 722 | 0x03, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 723 | 0x74, 0xff, 0xff, 0xff, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 724 | 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 725 | 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x0b, 0x15, 0x3c, 726 | 0x32, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 727 | 0x61, 0x6c, 0x2f, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x31, 0x2f, 0x42, 728 | 0x69, 0x61, 0x73, 0x41, 0x64, 0x64, 0x2f, 0x52, 0x65, 0x61, 0x64, 0x56, 729 | 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x4f, 0x70, 0x2f, 0x72, 0x65, 730 | 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 731 | 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x08, 0x00, 732 | 0x07, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00, 0x0e, 0x00, 0x00, 0x00, 733 | 0x00, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 734 | 0x34, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x0c, 0x00, 735 | 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x00, 0x00, 736 | 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 737 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 738 | 0x15, 0x8e, 0x88, 0x3b, 0x30, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, 739 | 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 0x65, 0x6e, 0x73, 0x65, 740 | 0x2f, 0x42, 0x69, 0x61, 0x73, 0x41, 0x64, 0x64, 0x2f, 0x52, 0x65, 0x61, 741 | 0x64, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x4f, 0x70, 0x2f, 742 | 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x00, 0x00, 0x00, 0x00, 743 | 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x14, 0x00, 0x1c, 0x00, 744 | 0x08, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 745 | 0x00, 0x00, 0x18, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 746 | 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 747 | 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 748 | 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x14, 0x00, 749 | 0x04, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 750 | 0x30, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 751 | 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 752 | 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 753 | 0xba, 0xb9, 0x39, 0x3f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x43, 754 | 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 755 | 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x5f, 0x69, 0x6e, 0x70, 0x75, 756 | 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x38, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 757 | 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 758 | 0x68, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 759 | 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xd4, 0xff, 0xff, 0xff, 760 | 0x00, 0x00, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 761 | 0xc8, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x72, 0x72, 0x00, 0x00, 0x00, 762 | 0xf0, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x19, 0x02, 0x00, 0x00, 0x00, 763 | 0x19, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x07, 0x00, 0x00, 0x00, 764 | 0x08, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 765 | 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x0c, 0x00, 766 | 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x00, 0x00, 767 | 0x00, 0x00, 0x00, 0x16, 0x16, 0x00, 0x00, 0x00 768 | }; 769 | const int g_model_len = 8864; -------------------------------------------------------------------------------- /Arduino_CurrentSense_ML/model.h: -------------------------------------------------------------------------------- 1 | /* Copyright 2020 The TensorFlow Authors. All Rights Reserved. 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | ==============================================================================*/ 15 | 16 | // Automatically created from a TensorFlow Lite flatbuffer using the command: 17 | // xxd -i model.tflite > model.cc 18 | 19 | // This is a standard TensorFlow Lite model file that has been converted into a 20 | // C data array, so it can be easily compiled into a binary for devices that 21 | // don't have a file system. 22 | 23 | // See train/README.md for a full description of the creation process. 24 | 25 | #ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_MODEL_H_ 26 | #define TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_MODEL_H_ 27 | 28 | extern const unsigned char g_model[]; 29 | extern const int g_model_len; 30 | 31 | #endif // TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_MODEL_H_ 32 | -------------------------------------------------------------------------------- /Arduino_CurrentSense_ML/output_handler.h: -------------------------------------------------------------------------------- 1 | /* Copyright 2019 The TensorFlow Authors. All Rights Reserved. 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | ==============================================================================*/ 15 | 16 | #ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_OUTPUT_HANDLER_H_ 17 | #define TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_OUTPUT_HANDLER_H_ 18 | 19 | #include "tensorflow/lite/c/common.h" 20 | #include "tensorflow/lite/micro/micro_error_reporter.h" 21 | 22 | // Called by the main loop to produce some output based on the x and y values 23 | void HandleOutput(tflite::ErrorReporter* error_reporter, float x_1, float x_2); 24 | 25 | #endif // TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_OUTPUT_HANDLER_H_ 26 | -------------------------------------------------------------------------------- /DataCollection/LED_blink.ino: -------------------------------------------------------------------------------- 1 | void setup() { 2 | pinMode(LED_BUILTIN, OUTPUT); 3 | } 4 | 5 | 6 | void loop() { 7 | digitalWrite(LED_BUILTIN, HIGH); 8 | delay(1000); 9 | digitalWrite(LED_BUILTIN, LOW); 10 | delay(1000); 11 | } 12 | -------------------------------------------------------------------------------- /DataCollection/LED_off.ino: -------------------------------------------------------------------------------- 1 | void setup() { 2 | pinMode(LED_BUILTIN, OUTPUT); 3 | } 4 | 5 | 6 | void loop() { 7 | digitalWrite(LED_BUILTIN, LOW); 8 | delay(1000); 9 | } 10 | -------------------------------------------------------------------------------- /DataCollection/LED_on.ino: -------------------------------------------------------------------------------- 1 | void setup() { 2 | pinMode(LED_BUILTIN, OUTPUT); 3 | } 4 | 5 | 6 | void loop() { 7 | digitalWrite(LED_BUILTIN, HIGH); 8 | delay(1000); 9 | } 10 | -------------------------------------------------------------------------------- /DataCollection/get_current_data.ino: -------------------------------------------------------------------------------- 1 | // Dirrrrty Haxx... 2 | #define private public 3 | #define protected public 4 | 5 | #include 6 | #include 7 | 8 | Adafruit_INA219 ina219; 9 | 10 | int16_t curr_array[16]; 11 | int8_t ctr; 12 | int i; 13 | 14 | void setup(void) 15 | { 16 | Serial.begin(9600); 17 | while (!Serial) { 18 | // will pause Zero, Leonardo, etc until serial console opens 19 | delay(1); 20 | } 21 | 22 | uint32_t currentFrequency; 23 | 24 | Serial.println("Hello!"); 25 | 26 | if (! ina219.begin()) { 27 | Serial.println("Failed to find INA219 chip"); 28 | while (1) { delay(10); } 29 | } 30 | // To use a slightly lower 32V, 1A range (higher precision on amps): 31 | //ina219.setCalibration_32V_1A(); 32 | // Or to use a lower 16V, 400mA range (higher precision on volts and amps): 33 | //ina219.setCalibration_16V_400mA(); 34 | 35 | Serial.println("Measuring voltage and current with INA219 ..."); 36 | } 37 | 38 | void loop(void) 39 | { 40 | 41 | for(i=0;i<16;i++){ 42 | curr_array[i] = ina219.getCurrent_raw(); 43 | } 44 | 45 | Serial.print("["); 46 | for(i=0; i<15; i++){ 47 | Serial.print(curr_array[i]); 48 | Serial.print(","); 49 | } 50 | Serial.print(curr_array[15]); 51 | Serial.println("]"); 52 | } 53 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Santander Security Research 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Welcome to CurrentSense-TinyML 2 | 3 | ![Intro](media/currentsense-ML-photo.jpeg) 4 | 5 | CurrentSense-TinyML is all about detecting microcontroller behaviour with current sensing and TinyML. Basically we are trying to work out what is happening on a target PCB. 6 | 7 | This work is inspired by prior work I have done, as well as the work of [Stacksmashing](https://twitter.com/stacksmashing) at leveldown security. This work is intended to be a working Proof of Concept (PoC) for what is the next logical step in these kinds of attacks - using Machine Learning (ML) in current monitoring side-channel analysis attacks. 8 | 9 | GOAL - To detect an LED flashing on a target using an TensorFlow Lite ML model running on a different microcontroller speaking to an INA219 power monitor that is reading the power going into the target. 10 | 11 | See [TinyML-CurrentSense-Writeup.ipynb](TinyML-CurrentSense-Writeup.ipynb) for the writeup of this project. The `Arduino_CurrentSense_ML` folder contains the Arduino IDE .ino file that will load the model onto an Arduino Nano 33 Sense board. The rest of the code - for generating training data, recording it, and processing it, can all be found in the jupyter notebook and the `DataCollection` folder. 12 | 13 | We've also uploaded it to Google Colaboratory for those who would like to have a play but not install stuff locally first: [https://colab.research.google.com/github/Santandersecurityresearch/CurrentSense-TinyML/blob/main/TinyML-CurrentSense-Writeup.ipynb](https://colab.research.google.com/github/Santandersecurityresearch/CurrentSense-TinyML/blob/main/TinyML-CurrentSense-Writeup.ipynb) 14 | 15 | This is a taster of the resulting behaviour - reading the state of the target LED (in RED) and copying it using the analyser's LED (Yellow): 16 | 17 | ![PoC](media/proof_of_concept.gif) 18 | 19 | ## What is CurrentSense-TinyML (and does it work?) 20 | 21 | Despite prior evidence that says 'yes!' from the work we cited above, there are a few good indicators that this should work. If we setup the INA219 with the Nano 33 Sense and just monitor the Nano target running blink, we can see the following output when we use Arduino IDE's Serial Plotter (using the get_current_data.ino code for those who want to play along at home) 22 | 23 | ![initial motivation](media/currentsense-ML-init.png) 24 | 25 | ## How Do I Install It? 26 | 27 | First things first, we need to get the environment ready. TensorFlow does not support Python v3.9.x, so if you need to, you should run conda activate to enable a python 3.8.x environment. 28 | 29 | We recommend you use a Jupyter Notebook instance as this makes life much easier. 30 | 31 | We first install TensorFlow and then do our imports... 32 | 33 | ![Tensorflow](media/tensorflow.png) 34 | 35 | Next up, you will need some hardware: 36 | 37 | * [INA219 Current Measuring over I2C board](https://www.adafruit.com/product/904) 38 | * Arduino Nano ATMEGA329P target board (AliExpress or eBay is good here) 39 | * Arduino Nano 33 Sense ML capable board 40 | * USB Cables and Laborkabel 41 | * A Breadboard is handy 42 | 43 | On the software side, your IDE [Platformio](https://platformio.org) or the [Arduino](https://www.arduino.cc/en/software) should work with the Arduino Nano 33 Sense. You'll also need to add the [INA219](https://github.com/adafruit/Adafruit_INA219) library 44 | 45 | ## How Do I Use It? 46 | 47 | Ok, so we've convinced ourselves that this should work... or might work... or could work... so let's get started! 48 | 49 | We recommend you load the TinyML-CurrentSense-Writeup.ipynb into your Jupyter instance as this is the most detailed explaination as to how you make magic happen. 50 | 51 | ## Who Is Behind It? 52 | 53 | CurrentSense-TinyML is a research project by Work done by Mark Carney of the Santander Group Cyber Security Research Team. ([@LargeCardinal](https://twitter.com/LargeCardinal)). 54 | 55 | 56 | -------------------------------------------------------------------------------- /TinyML-CurrentSense-Writeup.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "id": "legitimate-operator", 6 | "metadata": {}, 7 | "source": [ 8 | "# Detecting Microcontroller Behaviour w/ Current Sensing and TinyML\n", 9 | "\n", 10 | "Welcome to this example and tutorial for using TinyML and current sensing to work out what is going on on a target PCB. This example is designed to be a full walkthrough for each stage of the process:\n", 11 | "* Setting up the circuits for us to measure current from the target.\n", 12 | "* Generating training data for our ML model\n", 13 | "* Training the ML Model with TensorFlow and Keras\n", 14 | "* Quantizing the ML Model with TensorFlow Lite\n", 15 | "* Loading the ML Model onto a microcontroller\n", 16 | "* Using the current sensing side channel to determine if an LED is on or off\n", 17 | "\n", 18 | "This work is inspired by prior work I have done, as well as [the work of](https://leveldown.de/blog/tensorflow-sidechannel-analysis/) [@stacksmashing](https://twitter.com/stacksmashing) _et al._ at leveldown security. This work is intended to be a worked Proof of Concept (PoC) for what is the next logical step in these kinds of attacks - using Machine Learning (ML) in current monitoring side-channel analysis attacks. \n", 19 | "\n", 20 | "**GOAL** - To detect an LED flashing on a target by means of current usage side-channel analysis, using an TensorFlow Lite ML model running on a different microcontroller speaking to an INA219 power monitor that is reading the power going into the target. \n", 21 | "\n", 22 | "First we shall setup our environment. We note that TensorFlow **does not support python v3.9.x**, so if you need to, you should run `conda activate` to enable a python 3.8.x environment. We first install TensorFlow and then do our imports..." 23 | ] 24 | }, 25 | { 26 | "cell_type": "code", 27 | "execution_count": 1, 28 | "id": "residential-revelation", 29 | "metadata": {}, 30 | "outputs": [], 31 | "source": [ 32 | "!python3 -m pip -q install tensorflow " 33 | ] 34 | }, 35 | { 36 | "cell_type": "code", 37 | "execution_count": 2, 38 | "id": "lasting-secretariat", 39 | "metadata": {}, 40 | "outputs": [], 41 | "source": [ 42 | "# TensorFlow is the open source machine learning library we shall use\n", 43 | "import tensorflow as tf\n", 44 | "\n", 45 | "# Keras is TensorFlow's high-level API for deep learning\n", 46 | "from tensorflow import keras\n", 47 | "# Numpy is a math library\n", 48 | "import numpy as np\n", 49 | "# Pandas is a data manipulation library \n", 50 | "import pandas as pd\n", 51 | "# Matplotlib is a graphing library\n", 52 | "import matplotlib.pyplot as plt\n", 53 | "# Math is Python's math library\n", 54 | "import math\n", 55 | "\n", 56 | "# Set seed for reproducibility\n", 57 | "seed = 1337\n", 58 | "np.random.seed(seed)\n", 59 | "tf.random.set_seed(seed)" 60 | ] 61 | }, 62 | { 63 | "cell_type": "markdown", 64 | "id": "related-forestry", 65 | "metadata": {}, 66 | "source": [ 67 | "## Can this work? \n", 68 | "\n", 69 | "Despite prior evidence that says 'yes!' from the work we cited above, there are a few good indicators that this should work. If we setup the INA219 with the Nano 33 Sense and just monitor the Nano target running `blink`, we can see the following output when we use Arduino IDE's Serial Plotter (using the `get_current_data.ino` code for thsoe who want to play along at home):\n", 70 | "\n", 71 | "![initial motivation](media/currentsense-ML-init.png)\n", 72 | "\n", 73 | "We can see clearly when the LED is on - _hint_, it's when there's more power being used! This is only a difference of a few mA (the scale is roughly 10uA per y-increase of 1 in the graph). We also see a lot of noise in the output - where the current reading from the INA219 drops to zero in some position of the 16 numbers we are getting in the output. \n", 74 | "\n", 75 | "Machine Learning is pretty good at dealing with noise - in fact, it's a _de facto_ selling point of the tech. So in theory, this should have a good chance of working, we just need the following things:\n", 76 | "1. A good set of training data...\n", 77 | "1. The model to be trained!\n", 78 | "1. To deploy the model to a microcontroller. \n", 79 | "\n", 80 | "## But Why Machine Learning? \n", 81 | "\n", 82 | "You might ask **\"Why not just ask if the current is >15mA? That seems to be the logic we need...\"** and that is an _excellent_ question! This is just a PoC to show that this can be done - but also, if it works for this in terms of 'current usage pattern recognition', then it can possibly work for recognising more than 2 patterns (LED ON/LED OFF). So this should serve as a jumping off point for further work and refinements. :-)" 83 | ] 84 | }, 85 | { 86 | "cell_type": "markdown", 87 | "id": "virtual-packet", 88 | "metadata": {}, 89 | "source": [ 90 | "# Setting Up and Getting Training Data\n", 91 | "\n", 92 | "Ok, so we've convinced ourselves that this _should_ work... or _might_ work... or _could_ work... so let's get started! \n", 93 | "\n", 94 | "## Bill of Materials\n", 95 | "\n", 96 | "This tutorial is designed for the following of materials:\n", 97 | "1. INA219 Current Measuring over I2C board\n", 98 | "1. Arduino Nano ATMEGA328P target board\n", 99 | "1. Arduino Nano 33 Sense ML capable board \n", 100 | "1. USB Cables and Laborkabel\n", 101 | "1. A Breadboard is handy\n", 102 | "1. Support for your target board and the Arduino Nano 33 Sense board in Arduino IDE\n", 103 | "1. The `Adafruit_INA219` library installed in Arduino IDE (using `Manage Libraries...`)\n", 104 | "\n", 105 | "## Generation of Training Data\n", 106 | "\n", 107 | "We want to measure the current going to the target using the INA219, so we'll use the following schematic:\n", 108 | "\n", 109 | "![Schematic of circuit](media/currentsense-ML-schematic.png)\n", 110 | "\n", 111 | "Let's break down what is going on here - the Arduino Nano Sense is the main event, providing power for the target and INA219 board from the USB We're powering the target from the Arduino Nano Sense via the sense screw terminal on the INA219 breakout board I'm using. \n", 112 | "\n", 113 | "The target is an Arduino Nano clone (using the cheap ones as targets as, well, they might break!). This is going to run the default `blink` example code.\n", 114 | "\n", 115 | "The eventual setup I have looks like this:\n", 116 | "\n", 117 | "![photo of setup](media/currentsense-ML-photo.jpeg)\n", 118 | "\n", 119 | "We can now collect some data! So how are we going to do this? Well, here is the rough plan of action:\n", 120 | "1. Setup a data collection firmware on the Nano 33 Sense.\n", 121 | "1. Setup two target firmwares:\n", 122 | " 1. One for the LED being on - `LED_on.ino`\n", 123 | " 1. One for the LED being off - `LED_off.ino`\n", 124 | "1. Gather training data for each - at least 5k samples.\n", 125 | "1. Manipulate the data to make it suitable for TensorFlow. \n", 126 | "\n", 127 | "## Target Code Snippets\n", 128 | "\n", 129 | "First up, load the `LED_off.ino` example to the target, and the `get_current_data.ino` to the Nano 33 Sense using the Arduino IDE for both (it's a bit of a pain, but if we do this right, we only have to do it a few times! :-P )\n", 130 | "\n", 131 | "Let's look at what each of these does. `LED_off.ino` is the following code: \n", 132 | "```c\n", 133 | "void setup() {\n", 134 | " pinMode(LED_BUILTIN, OUTPUT);\n", 135 | "}\n", 136 | "\n", 137 | "void loop() {\n", 138 | " digitalWrite(LED_BUILTIN, LOW);\n", 139 | " delay(1000); \n", 140 | "}\n", 141 | "```\n", 142 | "\n", 143 | "This code is fairly standard - it just turns the LED on, and monitoring the current from this will generate our 'LED is ON' trainig data from the `get_current_data.ino` firmware. \n", 144 | "\n", 145 | "**But why the `delay(1000);`?** - Well, my reasoning is as follows; the target code is going to be blinking the LED using the same delay function. We know from the work and products such as the ChipWhisperer from [NewAE](https://www.newae.com/) that current sensing is a very accurate side channel. Although we aren't going to be going 'full tilt' analysis on this target, just having the uC loop without the delay loop might give us some different behaviour (you can try it out to see if this is the case!!). So, in the interest of giving a reasonable example of \"how to generate training data\", I've included it here. \n", 146 | "\n", 147 | "We likewise use similar code for getting an 'LED is on' training set:\n", 148 | "\n", 149 | "```c\n", 150 | "void setup() {\n", 151 | " pinMode(LED_BUILTIN, OUTPUT);\n", 152 | "}\n", 153 | "\n", 154 | "void loop() {\n", 155 | " digitalWrite(LED_BUILTIN, HIGH);\n", 156 | " delay(1000); \n", 157 | "}\n", 158 | "```\n", 159 | "\n", 160 | "This code isn't really all that exciting, though... what we really want to look at is the code to...\n", 161 | "\n", 162 | "## Get Current Measurement Training Data\n", 163 | "\n", 164 | "So let's look at the code that analyses the current using the INA219! We'll go through this section by section...\n", 165 | "\n", 166 | "First up is this, well, _dirty hack_... \n", 167 | "\n", 168 | "```c\n", 169 | "// Dirrrrty Haxx...\n", 170 | "#define private public\n", 171 | "#define protected public\n", 172 | "```\n", 173 | "Yeah, just so it is said, **NEVER EVER DO THIS IN PRODUCTION** because that would just be _BAD_... But there is a reason for my madness here: I'm a lazy hacker. \n", 174 | "\n", 175 | "We will be using the `Adafruit_INA219` library (which you can install using the `Manage Libraries...` dialogue in the Arduino IDE). However, I want to access the raw `int16` output from the I2C bus from the INA219 chip. There _is_ a method in the Adafruit library for this; `Adafruit_INA219.getCurrent_raw()` - but this is a `private` method that is inaccessible in normal usage. \n", 176 | "\n", 177 | "Now, I _could_ write a load of I2C code, which I've done before, that would implement the I2C commands to the INA219 chip based [on the datasheet](https://www.ti.com/lit/ds/symlink/ina219.pdf?ts=1615929778308&ref_url=https%253A%252F%252Fwww.google.com%252F). That would be kinda fun as an exercise, but Adafruit have done the hard work for me, I just need to expose the method so I can use it... \n", 178 | "\n", 179 | "Thus, writing one line `#define private public` to override the class definition is much easier than writing >100 lines of I2C handler code. Like I said... _lazy hacker_... **DO NOT LET INTO PRODUCTION!**\n", 180 | "\n", 181 | "The next bit is fairly sedentry setup stuff:\n", 182 | "```c\n", 183 | "#include \n", 184 | "#include \n", 185 | "\n", 186 | "Adafruit_INA219 ina219;\n", 187 | "\n", 188 | "int16_t curr_array[16];\n", 189 | "int i;\n", 190 | "\n", 191 | "void setup(void) \n", 192 | "{\n", 193 | " Serial.begin(115200);\n", 194 | " while (!Serial) {\n", 195 | " // will pause Zero, Leonardo, etc until serial console opens\n", 196 | " delay(1);\n", 197 | " }\n", 198 | "\n", 199 | " uint32_t currentFrequency;\n", 200 | " \n", 201 | " Serial.println(\"Hello!\");\n", 202 | "\n", 203 | " if (! ina219.begin()) {\n", 204 | " Serial.println(\"Failed to find INA219 chip\");\n", 205 | " while (1) { delay(10); }\n", 206 | " }\n", 207 | " // To use a slightly lower 32V, 1A range (higher precision on amps):\n", 208 | " //ina219.setCalibration_32V_1A();\n", 209 | " // Or to use a lower 16V, 400mA range (higher precision on volts and amps):\n", 210 | " //ina219.setCalibration_16V_400mA();\n", 211 | "\n", 212 | " Serial.println(\"Measuring voltage and current with INA219 ...\");\n", 213 | "}\n", 214 | "```\n", 215 | "Nothing really exciting there. We start the UART `Serial` handler, and initialise the INA219. All good! Now we get to the loop:\n", 216 | "```c\n", 217 | "void loop(void) \n", 218 | "{\n", 219 | "\n", 220 | " for(i=0;i<16;i++){\n", 221 | " curr_array[i] = ina219.getCurrent_raw();\n", 222 | " }\n", 223 | "\n", 224 | " Serial.print(\"[\");\n", 225 | " for(i=0; i<15; i++){\n", 226 | " Serial.print(curr_array[i]);\n", 227 | " Serial.print(\",\");\n", 228 | " }\n", 229 | " Serial.print(curr_array[15]);\n", 230 | " Serial.println(\"]\");\n", 231 | "}\n", 232 | "```\n", 233 | "\n", 234 | "So let's break this down - Let's start with the acquisition loop:\n", 235 | "```c\n", 236 | " for(i=0;i<16;i++){\n", 237 | " curr_array[i] = ina219.getCurrent_raw();\n", 238 | " }\n", 239 | "```\n", 240 | "This loop gathers data from the INA219. It's kinda important that this is _always done the same way_! If we change this out, by, say, just outputting the bytes once per loop, then if we change the way we do things later, with different length loops on differently clocked microcontrollers, then we will have problems. So this is how we will acquire the data later on when we use the ML model for inference. \n", 241 | "\n", 242 | "The next block of code is the data output:\n", 243 | "```c\n", 244 | " Serial.print(\"[\");\n", 245 | " for(i=0; i<15; i++){\n", 246 | " Serial.print(curr_array[i]);\n", 247 | " Serial.print(\",\");\n", 248 | " }\n", 249 | " Serial.print(curr_array[15]);\n", 250 | " Serial.println(\"]\");\n", 251 | "```\n", 252 | "This code outputs something along the lines of:\n", 253 | "`[125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125]`\n", 254 | "**But why the square brackets?** Well, again, this is me being lazy. If we take a string output like the above, then we can just run in python:" 255 | ] 256 | }, 257 | { 258 | "cell_type": "code", 259 | "execution_count": 3, 260 | "id": "rotary-concern", 261 | "metadata": {}, 262 | "outputs": [ 263 | { 264 | "name": "stdout", 265 | "output_type": "stream", 266 | "text": [ 267 | "\n", 268 | "[125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125]\n" 269 | ] 270 | } 271 | ], 272 | "source": [ 273 | "data_str = \"[125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125]\"\n", 274 | "data = eval(data_str)\n", 275 | "print(type(data))\n", 276 | "print(data)" 277 | ] 278 | }, 279 | { 280 | "cell_type": "markdown", 281 | "id": "banned-nomination", 282 | "metadata": {}, 283 | "source": [ 284 | "...and we will have a nice python array of numbers ready to go :) We can then load this easily into numpy arrays or other data structures in python that we can then pass to TensorFlow for our training stage. Ultimately, I'm considering my future processing of the training data at the point of which I'm generating it - it's just planning ahead, and that's never a bad thing.\n", 285 | "\n", 286 | "With this code ready, let's carry out our data acquisition plan!\n", 287 | "\n", 288 | "\n", 289 | "## Training Data Acquisition\n", 290 | "\n", 291 | "Doesn't that all sound so _fancy_?!? It's just us using the code we've discussed above and putting the data into files. So here's the plan:\n", 292 | "1. Load the `get_current_data.ino` firmware onto the Arduino Nano 33 Sense. \n", 293 | "1. Load `LED_off.ino` onto the target `ATMEGA328P` board\n", 294 | "1. Power the circuit and run the following command (for linux or sim): `sudo screen -L -Logfile led-off.log /dev/ttyACM0 9600`\n", 295 | "1. When you have over 5k lines from this, disconnect `screen`/unplug the circuit.\n", 296 | "1. Load `LED_on.ino` onto the target\n", 297 | "1. Power the circuit as before and run: `sudo screen -L -Logfile led-on.log /dev/ttyACM0 9600`\n", 298 | "1. Get 5k more lines, and then have a cuppa...\n", 299 | "\n", 300 | "We now have our data for 'LED is ON' and 'LED is OFF'! So let's begin the next step." 301 | ] 302 | }, 303 | { 304 | "cell_type": "markdown", 305 | "id": "written-dominican", 306 | "metadata": {}, 307 | "source": [ 308 | "# Training the TensorFlow Model\n", 309 | "\n", 310 | "Well, now we have data (we've included copies of our own here), we will now setup and train our machine learning model using TensorFlow. First up, some utility functions..." 311 | ] 312 | }, 313 | { 314 | "cell_type": "code", 315 | "execution_count": 4, 316 | "id": "wanted-firewall", 317 | "metadata": {}, 318 | "outputs": [], 319 | "source": [ 320 | "# Copied from https://stackoverflow.com/questions/4601373/better-way-to-shuffle-two-numpy-arrays-in-unison\n", 321 | "def unison_shuffled_copies(a, b):\n", 322 | " assert len(a) == len(b)\n", 323 | " p = np.random.permutation(len(a))\n", 324 | " return a[p], b[p]\n", 325 | "\n", 326 | "# This will convert our file of [1..16] strings to python lists to a numpy array that is TF friendly...\n", 327 | "def file_to_np(filename):\n", 328 | " with open(filename, 'r') as f:\n", 329 | " f_lines = f.readlines()\n", 330 | " f_list = list(map(eval, f_lines))\n", 331 | " f_np = np.array([np.array(fi) for fi in f_list])\n", 332 | " return f_np" 333 | ] 334 | }, 335 | { 336 | "cell_type": "markdown", 337 | "id": "direct-dancing", 338 | "metadata": {}, 339 | "source": [ 340 | "## Loading the Data\n", 341 | "\n", 342 | "Next up, we will load the data into some variable arrays that we will use for training in the next step:" 343 | ] 344 | }, 345 | { 346 | "cell_type": "code", 347 | "execution_count": 5, 348 | "id": "exciting-sending", 349 | "metadata": {}, 350 | "outputs": [], 351 | "source": [ 352 | "# This is the number of training epochs we will use... \n", 353 | "# Technically it's a little high (looks like some overfitting) \n", 354 | "# if you think of a way to maybe make things better... try it! :-) -MC \n", 355 | "e_pochs = 1500\n", 356 | "\n", 357 | "num_samples = 5000\n", 358 | "train_size = int(num_samples * 0.6)\n", 359 | "test_size = int(num_samples * 0.2)\n", 360 | "validate_size = int(num_samples * 0.2) # we let model.fit() do this for us... just define this for now. -MC\n", 361 | "\n", 362 | "# Load the data files... EDIT for your own data! -MC\n", 363 | "f_ledoff = file_to_np('example_data/led-off2.log')[:num_samples]\n", 364 | "f_ledon = file_to_np('example_data/led-on2.log')[:num_samples]\n", 365 | "\n", 366 | "# Setup the training data...\n", 367 | "train_data = []\n", 368 | "training_data = []\n", 369 | "training_labels = []\n", 370 | "train_data.append(f_ledoff[:train_size])\n", 371 | "train_data.append(f_ledon[:train_size])\n", 372 | "for i in range(2):\n", 373 | " for j in range(train_size):\n", 374 | " training_labels.append(i) # Given we process the files sequentially, assign labels 0, 1, ...\n", 375 | " # to the data from each file sequentially...\n", 376 | " training_data.append(train_data[i][j])\n", 377 | "\n", 378 | "training_data = np.array(training_data)\n", 379 | "training_labels = np.array(training_labels)\n", 380 | "\n", 381 | "# Set aside the test data - this will be used after training to see how we did...\n", 382 | "t_data = []\n", 383 | "test_data = []\n", 384 | "test_labels = []\n", 385 | "t_data.append(f_ledoff[train_size:(num_samples - validate_size)])\n", 386 | "t_data.append(f_ledon[train_size:(num_samples - validate_size)])\n", 387 | "for i in range(2):\n", 388 | " for j in range(test_size):\n", 389 | " test_labels.append(i)\n", 390 | " test_data.append(t_data[i][j])\n", 391 | "\n", 392 | "test_data = np.array(test_data)\n", 393 | "test_labels = np.array(test_labels)\n", 394 | "\n", 395 | "# We can also add valdiation data - used to assess the model's efficacy during training,\n", 396 | "# but we don't use that here, as we let model.fit() do that for us.. but we _could_ define it ... -MC\n", 397 | "#v_data = []\n", 398 | "#validate_data = []\n", 399 | "#validate_labels = []\n", 400 | "#v_data.append(f_ledoff[validate_size:])\n", 401 | "#v_data.append(f_ledon[validate_size:])\n", 402 | "#for i in range(2):\n", 403 | "# for j in range(validate_size):\n", 404 | "# validate_labels.append(i)\n", 405 | "# validate_data.append(v_data[i][j])\n", 406 | "# \n", 407 | "#validate_data = np.array(validate_data)\n", 408 | "#validate_labels = np.array(validate_labels)\n", 409 | "\n", 410 | "\n", 411 | "# Shuffle the data sets so it isn't just 'all 1's then all 0's'...\n", 412 | "# This will help with the training, as our data is all linear for now\n", 413 | "training_data, training_labels = unison_shuffled_copies(training_data, training_labels)\n", 414 | "test_data, test_labels = unison_shuffled_copies(test_data, test_labels)\n", 415 | "#validate_data, validate_test = unison_shuffled_copies(validate_data, validate_labels)" 416 | ] 417 | }, 418 | { 419 | "cell_type": "markdown", 420 | "id": "embedded-keyboard", 421 | "metadata": {}, 422 | "source": [ 423 | "So what have we done here? Well, we've built two lists for each dataset - a list of `_data` which are the arrays we got from the microcontroller, and an array of `_labels` which are just `0` if the data came from the `led_off.log` dataset, and `1` if it came from the `led_on.log` dataset. We then shuffle them concurrently to mix up the data for training. \n", 424 | "\n", 425 | "## Creating the TF Model\n", 426 | "\n", 427 | "So, with that done, let's build a model... " 428 | ] 429 | }, 430 | { 431 | "cell_type": "code", 432 | "execution_count": 6, 433 | "id": "double-damages", 434 | "metadata": {}, 435 | "outputs": [], 436 | "source": [ 437 | "model = keras.Sequential([ \n", 438 | " keras.layers.Flatten(input_shape=(16,)), # using Flatten isn't necessary, but included as it's handy for building out.\n", 439 | " keras.layers.Dense(64, activation=tf.nn.relu), #started at 128, but we don't need that many -MC\n", 440 | " keras.layers.Dense(64, activation=tf.nn.relu), # Second layer for betterment of humanity... -MC\n", 441 | " keras.layers.Dense(2, activation=tf.nn.softmax) # output '0' or '1' for LED off or on respectively -MC\n", 442 | "])" 443 | ] 444 | }, 445 | { 446 | "cell_type": "code", 447 | "execution_count": 7, 448 | "id": "hybrid-philosophy", 449 | "metadata": {}, 450 | "outputs": [], 451 | "source": [ 452 | "model.compile(optimizer=tf.optimizers.Adam(), \n", 453 | " loss='sparse_categorical_crossentropy',\n", 454 | " metrics=['accuracy'])\n", 455 | "\n", 456 | "# Lets save our current model state so we can reload it loater\n", 457 | "model.save_weights(\"model_data/pre-fit.weights\")" 458 | ] 459 | }, 460 | { 461 | "cell_type": "markdown", 462 | "id": "comic-reporter", 463 | "metadata": {}, 464 | "source": [ 465 | "Let's walk through this a little; We are using a sequential Keras model - this just means that the model is linear, or 'in a line'. We're not doing funky stuff (like layer sharing or using a non-linear topology) so this is fine for us here.\n", 466 | "\n", 467 | "The first layer is a flattened 16 number input to the model. This just reads the input into the model - called the 'input tensor' to the model. \n", 468 | "\n", 469 | "For the curious, tensor is a generalisation of vector, but that isn't important right now... the important thing is that you you get the joke; \"The more you talk math to ML people, the _tensor_ they get...\" (_I'll see myself out._)\n", 470 | "\n", 471 | "There are then two hidden layers of size 64, with an output layer of size 2. The output layer will activate one node for 'LED is OFF' and the other for 'LED is ON', given by the fact we have two labels in our training data - again, this comes from an 'output tensor'.\n", 472 | "\n", 473 | "The hidden layers are just 'the layers that aren't input nor output' - there's nothing nefarious about them. The idea of using two layers is that this will improve our accuracy when training. \n", 474 | "\n", 475 | "The Netron diagram for this model is the following:\n", 476 | "\n", 477 | "![Netron TF diagram](media/LED_model.png)\n", 478 | "\n", 479 | "This model is _incredibly basic_ and yes, there are many, many improvements that can be made. But honestly? This is Proof of Concept (PoC) code! This is just to see if we can make it work, in any sense, without any refinements. So, we're just gonna leave that there and get on with training! \n", 480 | "\n", 481 | "## Training the model\n", 482 | "\n", 483 | "The training function in TensorFlow we shall use is `model.fit()` which takes our training data and training labels, determines the validation split, and then trains the data. \n", 484 | "\n", 485 | "Training a ML model is when each node in the network we defined above has a value, or weight, assigned. So, we have some array of 136 numbers that we want to then use in the manner described in the neural network definition to determine if the LED is ON or OFF. But, of course, this doesn't happen by itself - we have to train the model to get the output right! \n", 486 | "\n", 487 | "I won't go into the specifics here - it would take too long and others have written extensively on it! So I'll refer you to [Google's ML Crash Course](https://developers.google.com/machine-learning/crash-course/descending-into-ml/training-and-loss) to see how they describe model training (as well as loads more!)." 488 | ] 489 | }, 490 | { 491 | "cell_type": "code", 492 | "execution_count": 8, 493 | "id": "cooperative-allowance", 494 | "metadata": {}, 495 | "outputs": [], 496 | "source": [ 497 | "history = model.fit(training_data, training_labels, epochs=e_pochs, validation_split=0.2, verbose=0)" 498 | ] 499 | }, 500 | { 501 | "cell_type": "markdown", 502 | "id": "brilliant-retail", 503 | "metadata": {}, 504 | "source": [ 505 | "Let's see how we did! We'll draw a graph detailing the loss (the penalty for the model making a bad prediction - basically, how much we had to tell the model off for getting it wrong) and accuracy (how accurate our model was) by looking at the data generated about it during training:" 506 | ] 507 | }, 508 | { 509 | "cell_type": "code", 510 | "execution_count": 9, 511 | "id": "acknowledged-washington", 512 | "metadata": {}, 513 | "outputs": [ 514 | { 515 | "data": { 516 | "image/png": "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v5758+eTm5tLp06dGDNmDJGRkR5pvLkQ79y5M1deeSXTp0+nT58+5OTkEBsby6RJk8jMzGT58uVERERw+HDF+5qtXbuW3377jdjYWAoKCpgzZw4xMTFs2rSJESNGsGTJEr7//nu++uor/vrrL+rVq8fhw4dJTk4mMTGR5cuX06NHDyZPnsz1119fqWdWk2gFYaJ7mDSa0HP55ZdjtVoByM7OZuTIkWzatAkRoaSkxOs1F198MdHR0URHR9O4cWP27dvn4Q8JDBfikyZNwmazsWfPHtauXYuI0KxZM5f/JqfL7blz53LLLbe4uoqSk5MrlHvw4MHExsYCUFJSwm233cby5cuxWq1s3LjRle/1119PvXr1PPK98cYbmTx5Mi+88ALTp09n0aJFlXpmNYlWEOhBak3tp7It/VARFxfnOn744YcZOHAgX375JZmZma4unbI43XCDd1fcwXIhHhER4XKuV/Z6d7lffPFFmjRpwooVK3A4HMTExPjN99JLL+Wxxx7j7LPPplevXqSkpFRatppCj0GY6JXUGk31kp2dTYsWLQB4//33q5yPLxfinTp1Ys+ePSxevBgw3IPbbDbOO+883nrrLZeicXYxpaWlsXTpUgCvXV3ucjdr1gyLxcKUKVOw2+0AnHfeeUyePJmCggKPfGNiYrjgggsYM2bMCdW9BFpBGGgTQqOpdu69917uv/9+evbseVwb9Li7EL/qqqtcLsSjoqKYPn06t99+O+np6Zx33nkUFhZy44030qpVK7p37056ejoff/wxAI8++ih33HEHvXv3dnWDeePf//43H3zwAenp6axfv95lXQwaNIjBgwfTu3dvevTowXPPPee65uqrr8ZisXD++edX+T5rAu3uGzj7+Z/p0iyBV686cWYXaDQVod19hw/PPfcc2dnZPP744zUqR2XdfesxCJPaoyY1Gk04MXToULZs2cJPP/1U06JUGq0g0D1MGo0mdHz55Zc1LUKV0WMQTrQJodFoNB6ETEGIyHsisl9EVvuIHyAi2SKy3Pw94hY3SEQ2iMhmERkXKhndygt1ERqNRnPCEUoL4n1gUAVpflVK9TB/EwBExAq8BlwIdAFGiEiXEMoJgNImhEaj0XgQMgWhlFoAVLyGvTx9gc1Kqa1KqWJgGjAkqMKVQdsPGo1GU56aHoM4VURWiMj3InKyGdYC2OmWJssM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\n", 517 | "text/plain": [ 518 | "
" 519 | ] 520 | }, 521 | "metadata": { 522 | "needs_background": "light" 523 | }, 524 | "output_type": "display_data" 525 | } 526 | ], 527 | "source": [ 528 | "def plot_history(history):\n", 529 | " plt.figure()\n", 530 | " plt.xlabel('Epoch')\n", 531 | " plt.ylabel('Loss/accuracy')\n", 532 | " plt.plot(history.epoch, np.array(history.history['loss']),\n", 533 | " label='Train Loss')\n", 534 | " plt.plot(history.epoch, np.array(history.history['val_loss']),\n", 535 | " label = 'Validation Loss')\n", 536 | " plt.plot(history.epoch, np.array(history.history['accuracy']),\n", 537 | " label='Train accuracy')\n", 538 | " plt.plot(history.epoch, np.array(history.history['val_accuracy']),\n", 539 | " label = 'Validation accuracy')\n", 540 | " plt.legend()\n", 541 | " plt.ylim([0, 2])\n", 542 | "\n", 543 | "plot_history(history)" 544 | ] 545 | }, 546 | { 547 | "cell_type": "code", 548 | "execution_count": 10, 549 | "id": "affected-hearing", 550 | "metadata": {}, 551 | "outputs": [ 552 | { 553 | "name": "stdout", 554 | "output_type": "stream", 555 | "text": [ 556 | "63/63 [==============================] - 0s 491us/step - loss: 0.2331 - accuracy: 0.9845\n", 557 | "Accuracy on testdata: 98.4499990940094 %\n" 558 | ] 559 | } 560 | ], 561 | "source": [ 562 | "test_loss, test_acc = model.evaluate(test_data, test_labels)\n", 563 | "print('Accuracy on testdata:', test_acc * 100, \"%\")" 564 | ] 565 | }, 566 | { 567 | "cell_type": "markdown", 568 | "id": "ordinary-primary", 569 | "metadata": {}, 570 | "source": [ 571 | "The last cell loads the accuracy as a percentage overall... For the training data I have it's at 98.4% _and that ain't at all bad!_ Without any real work or jiggery-pokery, we have managed to get a model to 98% accuracy! Ace! \n", 572 | "\n", 573 | "## Refinements\n", 574 | "\n", 575 | "In short, not yet. This PoC is to focus on getting the model into a microcontroller, rather than building a perfect model... As such, 98% is more than good enough for our purposes, so let's get on with loading this onto the microcontroller!" 576 | ] 577 | }, 578 | { 579 | "cell_type": "markdown", 580 | "id": "identical-freedom", 581 | "metadata": {}, 582 | "source": [ 583 | "# Model Deployment on a Microcontroller\n", 584 | "\n", 585 | "First off, let's convert our TF model to a TF Lite model, making it nice and small. " 586 | ] 587 | }, 588 | { 589 | "cell_type": "code", 590 | "execution_count": 11, 591 | "id": "unique-benjamin", 592 | "metadata": {}, 593 | "outputs": [ 594 | { 595 | "name": "stdout", 596 | "output_type": "stream", 597 | "text": [ 598 | "INFO:tensorflow:Assets written to: /tmp/tmp_rmha1mw/assets\n" 599 | ] 600 | }, 601 | { 602 | "data": { 603 | "text/plain": [ 604 | "23564" 605 | ] 606 | }, 607 | "execution_count": 11, 608 | "metadata": {}, 609 | "output_type": "execute_result" 610 | } 611 | ], 612 | "source": [ 613 | "converter = tf.lite.TFLiteConverter.from_keras_model(model)\n", 614 | "tflite_model = converter.convert()\n", 615 | "\n", 616 | "# Save the model to disk\n", 617 | "open(\"model_data/LED_model.tflite\", 'wb').write(tflite_model)" 618 | ] 619 | }, 620 | { 621 | "cell_type": "markdown", 622 | "id": "executed-budapest", 623 | "metadata": {}, 624 | "source": [ 625 | "## Model Quantisation\n", 626 | "\n", 627 | "Now, whilst the TF Lite model is, well, much lighter, it's still a bit big... As every machine learning engineer comes to ask, _\"does my model look big in this?\"_\n", 628 | "\n", 629 | "Even though our model _isn't actually that big_, you may want to develop a much more nuanced model, or a model with more layers or more inputs from bigger training sets, etc. etc. So we're going to assume that we want/need to quantise our TFLite model to make it fit onto a microcontroller. \n", 630 | "\n", 631 | "Here's the code we are using - we'll run through it after the break:" 632 | ] 633 | }, 634 | { 635 | "cell_type": "code", 636 | "execution_count": 12, 637 | "id": "dominican-injection", 638 | "metadata": {}, 639 | "outputs": [ 640 | { 641 | "name": "stdout", 642 | "output_type": "stream", 643 | "text": [ 644 | "INFO:tensorflow:Assets written to: /tmp/tmp5rsem_2m/assets\n" 645 | ] 646 | }, 647 | { 648 | "name": "stderr", 649 | "output_type": "stream", 650 | "text": [ 651 | "INFO:tensorflow:Assets written to: /tmp/tmp5rsem_2m/assets\n" 652 | ] 653 | }, 654 | { 655 | "data": { 656 | "text/plain": [ 657 | "8864" 658 | ] 659 | }, 660 | "execution_count": 12, 661 | "metadata": {}, 662 | "output_type": "execute_result" 663 | } 664 | ], 665 | "source": [ 666 | "# Convert the model to the TensorFlow Lite format with quantization\n", 667 | "converter = tf.lite.TFLiteConverter.from_keras_model(model)\n", 668 | "\n", 669 | "# Indicate that we want to perform the default optimizations,\n", 670 | "# which include quantization\n", 671 | "converter.optimizations = [tf.lite.Optimize.DEFAULT]\n", 672 | "\n", 673 | "# Define a generator function that provides our test data's x values\n", 674 | "# as a representative dataset, and tell the converter to use it\n", 675 | "def representative_dataset_generator():\n", 676 | " for value in test_data:\n", 677 | " # Each scalar value must be inside of a 2D array that is wrapped in a list\n", 678 | " yield [np.array(value, dtype=np.float32, ndmin=2)]\n", 679 | "\n", 680 | "converter.representative_dataset = representative_dataset_generator\n", 681 | "# Convert the model\n", 682 | "tflite_model = converter.convert()\n", 683 | "\n", 684 | "# Save the model to disk\n", 685 | "open(\"model_data/LED_model_quantized.tflite\", \"wb\").write(tflite_model)" 686 | ] 687 | }, 688 | { 689 | "cell_type": "markdown", 690 | "id": "acting-pierre", 691 | "metadata": {}, 692 | "source": [ 693 | "## What is a quantised model?\n", 694 | "\n", 695 | "Here is the Netron diagram for the resultant quantised model:\n", 696 | "\n", 697 | "![quantised model diagram](media/LED_model_quantized.png)\n", 698 | "\n", 699 | "You'll notice - _it's exactly the same as the other one_ except for the addition of the `quantise`/`dequantise` steps at the top/tail respectively. So what is going on? Well, we're essentially converting the model from the bold, `float32` inspired world of \"I have a CISC CPU and a power supply measured in tens-to-hundreds of Watts\" down to something that, essentially, can be powered by a potato or two (well, more likely a few dozen lemons... they have more potential energy).\n", 700 | "\n", 701 | "To do this, the model is reconfigured to use `int8` as its base - yes, you read that right. That makes it monumentally more friendly to data types on microcontrollers... but surely we have to do something to our input data? And, well, you're right.\n", 702 | "\n", 703 | "Fundamentally, our model has been squeezed, so we need to squeeze the inputs/outputs a little to recover the original state of the model. Note that the size of the model has gone from 23,564 bytes down to just 8,864 bytes - for the curious, that's a 62.4% reduction! Hopefully this gives justification to the why and wherefore that quantized models exist, and are used when doing embedded TinyML.\n", 704 | "\n", 705 | "The actual [TensorFlow int8 quantised model specification](https://www.tensorflow.org/lite/performance/quantization_spec) details the specifics of what is going on, but the most important part is the way in which the inputs are scaled:\n", 706 | "\n", 707 | "![equation](http://www.sciweavers.org/tex2img.php?eq=real%5C_val%20%3D%20%28int8%5C_val%20-%20zero%5C_point%29%20%5Ctimes%20scale&bc=White&fc=Black&im=jpg&fs=12&ff=arev&edit=)\n", 708 | "\n", 709 | "Which yields the following calculation for our inputs:\n", 710 | "\n", 711 | "![equation 2](http://www.sciweavers.org/tex2img.php?eq=int8%5C_val%20%3D%20%28real%5C_val%20%20%2F%20%20scale%20%29%20%2B%20zero%5C_point&bc=White&fc=Black&im=jpg&fs=12&ff=arev&edit=)\n", 712 | "\n", 713 | "Let's first process the model and make it ready..." 714 | ] 715 | }, 716 | { 717 | "cell_type": "code", 718 | "execution_count": 13, 719 | "id": "finished-benefit", 720 | "metadata": {}, 721 | "outputs": [ 722 | { 723 | "name": "stdout", 724 | "output_type": "stream", 725 | "text": [ 726 | "unsigned char model_data_LED_model_quantized_tflite[] = {\r\n", 727 | " 0x24, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x00, 0x00, 0x00, 0x00,\r\n", 728 | " 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x1c, 0x00, 0x04, 0x00,\r\n", 729 | " 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x18, 0x00,\r\n", 730 | " 0x12, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xfc, 0x21, 0x00, 0x00,\r\n", 731 | " 0x40, 0x18, 0x00, 0x00, 0x28, 0x18, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,\r\n", 732 | " 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,\r\n", 733 | " 0x08, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00,\r\n", 734 | " 0x08, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,\r\n", 735 | " 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f,\r\n", 736 | "...\r\n", 737 | " 0x00, 0x00, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,\r\n", 738 | " 0xc8, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x72, 0x72, 0x00, 0x00, 0x00,\r\n", 739 | " 0xf0, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x19, 0x02, 0x00, 0x00, 0x00,\r\n", 740 | " 0x19, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x07, 0x00, 0x00, 0x00,\r\n", 741 | " 0x08, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09,\r\n", 742 | " 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x0c, 0x00,\r\n", 743 | " 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x00, 0x00,\r\n", 744 | " 0x00, 0x00, 0x00, 0x16, 0x16, 0x00, 0x00, 0x00\r\n", 745 | "};\r\n", 746 | "unsigned int model_data_LED_model_quantized_tflite_len = 8864;\r\n" 747 | ] 748 | } 749 | ], 750 | "source": [ 751 | "!xxd -i model_data/LED_model_quantized.tflite > model_data/LED_model_quantized.cc\n", 752 | "!head -n 10 model_data/LED_model_quantized.cc && echo \"...\" && tail -n 10 model_data/LED_model_quantized.cc" 753 | ] 754 | }, 755 | { 756 | "cell_type": "markdown", 757 | "id": "lasting-acoustic", 758 | "metadata": {}, 759 | "source": [ 760 | "## Loading the Model into the Arduino\n", 761 | "\n", 762 | "We're now ready to load the model onto the Arduino Nano 33 Sense! \n", 763 | "\n", 764 | "### Overview of the project files\n", 765 | "\n", 766 | "So now that we have our `LED_model_quantized.cc`, let's look at how to load this. First up, here's a quick overview of the files in the `Arduino_CurrentSense_ML` directory:\n", 767 | "\n", 768 | "* `arduino_constants.cpp` - Some constants used in the project.\n", 769 | "* `arduino_main.cpp` - The `setup()` and `loop()` functions used by Arduino IDE\n", 770 | "* `arduino_output_handler.cpp` - The output handler for the output from the model inference.\n", 771 | "* `constants.h` - More constants.\n", 772 | "* `current_ML.ino` - the main project file! Sets up the model, loads the data, passes the output to the `output_handler`.\n", 773 | "* `main_functions.h` - main function headers\n", 774 | "* `model.cpp` - the model itself! Copied from `LED_model_quantized.cc`\n", 775 | "* `model.h` - model header definitions\n", 776 | "* `output_handler.h` - output handler header definitions.\n", 777 | "\n", 778 | "If you haven't already, copy the model details, the array and size variable, from `LED_model_quantized.cc` into `model.cpp`, ensuring to fix the variable names in `current_ML.ino` if required.\n", 779 | "\n", 780 | "### Walking through the Firmware Code\n", 781 | "\n", 782 | "We won't go through the whole of the code in the project, but will outline the main part! \n", 783 | "\n", 784 | "The `setup()` function in `current_ML.ino` is almost identical to the `hello_world` TFLite example code - it loads the model as `g_model`, finds the input/output tensors, stores their addresses, etc. etc. It also setups up the INA219 device, and yes, employs my _dirrrrty hack_ from earlier :P \n", 785 | "\n", 786 | "We have some other functions to load the data - `load_data()` function is our loader:\n", 787 | "\n", 788 | "```c\n", 789 | "void load_data(const int8_t * data, TfLiteTensor * input)\n", 790 | "{\n", 791 | " for (int i = 0; i < 16; ++i)\n", 792 | " {\n", 793 | " input->data.int8[i] = data[i];\n", 794 | " }\n", 795 | "}\n", 796 | "```\n", 797 | "In the main `loop()` we have the same function loop as we did before, but this time adjusting based on the pre-loaded scale and zero point that TF Lite calculated for us when we quantized the model. These are stored in `input->params.scale` and `input->params.zero_point` respectively.\n", 798 | "```c \n", 799 | "int param;\n", 800 | "for(i=0;i < 16; i += 1){\n", 801 | " param = ina219.getCurrent_raw();\n", 802 | " // scale the input...\n", 803 | " curr_array[i] = param / input->params.scale + input->params.zero_point;\n", 804 | "}\n", 805 | "load_data(curr_array, input);\n", 806 | "```\n", 807 | "\n", 808 | "We run the model on the input tensor we have setup by running `TfLiteStatus invoke_status = interpreter->Invoke();`, and if there are no errors, we then get the outputs from the inference (which are `float32`) and pass these to `HandleOutput`:\n", 809 | "```c\n", 810 | "float y_1 = output->data.f[0]; // get last byte of output...\n", 811 | "float y_2 = output->data.f[1];\n", 812 | "HandleOutput(error_reporter, y_1, y_2);\n", 813 | "```\n", 814 | "\n", 815 | "From here, we process these outputs as follows:\n", 816 | "```c\n", 817 | "void HandleOutput(tflite::ErrorReporter* error_reporter, float x_1, float x_2) {\n", 818 | " // Do this only once\n", 819 | " if (!initialized) {\n", 820 | " // Set the LED pin to output\n", 821 | " pinMode(led, OUTPUT);\n", 822 | " initialized = true;\n", 823 | " }\n", 824 | "\n", 825 | " bool output = (x_2 == 0) ? LOW : HIGH; // we'll just use x_2, but can add for x_1 as well... \n", 826 | " // if the previous outputs are the same as the current, then the LED is likely in a stable state;\n", 827 | " // this is to remove noisey false readings from the model. -MC\n", 828 | " if (prev_out[0] == prev_out[1] && prev_out[1] == output){\n", 829 | " digitalWrite(led, output);\n", 830 | " }\n", 831 | "\n", 832 | " TF_LITE_REPORT_ERROR(error_reporter, \"LED guess: %d\\n\", output);\n", 833 | " prev_out[0] = prev_out[1];\n", 834 | " prev_out[1] = output;\n", 835 | "}\n", 836 | "```\n", 837 | "\n", 838 | "The output handler looks at the current and previous two outputs and determines if the LED is ON or OFF based on these three all agreeing. This is to clean up the siginal which is pretty noisey by itself. The result, though, is a reasonably good detection for the LED being powered or not, solely from inference on data from stock, off the shelf parts! Just add a touch of ML..." 839 | ] 840 | }, 841 | { 842 | "cell_type": "markdown", 843 | "id": "necessary-nowhere", 844 | "metadata": {}, 845 | "source": [ 846 | "# Conclusions\n", 847 | "\n", 848 | "Well, in case you missed it, it works! It's flaky as anything, as seen by the intermitten blinking, but it does work! Here's a PoC GIF for the curious:\n", 849 | "\n", 850 | "![PoC](media/proof_of_concept.gif)\n", 851 | "\n", 852 | "## Known Issues\n", 853 | "\n", 854 | "So, there are some things I have noticed whilst playing with this model and deploying it. We'll take this as a 'things you can try to fix for yourself' (the lab has some WIP fixes for this and other projects on the way).\n", 855 | "\n", 856 | "**1** Sometimes, the model inverts - it will activate on the LED being OFF, and never activate on being ON. Moving the target around actually seems to affect this, so my guess is there is some response to parasitic capacitance. The fix is likely - use shorter power leads to the target! (**Update** - this is mostly fixed now -MC)\n", 857 | "\n", 858 | "**2** The code needs a lot of reworking - there are many areas where speed can be improved or things can be done better. Feel free to make a PR!\n", 859 | "\n", 860 | "## Why an INA219?\n", 861 | "\n", 862 | "It's probably natural to ask _But why an INA219? Why not an ADC that's built in?!?_ If you've played around with electronics, you've probably built a current monitor with a microcontroller, and might think that the INA219 is misplaced or overkill to use one... Well, there are a few reasons we consider for using the INA219. \n", 863 | "\n", 864 | "First up, I didn't want to have to start adding requirements for a solid `AREF` for a start - yes, you can get low-dropout regulators like the `LM2937` or similar, and yes, these would do the job, but it's more parts, more things to setup, and it could complicate the setup.\n", 865 | "\n", 866 | "Second reason is that of specialisation - the INA219 is specifically designed for this task! And the breakout boards are inexpensive, easy to come by, and readily available. Yes, the ADCs are already there, but they would require extra work to meet the requriements for the things the INA219 already does. \n", 867 | "\n", 868 | "Lastly, that of portability - in theory, using a part that communicates in I2C means that you don't _need_ an Arduino Nano 33 Sense to make this project work! In theory, you can plug in any microcontroller, re-run the training code, recompile and redeploy in short order; all without having to worry about ADC specifics for a different microcontroller.\n", 869 | "\n", 870 | "## Future Work\n", 871 | "\n", 872 | "This idea can easily be extended to other sensors and for other target types! We wanted to show that a roughly 2mA difference in operation could still be identifiable without any major reworking of PCBs or parts, effectively running this off the shelf. This design could be quickly extended to monitor USB current, Hall Effect sensors, or other unusual situations where a TinyML model could do something useful or cool! \n", 873 | "\n", 874 | "## Further Reading\n", 875 | "\n", 876 | "There is a growing body of resources for TinyML, but the most relevant reference as of writing this PoC (Mar'21) is \"TinyML\" by Pete Warden and Daniel Situnayake, published by O'Reilly - \n", 877 | "\n", 878 | "[https://www.oreilly.com/library/view/tinyml/9781492052036/](https://www.oreilly.com/library/view/tinyml/9781492052036/)\n", 879 | "\n", 880 | "For those who want to just 'dive in', the TensorFlow Lite website has a plethora of information, and the GitHub for TF Lite for Micro Controllers has many example code projects and jupyter notebooks to work through, explaining how 'magic wand' and 'watchword' models work, which are really good examples: \n", 881 | "\n", 882 | "[https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/micro](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/micro)\n", 883 | "\n", 884 | "As I mentioned before, [Google's ML Crash Course](https://developers.google.com/machine-learning/crash-course/descending-into-ml/training-and-loss) is another really good resource in case you have more general or background quesitons about machine learning.\n", 885 | "\n", 886 | "If you would like some more formal qualifications that deal with Embedded/TinyML, have a look at the following:\n", 887 | "* [Harvard's Embedded ML Course](https://www.edx.org/professional-certificate/harvardx-tiny-machine-learning) on EDX\n", 888 | "* [Edge Impulse's TinyML Coruse](https://www.coursera.org/learn/introduction-to-embedded-machine-learning) on Coursera\n", 889 | "\n", 890 | "**Thanks for your attention, and Happy Hacking!**" 891 | ] 892 | } 893 | ], 894 | "metadata": { 895 | "kernelspec": { 896 | "display_name": "Python 3", 897 | "language": "python", 898 | "name": "python3" 899 | }, 900 | "language_info": { 901 | "codemirror_mode": { 902 | "name": "ipython", 903 | "version": 3 904 | }, 905 | "file_extension": ".py", 906 | "mimetype": "text/x-python", 907 | "name": "python", 908 | "nbconvert_exporter": "python", 909 | "pygments_lexer": "ipython3", 910 | "version": "3.8.8" 911 | } 912 | }, 913 | "nbformat": 4, 914 | "nbformat_minor": 5 915 | } 916 | -------------------------------------------------------------------------------- /media/LED_model.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Santandersecurityresearch/CurrentSense-TinyML/ee0b04c33f2b7cbfd6a446c4f724591ddd64d363/media/LED_model.png -------------------------------------------------------------------------------- /media/LED_model_quantized.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Santandersecurityresearch/CurrentSense-TinyML/ee0b04c33f2b7cbfd6a446c4f724591ddd64d363/media/LED_model_quantized.png -------------------------------------------------------------------------------- /media/currentsense-ML-init.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Santandersecurityresearch/CurrentSense-TinyML/ee0b04c33f2b7cbfd6a446c4f724591ddd64d363/media/currentsense-ML-init.png -------------------------------------------------------------------------------- /media/currentsense-ML-photo.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Santandersecurityresearch/CurrentSense-TinyML/ee0b04c33f2b7cbfd6a446c4f724591ddd64d363/media/currentsense-ML-photo.jpeg -------------------------------------------------------------------------------- /media/currentsense-ML-schematic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Santandersecurityresearch/CurrentSense-TinyML/ee0b04c33f2b7cbfd6a446c4f724591ddd64d363/media/currentsense-ML-schematic.png -------------------------------------------------------------------------------- /media/proof_of_concept.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Santandersecurityresearch/CurrentSense-TinyML/ee0b04c33f2b7cbfd6a446c4f724591ddd64d363/media/proof_of_concept.gif -------------------------------------------------------------------------------- /media/tensorflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Santandersecurityresearch/CurrentSense-TinyML/ee0b04c33f2b7cbfd6a446c4f724591ddd64d363/media/tensorflow.png -------------------------------------------------------------------------------- /model_data/LED_model.tflite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Santandersecurityresearch/CurrentSense-TinyML/ee0b04c33f2b7cbfd6a446c4f724591ddd64d363/model_data/LED_model.tflite -------------------------------------------------------------------------------- /model_data/LED_model_quantized.cc: -------------------------------------------------------------------------------- 1 | unsigned char model_data_LED_model_quantized_tflite[] = { 2 | 0x24, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x00, 0x00, 0x00, 0x00, 3 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x1c, 0x00, 0x04, 0x00, 4 | 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x18, 0x00, 5 | 0x12, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xfc, 0x21, 0x00, 0x00, 6 | 0x40, 0x18, 0x00, 0x00, 0x28, 0x18, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 7 | 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 8 | 0x08, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 9 | 0x08, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 10 | 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 11 | 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x00, 0x0f, 0x00, 0x00, 0x00, 12 | 0xd4, 0x17, 0x00, 0x00, 0xc0, 0x17, 0x00, 0x00, 0xa4, 0x16, 0x00, 0x00, 13 | 0x90, 0x15, 0x00, 0x00, 0x6c, 0x15, 0x00, 0x00, 0x48, 0x15, 0x00, 0x00, 14 | 0x34, 0x11, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 15 | 0x80, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 16 | 0x44, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 17 | 0xae, 0xe7, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 18 | 0x31, 0x2e, 0x35, 0x2e, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 19 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 20 | 0x00, 0x00, 0x00, 0x00, 0x14, 0xe1, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 21 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xe1, 0xff, 0xff, 22 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 23 | 0x34, 0xe1, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 24 | 0x00, 0x00, 0x00, 0x00, 0x44, 0xe1, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 25 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0xe1, 0xff, 0xff, 26 | 0x00, 0x00, 0x00, 0x00, 0x1e, 0xe8, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 27 | 0x80, 0x00, 0x00, 0x00, 0x55, 0x3c, 0x28, 0xe7, 0xdc, 0x20, 0xca, 0x2e, 28 | 0x12, 0x61, 0x14, 0xa2, 0xb2, 0x25, 0x15, 0x2b, 0x31, 0x5b, 0xf6, 0xb0, 29 | 0x0d, 0x4e, 0x73, 0xec, 0xa8, 0xc3, 0xef, 0xd4, 0x23, 0x07, 0x32, 0xeb, 30 | 0x3d, 0x08, 0xdc, 0x50, 0xeb, 0xb3, 0xc5, 0x28, 0x33, 0xf9, 0x04, 0x41, 31 | 0x91, 0xbc, 0x06, 0x88, 0xdb, 0x13, 0x3b, 0x3d, 0x2a, 0xc9, 0xd5, 0x7f, 32 | 0xf1, 0xdc, 0xb7, 0xde, 0xac, 0xf4, 0x7b, 0x03, 0xcc, 0xf4, 0xa3, 0xf2, 33 | 0x6e, 0x23, 0x47, 0xcd, 0x15, 0xb9, 0x0b, 0x36, 0x3a, 0xa1, 0x3b, 0x07, 34 | 0xc5, 0xdc, 0x13, 0x51, 0x35, 0xe5, 0x98, 0x17, 0x48, 0x52, 0x23, 0x50, 35 | 0xbf, 0xdd, 0xa7, 0xe5, 0xe5, 0xf2, 0x03, 0xb8, 0x28, 0x2f, 0x44, 0xf1, 36 | 0x1f, 0xf5, 0x2e, 0xec, 0x53, 0x30, 0x0a, 0x2a, 0x4c, 0xd5, 0xf1, 0xb4, 37 | 0xdb, 0x2f, 0xd4, 0xa9, 0x21, 0xe6, 0x31, 0x4b, 0x34, 0x18, 0xbc, 0xba, 38 | 0x00, 0x00, 0x00, 0x00, 0xae, 0xe8, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 39 | 0x00, 0x10, 0x00, 0x00, 0xff, 0xe5, 0x02, 0xf8, 0x09, 0x01, 0x02, 0xfd, 40 | 0x0a, 0xfe, 0x03, 0x10, 0x03, 0xfd, 0xfd, 0xf5, 0x0b, 0xfb, 0xff, 0xff, 41 | 0x00, 0xfe, 0x04, 0xfe, 0x0a, 0xff, 0xf4, 0x02, 0x05, 0x0b, 0x04, 0x0b, 42 | 0x0b, 0xf8, 0x01, 0xfd, 0x07, 0xfd, 0xf6, 0xfa, 0xfe, 0xfe, 0x00, 0xf5, 43 | 0x08, 0x09, 0x00, 0xf5, 0xfa, 0xfa, 0x0d, 0x0c, 0xff, 0xff, 0xf5, 0x08, 44 | 0xf8, 0xfc, 0x04, 0x0d, 0x09, 0xf9, 0x17, 0xf9, 0x0e, 0x0a, 0xec, 0xf6, 45 | 0xfd, 0xe2, 0x01, 0x04, 0xfd, 0xff, 0xf4, 0x0c, 0x0d, 0xf0, 0xfb, 0xfb, 46 | 0xff, 0xff, 0x14, 0x12, 0x0c, 0x01, 0xee, 0x08, 0x00, 0xfb, 0x05, 0x0f, 47 | 0xf8, 0xf8, 0x0a, 0xea, 0x02, 0xf5, 0x0f, 0x00, 0x08, 0x09, 0x09, 0x09, 48 | 0xf5, 0xfa, 0xf9, 0xfd, 0x02, 0xf3, 0x04, 0xec, 0xf4, 0x04, 0xf8, 0x08, 49 | 0x1f, 0xf5, 0xf5, 0xfc, 0xfc, 0x14, 0xeb, 0xfd, 0x01, 0xf4, 0xf7, 0x06, 50 | 0xfc, 0x01, 0x0b, 0xe8, 0xfe, 0x05, 0x06, 0x06, 0x0a, 0xfa, 0xfa, 0x04, 51 | 0x00, 0x05, 0x05, 0xf9, 0x01, 0x02, 0xf1, 0xff, 0x00, 0x0a, 0xf4, 0x03, 52 | 0x07, 0x0a, 0x02, 0x0c, 0x05, 0xfa, 0x09, 0x05, 0x02, 0xfd, 0x00, 0x07, 53 | 0x04, 0xdf, 0xf8, 0xf8, 0xfa, 0xff, 0xfa, 0x09, 0xf9, 0x0a, 0x00, 0xfb, 54 | 0xf8, 0xff, 0xf6, 0x00, 0xf7, 0xfa, 0x0c, 0xfa, 0x00, 0xff, 0x03, 0xf4, 55 | 0x09, 0x05, 0xf7, 0xfe, 0xf9, 0x01, 0xfd, 0xfe, 0xef, 0xf7, 0x06, 0x02, 56 | 0xfb, 0xf7, 0xfb, 0x09, 0xf4, 0x09, 0xf6, 0xf7, 0xff, 0x03, 0xf6, 0xfa, 57 | 0x03, 0x08, 0x05, 0xf7, 0xff, 0xf9, 0x0a, 0xff, 0x06, 0xfc, 0x06, 0x03, 58 | 0xf5, 0xf1, 0x00, 0x06, 0x00, 0x05, 0x04, 0x01, 0x09, 0xff, 0xfe, 0x03, 59 | 0xf7, 0xf8, 0xfe, 0x05, 0xfd, 0xfe, 0xfc, 0x04, 0x06, 0xf7, 0x01, 0xfb, 60 | 0x09, 0xf7, 0xf4, 0xfe, 0x02, 0x04, 0x06, 0x00, 0x0c, 0x06, 0x06, 0xfb, 61 | 0x09, 0x04, 0xf5, 0x0a, 0xfa, 0x0a, 0x04, 0x05, 0x03, 0x01, 0xfd, 0xff, 62 | 0x09, 0xfe, 0xf0, 0xfe, 0x03, 0xf6, 0x00, 0x0a, 0xf5, 0x00, 0x0d, 0x06, 63 | 0x09, 0x06, 0xf9, 0x0b, 0xf8, 0xfe, 0xf6, 0xfd, 0xfe, 0xfe, 0xff, 0xfd, 64 | 0x09, 0x03, 0xfb, 0xf6, 0x08, 0x08, 0xf5, 0x04, 0x0b, 0x06, 0xf2, 0xf9, 65 | 0x0c, 0x08, 0xfc, 0xf9, 0xf9, 0xfb, 0x0c, 0xfe, 0x08, 0x0b, 0x04, 0x02, 66 | 0xfe, 0x03, 0xfa, 0xfa, 0xf3, 0xf1, 0xf7, 0xfb, 0xf7, 0xfb, 0x02, 0x09, 67 | 0xf7, 0x06, 0x06, 0xf5, 0xfa, 0x02, 0x0b, 0x08, 0xfa, 0xff, 0xf8, 0xf7, 68 | 0x0b, 0xfe, 0xf4, 0x05, 0x04, 0xfd, 0xfb, 0x09, 0xf7, 0xef, 0x09, 0xff, 69 | 0xf6, 0x03, 0xff, 0xfd, 0xfa, 0xfd, 0xf9, 0xfc, 0xf9, 0xf6, 0x07, 0xf8, 70 | 0x04, 0x08, 0x07, 0xf4, 0x01, 0x04, 0x05, 0xfd, 0xfd, 0x01, 0xed, 0xfe, 71 | 0xf9, 0x01, 0x09, 0x05, 0x06, 0xfd, 0x04, 0x03, 0x0a, 0x02, 0xfd, 0xfc, 72 | 0xf6, 0x02, 0x04, 0x0e, 0x0a, 0x08, 0x08, 0x08, 0x00, 0x01, 0xfc, 0x01, 73 | 0xfd, 0xf4, 0x0f, 0x10, 0x04, 0x0e, 0x0d, 0x07, 0xf6, 0x06, 0xf6, 0x1b, 74 | 0x0f, 0x08, 0xf2, 0x0a, 0xfd, 0x03, 0x09, 0x09, 0xf8, 0x0c, 0x06, 0x04, 75 | 0x03, 0x0a, 0x0b, 0x0b, 0x06, 0x00, 0x0f, 0x06, 0x0e, 0x11, 0xfd, 0xf8, 76 | 0x05, 0x0a, 0x00, 0x1c, 0xff, 0x02, 0xfe, 0x02, 0x0c, 0xfa, 0xff, 0xf4, 77 | 0x01, 0x8a, 0xe4, 0xf8, 0x05, 0x01, 0xfa, 0x06, 0x05, 0x22, 0xf4, 0xff, 78 | 0xf0, 0x04, 0x07, 0x12, 0x02, 0x0b, 0xfc, 0x09, 0x01, 0xff, 0x01, 0xac, 79 | 0xfc, 0x0b, 0x16, 0xea, 0x05, 0xe2, 0xfd, 0xfe, 0xf8, 0xfd, 0x29, 0xf6, 80 | 0xfd, 0x06, 0x01, 0xfb, 0xfd, 0xfe, 0xfc, 0xf0, 0x05, 0x03, 0x02, 0x01, 81 | 0xfe, 0xf8, 0x10, 0xff, 0x04, 0xf4, 0x01, 0xfe, 0x0a, 0x00, 0x14, 0xfc, 82 | 0x02, 0xf5, 0x01, 0xfa, 0xf6, 0xfc, 0xfd, 0xf2, 0x0a, 0x06, 0xf5, 0xf6, 83 | 0xfb, 0xf8, 0xf5, 0xff, 0xfa, 0x04, 0xf5, 0x03, 0xf5, 0xf4, 0xfd, 0xf2, 84 | 0x02, 0xfc, 0xf6, 0xf8, 0x0b, 0xf6, 0x00, 0xfd, 0x00, 0xfa, 0xfd, 0x0b, 85 | 0xff, 0x00, 0xf1, 0xf1, 0xfc, 0x00, 0xf8, 0x01, 0x09, 0x00, 0x06, 0xf0, 86 | 0x04, 0xfe, 0xf8, 0xf8, 0xf3, 0x06, 0xf8, 0x02, 0xfe, 0x10, 0xfa, 0x06, 87 | 0xf4, 0xf2, 0xf9, 0x00, 0x00, 0xf0, 0xfd, 0x0f, 0x00, 0x04, 0xf9, 0xf8, 88 | 0x03, 0xf7, 0x11, 0xfa, 0x01, 0xfe, 0x01, 0x04, 0xfb, 0xfb, 0xfe, 0xfc, 89 | 0xfa, 0xf0, 0xf4, 0xfa, 0xf5, 0xf4, 0x0a, 0xff, 0x09, 0xfd, 0xf8, 0xfa, 90 | 0x03, 0xff, 0xf3, 0xfb, 0x0a, 0xfe, 0x07, 0xfd, 0xf8, 0x07, 0x08, 0xfe, 91 | 0xf9, 0xff, 0xf4, 0x05, 0xf5, 0xfd, 0x07, 0x07, 0x08, 0xf7, 0x02, 0x06, 92 | 0xf9, 0xfa, 0x00, 0xf6, 0x0a, 0xff, 0xfb, 0x09, 0x00, 0x01, 0x05, 0x0b, 93 | 0xfa, 0x01, 0xfc, 0xfe, 0xf8, 0x08, 0xfd, 0x00, 0x01, 0x00, 0xfe, 0xf8, 94 | 0x04, 0xf6, 0x04, 0xf3, 0x00, 0xf6, 0x07, 0x08, 0x0b, 0x01, 0x06, 0xf1, 95 | 0x0b, 0xfa, 0xfe, 0xf6, 0x04, 0xf3, 0x04, 0xfe, 0x02, 0xf9, 0xfa, 0xf6, 96 | 0xfb, 0x01, 0xf9, 0x04, 0x02, 0x06, 0x00, 0xfe, 0x01, 0xf6, 0x01, 0xfe, 97 | 0x03, 0xff, 0xfe, 0xf4, 0xfc, 0xf8, 0xf6, 0x01, 0x07, 0xf4, 0xfe, 0x0b, 98 | 0x07, 0x0d, 0xf6, 0xfb, 0x07, 0xfe, 0xfa, 0xfd, 0x03, 0xfc, 0x09, 0xf3, 99 | 0xfd, 0xf9, 0xfb, 0x02, 0x12, 0x0b, 0xf9, 0xf7, 0xfd, 0xf9, 0x0a, 0xed, 100 | 0x04, 0x05, 0xff, 0xfe, 0x06, 0xe4, 0x0f, 0x07, 0x04, 0xfa, 0x06, 0x0d, 101 | 0x02, 0x01, 0x04, 0x00, 0x07, 0x03, 0x06, 0x08, 0xf5, 0x09, 0x01, 0x00, 102 | 0xff, 0x04, 0xff, 0x00, 0xff, 0x0c, 0xf9, 0x0a, 0x05, 0xef, 0x07, 0xf6, 103 | 0xfd, 0xfb, 0xf8, 0x0a, 0x06, 0x03, 0x0c, 0x09, 0xf9, 0x07, 0xf5, 0x0b, 104 | 0x02, 0xfe, 0xf8, 0x00, 0xfe, 0x00, 0x0c, 0xfa, 0xf7, 0x08, 0x05, 0x0c, 105 | 0xf8, 0xf4, 0x0e, 0x02, 0x02, 0x05, 0xf9, 0x06, 0xf9, 0xfe, 0xfd, 0x08, 106 | 0x0c, 0x05, 0xfd, 0xfa, 0xfd, 0x07, 0xfe, 0xff, 0xf7, 0xf7, 0xf8, 0xfa, 107 | 0xf6, 0xfa, 0x02, 0xfc, 0x03, 0xf9, 0xfa, 0x07, 0x04, 0x03, 0xff, 0x05, 108 | 0xff, 0x0c, 0x04, 0x0a, 0x04, 0xf8, 0x06, 0x07, 0x01, 0x05, 0x08, 0xff, 109 | 0x03, 0x03, 0x05, 0x08, 0x0b, 0xf9, 0x0c, 0xf5, 0xfe, 0x06, 0x01, 0x07, 110 | 0xfc, 0xfd, 0xf4, 0xff, 0xf9, 0x10, 0x00, 0xff, 0x0c, 0xff, 0xf4, 0x0b, 111 | 0xfd, 0xfd, 0x08, 0xea, 0xfd, 0xff, 0xfd, 0x05, 0xfe, 0xfa, 0xf7, 0x07, 112 | 0x05, 0x02, 0x0a, 0xf6, 0x00, 0xf6, 0x09, 0xfb, 0xf3, 0xf2, 0xfd, 0x06, 113 | 0x03, 0x03, 0x08, 0x08, 0x0b, 0x05, 0xfd, 0x02, 0xe4, 0x04, 0xf8, 0x07, 114 | 0xfb, 0xfe, 0xf3, 0xf2, 0x0b, 0x0a, 0xe3, 0xfb, 0x02, 0x04, 0xf0, 0xf9, 115 | 0xf1, 0x0c, 0xf2, 0xeb, 0xf7, 0x07, 0x04, 0x0d, 0xf3, 0xf8, 0xfe, 0x06, 116 | 0x00, 0x08, 0xfe, 0x15, 0x00, 0x09, 0x02, 0xf4, 0xff, 0xef, 0xe6, 0x00, 117 | 0x0b, 0xe2, 0xfc, 0x08, 0x02, 0xf8, 0x01, 0x05, 0x00, 0x16, 0xfc, 0x09, 118 | 0xf0, 0xeb, 0x01, 0xf0, 0xfa, 0x03, 0x25, 0x06, 0x02, 0x13, 0x07, 0xff, 119 | 0xfc, 0xf2, 0x0b, 0x04, 0xf1, 0xfb, 0x01, 0xfb, 0x00, 0x00, 0xf7, 0xf5, 120 | 0xf6, 0x0c, 0x05, 0xf9, 0xfb, 0x05, 0xf1, 0xfd, 0xf7, 0x04, 0xf6, 0x03, 121 | 0x08, 0xf8, 0x06, 0xf5, 0xf7, 0xfc, 0x0c, 0xf9, 0xfd, 0x01, 0xfd, 0x0b, 122 | 0xfa, 0xe4, 0xfe, 0x03, 0xf5, 0xea, 0xf9, 0xfa, 0xff, 0x03, 0xf7, 0xf3, 123 | 0x02, 0xfc, 0x08, 0x03, 0x09, 0x03, 0xf9, 0x03, 0xf4, 0xfb, 0x05, 0xf8, 124 | 0xf1, 0xff, 0xf8, 0x13, 0x04, 0xf0, 0x04, 0xf6, 0x05, 0x0a, 0x04, 0xf5, 125 | 0x07, 0x00, 0x03, 0xf9, 0x04, 0xef, 0x0a, 0x08, 0x00, 0x02, 0xf3, 0x01, 126 | 0xfe, 0xf0, 0x09, 0xf5, 0xfa, 0xfe, 0xfb, 0xfa, 0x02, 0x11, 0xf3, 0x01, 127 | 0x09, 0xf8, 0xfc, 0x01, 0xf2, 0x05, 0xfb, 0xf2, 0xf9, 0x00, 0xf7, 0x0a, 128 | 0xf8, 0xff, 0x05, 0xe3, 0x05, 0x0c, 0x01, 0x0c, 0xfd, 0xf9, 0xf0, 0x00, 129 | 0x01, 0xf5, 0x00, 0x07, 0x01, 0x04, 0xfe, 0xee, 0xf6, 0x05, 0x06, 0x01, 130 | 0x05, 0xfa, 0xfa, 0x0c, 0xf8, 0xfb, 0xfc, 0x01, 0xf8, 0x05, 0xff, 0x05, 131 | 0x01, 0x01, 0x08, 0x03, 0x05, 0x05, 0x05, 0xf1, 0x04, 0xff, 0xfd, 0x00, 132 | 0x03, 0x07, 0xfa, 0x00, 0x02, 0x04, 0x06, 0x09, 0xfc, 0x03, 0x06, 0xfc, 133 | 0x06, 0x04, 0x03, 0xff, 0xf7, 0xf7, 0xf7, 0xff, 0x07, 0x04, 0x08, 0x08, 134 | 0x04, 0x01, 0xff, 0xfb, 0x05, 0xff, 0x13, 0xfa, 0x02, 0x04, 0x03, 0x04, 135 | 0xf8, 0x02, 0xfb, 0x0c, 0xfd, 0x18, 0xee, 0xf8, 0x02, 0x09, 0x05, 0xfd, 136 | 0x0b, 0x0b, 0x0b, 0x01, 0xfc, 0xfe, 0xf4, 0xfd, 0xf5, 0x04, 0x19, 0x11, 137 | 0x06, 0xfb, 0x08, 0x1e, 0xf7, 0x07, 0xfb, 0x1d, 0x09, 0xfe, 0xf8, 0x00, 138 | 0x04, 0xda, 0x09, 0x08, 0xfc, 0x1a, 0xeb, 0x09, 0x00, 0xfb, 0xfb, 0xf8, 139 | 0x07, 0xf5, 0xfe, 0x10, 0xf3, 0x03, 0xfd, 0xf3, 0xf5, 0xf8, 0x03, 0x0d, 140 | 0x12, 0x0d, 0xfa, 0x07, 0xed, 0x04, 0xfb, 0xf9, 0xea, 0x13, 0xf4, 0x10, 141 | 0x0a, 0x08, 0xe6, 0xf9, 0x0c, 0x1b, 0xfb, 0x00, 0x08, 0x0b, 0x0e, 0xff, 142 | 0x01, 0xf2, 0x0a, 0x09, 0x04, 0xf8, 0xf8, 0x09, 0x09, 0x0c, 0x13, 0xfb, 143 | 0xfd, 0xf2, 0xf3, 0x18, 0x16, 0x10, 0xef, 0x08, 0xfa, 0x12, 0x02, 0xf3, 144 | 0xf5, 0xf9, 0x06, 0x0c, 0xfe, 0xf9, 0x03, 0x11, 0x0b, 0xf8, 0x1e, 0xf1, 145 | 0x04, 0x0c, 0xf7, 0x0c, 0xf5, 0x0b, 0xee, 0x01, 0x03, 0xf0, 0x00, 0x0a, 146 | 0xeb, 0x09, 0xf3, 0x06, 0x05, 0x0b, 0xfd, 0xfd, 0x03, 0xfd, 0x10, 0xfc, 147 | 0x04, 0x04, 0x04, 0x06, 0xf3, 0xf4, 0xfd, 0xff, 0x0a, 0xfe, 0x0e, 0xfd, 148 | 0xf9, 0x04, 0x02, 0x15, 0xfb, 0x05, 0xf6, 0x11, 0x11, 0xf1, 0xf5, 0xfd, 149 | 0xfb, 0x02, 0x0d, 0xf3, 0xf8, 0xf8, 0x08, 0x0a, 0x02, 0x06, 0xfb, 0x12, 150 | 0x0b, 0xfb, 0x0f, 0xfe, 0x0c, 0x01, 0x03, 0xf7, 0xeb, 0x0c, 0x01, 0x03, 151 | 0xf6, 0xfe, 0x14, 0x0a, 0x00, 0x01, 0xff, 0x01, 0x05, 0x02, 0x06, 0x01, 152 | 0x01, 0x05, 0x0c, 0x04, 0xfc, 0x02, 0xf8, 0x06, 0x02, 0xfc, 0xfa, 0xfd, 153 | 0x06, 0x09, 0xfe, 0x01, 0x00, 0xf8, 0x00, 0x06, 0x06, 0xfb, 0x11, 0x08, 154 | 0x04, 0xf4, 0x06, 0x03, 0x05, 0x05, 0x05, 0x00, 0xf5, 0xfa, 0x09, 0xfe, 155 | 0xf7, 0xf6, 0xfc, 0x06, 0xf9, 0xfb, 0x07, 0x06, 0x00, 0x01, 0x0d, 0x05, 156 | 0xf8, 0x09, 0x03, 0xfb, 0xfc, 0x07, 0x03, 0x0a, 0xf7, 0x08, 0xfe, 0x01, 157 | 0x03, 0xe7, 0x02, 0x02, 0x03, 0x01, 0x07, 0x04, 0xf8, 0xf6, 0x02, 0xf7, 158 | 0x10, 0x05, 0xf4, 0x12, 0x01, 0xf9, 0xfd, 0xfc, 0x09, 0xe7, 0xea, 0xff, 159 | 0xfd, 0xfd, 0xfc, 0x03, 0x05, 0x01, 0x01, 0xfa, 0xfe, 0xfe, 0xf1, 0x00, 160 | 0xfd, 0x01, 0xff, 0xff, 0x03, 0xed, 0x04, 0x00, 0x01, 0xf9, 0x02, 0x07, 161 | 0x07, 0x03, 0x02, 0x00, 0x06, 0xfb, 0x04, 0x06, 0xfd, 0xff, 0xfe, 0xf3, 162 | 0x04, 0x05, 0xf8, 0x0a, 0x03, 0x05, 0xfd, 0xff, 0xfb, 0x03, 0x01, 0x05, 163 | 0x06, 0x16, 0xf2, 0x01, 0x13, 0x00, 0x1a, 0xf9, 0xfe, 0xf9, 0xff, 0x03, 164 | 0x03, 0x13, 0x07, 0xd3, 0xf6, 0x06, 0xf9, 0x12, 0x0a, 0xfa, 0xf4, 0x0f, 165 | 0x0c, 0x15, 0x27, 0xfd, 0x04, 0xff, 0x16, 0xfd, 0x06, 0xf5, 0xff, 0xfd, 166 | 0x09, 0x04, 0x0a, 0x11, 0x0d, 0x06, 0xf4, 0x07, 0xed, 0x02, 0xed, 0x0b, 167 | 0x17, 0xef, 0x0b, 0xfb, 0x00, 0xfc, 0x05, 0xf7, 0x0a, 0xf6, 0x08, 0x05, 168 | 0x00, 0x08, 0xfc, 0xf9, 0xf7, 0x01, 0xfe, 0x00, 0x08, 0xf3, 0x0a, 0x0b, 169 | 0x07, 0x03, 0xff, 0x04, 0x02, 0x09, 0x07, 0x01, 0xf9, 0x05, 0xf9, 0xfd, 170 | 0x01, 0x04, 0xf5, 0xf5, 0x04, 0xff, 0x02, 0x09, 0x07, 0xf5, 0xfd, 0xf6, 171 | 0x06, 0xf8, 0x02, 0x04, 0x09, 0xf8, 0xff, 0xf9, 0x0a, 0x00, 0x0b, 0xfd, 172 | 0x07, 0x07, 0x0a, 0x08, 0xf8, 0x03, 0x09, 0x00, 0xf7, 0x10, 0x04, 0xfd, 173 | 0x06, 0x0b, 0xfc, 0x0a, 0xfb, 0x0d, 0xfa, 0xf5, 0xfc, 0xfe, 0x05, 0x04, 174 | 0xff, 0xfc, 0xf4, 0x02, 0x02, 0x0d, 0x03, 0x0a, 0x03, 0x04, 0xf8, 0x09, 175 | 0x02, 0x05, 0x04, 0x00, 0xf6, 0xfa, 0x00, 0x02, 0xfb, 0xfc, 0x0b, 0xfb, 176 | 0xf8, 0xff, 0xff, 0xfc, 0xf7, 0x07, 0xfa, 0x05, 0x03, 0xfe, 0xf9, 0x08, 177 | 0x05, 0xf8, 0xfe, 0x08, 0xfc, 0xee, 0x0b, 0xfb, 0x02, 0x01, 0xfd, 0x06, 178 | 0x01, 0x0f, 0x01, 0x0b, 0xf3, 0x03, 0x0c, 0x0c, 0xf5, 0x02, 0xf5, 0xfe, 179 | 0x08, 0xea, 0xf9, 0xf8, 0x01, 0x0f, 0xf9, 0xfd, 0x0c, 0xf8, 0xe9, 0x06, 180 | 0xff, 0x0d, 0x09, 0x05, 0xf4, 0xfb, 0x03, 0xed, 0x02, 0xf7, 0xfe, 0x11, 181 | 0x04, 0xfa, 0x09, 0x09, 0x03, 0x0a, 0xf2, 0x11, 0x0c, 0x04, 0x0a, 0xfd, 182 | 0x08, 0x03, 0x08, 0xf6, 0xff, 0xfe, 0x03, 0xfb, 0xfb, 0x04, 0xf1, 0xfa, 183 | 0x08, 0xff, 0xee, 0x0a, 0x06, 0xf7, 0x02, 0xfc, 0x02, 0x05, 0x06, 0x01, 184 | 0x06, 0xfb, 0x01, 0xf4, 0xfc, 0x03, 0xff, 0x0b, 0xfe, 0x00, 0x0b, 0xf9, 185 | 0x03, 0xf9, 0x09, 0x0d, 0x08, 0x09, 0x0c, 0x04, 0xfd, 0x01, 0x00, 0x09, 186 | 0x05, 0x07, 0x0a, 0xf8, 0x05, 0x08, 0x04, 0x03, 0x03, 0xff, 0x0a, 0x03, 187 | 0xfb, 0xf5, 0xf9, 0x08, 0xf6, 0x03, 0x04, 0x0a, 0x0b, 0x0b, 0xff, 0x09, 188 | 0xfe, 0xfa, 0x03, 0x0a, 0xfb, 0xfa, 0xfe, 0xfe, 0x0c, 0x07, 0x08, 0xfb, 189 | 0x04, 0xfd, 0xfb, 0x0a, 0xf9, 0x02, 0xf5, 0x00, 0x08, 0xfb, 0x08, 0x09, 190 | 0x0f, 0x03, 0x02, 0x07, 0xfd, 0x02, 0x08, 0xfd, 0xf8, 0xfb, 0xfd, 0x04, 191 | 0x06, 0x0a, 0x01, 0x02, 0x00, 0xfc, 0x07, 0x04, 0xf9, 0xf9, 0xfe, 0x05, 192 | 0xf8, 0x07, 0x02, 0x07, 0xf6, 0x02, 0xff, 0x03, 0x05, 0x03, 0xfd, 0xfd, 193 | 0xff, 0x0b, 0x04, 0xfc, 0xf7, 0x07, 0x07, 0x05, 0x08, 0x0a, 0x09, 0x0c, 194 | 0x02, 0xec, 0x0e, 0xfb, 0xf6, 0xff, 0xf0, 0xfe, 0x01, 0xf9, 0xf7, 0x0c, 195 | 0x0a, 0xeb, 0x0a, 0x04, 0x0d, 0x07, 0xfd, 0xfc, 0xf4, 0xf9, 0x00, 0xf1, 196 | 0x01, 0x09, 0xec, 0xdf, 0x00, 0xfd, 0x07, 0xf1, 0xef, 0xe6, 0xf9, 0xf9, 197 | 0xfd, 0x0b, 0xee, 0xf5, 0x04, 0xff, 0xff, 0x01, 0x0b, 0x09, 0x08, 0x00, 198 | 0x05, 0xff, 0xf0, 0xfd, 0xfe, 0x06, 0x02, 0xef, 0xfa, 0xf9, 0xf0, 0xf8, 199 | 0xeb, 0xf2, 0x14, 0xf6, 0xff, 0xf9, 0xfb, 0xf9, 0x09, 0x07, 0x03, 0x01, 200 | 0xf9, 0xfc, 0xff, 0x0d, 0x04, 0x08, 0xfa, 0x03, 0x00, 0xf9, 0xfb, 0x07, 201 | 0xff, 0x05, 0xf7, 0xf6, 0xf8, 0xfe, 0x03, 0x01, 0x03, 0xfe, 0xf4, 0xfa, 202 | 0x06, 0xfc, 0x01, 0x00, 0xf5, 0xfe, 0xfd, 0x09, 0xf5, 0xf6, 0x05, 0x07, 203 | 0x03, 0x06, 0xf8, 0x07, 0xf9, 0x06, 0x09, 0x0b, 0x01, 0xf8, 0x09, 0xf7, 204 | 0x04, 0x0c, 0x02, 0x00, 0xfd, 0x01, 0x08, 0x05, 0xfd, 0x07, 0xf1, 0x01, 205 | 0xf9, 0xff, 0xff, 0x0a, 0x03, 0xf6, 0x0a, 0xf7, 0x02, 0x05, 0xfd, 0xf4, 206 | 0xf9, 0xfd, 0xf9, 0x00, 0xf5, 0x00, 0x03, 0x04, 0x01, 0xfa, 0x0b, 0xf8, 207 | 0x0b, 0xfd, 0xff, 0xf6, 0xf2, 0xf5, 0x07, 0x06, 0x07, 0xf8, 0xf0, 0xfb, 208 | 0x06, 0x03, 0xf1, 0xf7, 0xff, 0xfb, 0xf9, 0x05, 0x08, 0xf5, 0xfc, 0xfe, 209 | 0xf6, 0x06, 0xf7, 0xf4, 0x07, 0xf9, 0xfa, 0x05, 0x00, 0xee, 0xf5, 0xff, 210 | 0xff, 0xfe, 0xfa, 0x0d, 0x02, 0xfb, 0x02, 0xf4, 0x01, 0xfd, 0xf8, 0x03, 211 | 0x05, 0xfa, 0x07, 0x06, 0x0c, 0xfe, 0x03, 0x04, 0xf9, 0xfa, 0x00, 0x00, 212 | 0xf7, 0x0b, 0x05, 0x00, 0xf9, 0x02, 0x02, 0x01, 0x05, 0x04, 0xf2, 0x03, 213 | 0x06, 0xf9, 0x0a, 0x03, 0x0a, 0x07, 0xf5, 0xfa, 0xff, 0x03, 0x02, 0x00, 214 | 0x00, 0xf7, 0xf9, 0xfa, 0xfc, 0x07, 0x09, 0x09, 0x03, 0xf5, 0x06, 0xfd, 215 | 0x07, 0x0b, 0xf7, 0x02, 0xe6, 0x08, 0xdd, 0xf3, 0xe3, 0xfc, 0xf8, 0xee, 216 | 0x03, 0xfb, 0xf3, 0x11, 0xfb, 0x09, 0x00, 0xf5, 0xec, 0x03, 0xf4, 0x00, 217 | 0x07, 0x05, 0xf8, 0x00, 0xf5, 0xff, 0x07, 0xed, 0x06, 0xfe, 0x1c, 0xec, 218 | 0x04, 0xf8, 0xf0, 0xfc, 0x02, 0x02, 0x08, 0x02, 0xf6, 0xf9, 0x04, 0xf8, 219 | 0xf9, 0x0d, 0xfa, 0xf8, 0x03, 0xfc, 0xfc, 0xfe, 0xd4, 0x04, 0x0b, 0x0d, 220 | 0xf8, 0xea, 0xfb, 0x1b, 0x04, 0xee, 0x09, 0x05, 0x04, 0xf9, 0xf8, 0x0a, 221 | 0xf5, 0x08, 0x15, 0x00, 0x09, 0x09, 0x02, 0x03, 0xfe, 0xfc, 0xfc, 0xfc, 222 | 0xf8, 0xfd, 0x11, 0xf9, 0xf3, 0xf5, 0xf8, 0x00, 0xf9, 0x0c, 0x02, 0x09, 223 | 0x01, 0x0b, 0xef, 0x14, 0x1d, 0xfb, 0x00, 0x04, 0xf8, 0xf1, 0x20, 0x06, 224 | 0xf7, 0xf6, 0x10, 0xf8, 0xf9, 0xeb, 0x04, 0x06, 0x06, 0xf1, 0x05, 0xf3, 225 | 0xef, 0x06, 0x08, 0x01, 0x01, 0xf7, 0xfb, 0x18, 0x15, 0x18, 0x1d, 0x09, 226 | 0x06, 0xf0, 0xfc, 0x04, 0x07, 0xff, 0x0a, 0x09, 0xfe, 0x02, 0xf4, 0x0d, 227 | 0xfd, 0xfe, 0x08, 0x0b, 0x07, 0xfe, 0x03, 0x0b, 0x06, 0xf2, 0x03, 0xf8, 228 | 0x03, 0xfe, 0xf7, 0x03, 0x05, 0x00, 0x00, 0xfd, 0xfe, 0xfd, 0x03, 0x02, 229 | 0x05, 0x00, 0xfd, 0x02, 0xff, 0x00, 0x01, 0xf5, 0xfd, 0xf7, 0x03, 0x02, 230 | 0x04, 0x06, 0xf5, 0x08, 0x07, 0x09, 0xfc, 0x08, 0x00, 0xfc, 0x02, 0xf3, 231 | 0xfd, 0xff, 0x0b, 0x04, 0xdc, 0x12, 0x05, 0x08, 0xf2, 0xff, 0x07, 0xf6, 232 | 0x00, 0xfe, 0x09, 0x03, 0xee, 0xf9, 0x06, 0x09, 0x0c, 0x08, 0x04, 0xf4, 233 | 0x0a, 0x06, 0xfc, 0xfd, 0x05, 0x09, 0x0b, 0x12, 0xfb, 0x08, 0xf3, 0x13, 234 | 0xfe, 0xe4, 0x0f, 0x12, 0x03, 0x05, 0xf9, 0xf3, 0xfe, 0x0a, 0xff, 0xe2, 235 | 0x02, 0xf5, 0x05, 0xef, 0x0c, 0x07, 0xec, 0x07, 0xfc, 0x05, 0xfc, 0x00, 236 | 0xf7, 0x0d, 0x05, 0xf1, 0x0a, 0xfb, 0x09, 0x0e, 0x03, 0x0b, 0x07, 0x08, 237 | 0xf6, 0x0a, 0x02, 0x09, 0x07, 0xfd, 0x03, 0x03, 0x06, 0xfc, 0x01, 0xfc, 238 | 0x0a, 0xf7, 0xf8, 0x07, 0xfb, 0xff, 0xfc, 0xf9, 0xfd, 0xf7, 0x0b, 0x0d, 239 | 0x03, 0xf8, 0xf7, 0xfe, 0xf9, 0x00, 0x03, 0x05, 0x07, 0xf5, 0x0b, 0xf7, 240 | 0xf6, 0x0a, 0x04, 0xf4, 0x02, 0xf6, 0xf9, 0x03, 0xfb, 0x06, 0x07, 0x09, 241 | 0xf9, 0xf9, 0xfc, 0xfb, 0x0a, 0x0a, 0x0d, 0x02, 0xfc, 0xfc, 0xff, 0xf1, 242 | 0x08, 0x09, 0x02, 0xf8, 0x04, 0x00, 0x08, 0xfb, 0x0a, 0x0a, 0xff, 0xf8, 243 | 0x03, 0xfb, 0x01, 0x08, 0x06, 0x01, 0x0b, 0xfa, 0x01, 0xf4, 0x00, 0xfc, 244 | 0xfc, 0xfb, 0x00, 0xfc, 0xfa, 0x07, 0xff, 0xf9, 0x04, 0x0b, 0xfe, 0x05, 245 | 0x03, 0xfa, 0xff, 0xf9, 0xf6, 0xfa, 0xfc, 0xfb, 0x04, 0xff, 0xf8, 0xf6, 246 | 0xfd, 0xfa, 0xff, 0x0a, 0x07, 0x0b, 0x03, 0x07, 0x03, 0xfe, 0x05, 0xfa, 247 | 0x0d, 0x06, 0x01, 0x05, 0xfd, 0x05, 0xff, 0x04, 0x01, 0xf9, 0xfc, 0xfe, 248 | 0xfb, 0x06, 0xf5, 0x0a, 0xf8, 0x02, 0xf6, 0xfd, 0x05, 0x07, 0x08, 0xfd, 249 | 0xf8, 0x0b, 0xff, 0xfd, 0x06, 0x03, 0xfd, 0xfe, 0x06, 0x02, 0xf6, 0xfb, 250 | 0xfa, 0xf9, 0xf8, 0xff, 0xf6, 0xf7, 0xfe, 0x06, 0x05, 0x04, 0xfc, 0x08, 251 | 0x0b, 0x05, 0xf4, 0xf9, 0xf8, 0xf6, 0x0a, 0xfa, 0xfb, 0x04, 0x0b, 0x07, 252 | 0xf5, 0x08, 0xf3, 0x00, 0xf8, 0xfc, 0x01, 0x0b, 0xf7, 0x0f, 0xf2, 0xf5, 253 | 0xf1, 0x05, 0x09, 0x01, 0x01, 0xf9, 0xfa, 0xf5, 0xf4, 0x18, 0xff, 0xef, 254 | 0xfc, 0x01, 0x03, 0xff, 0xf8, 0xfb, 0x04, 0xf3, 0xf8, 0xfe, 0xff, 0xe4, 255 | 0x09, 0xf9, 0xf7, 0xf4, 0xf3, 0xec, 0x01, 0xf5, 0x07, 0x0b, 0xe9, 0x07, 256 | 0xf8, 0xfb, 0x0b, 0xf1, 0xf6, 0xfa, 0xfa, 0xfd, 0x07, 0xf0, 0xf8, 0x00, 257 | 0xf1, 0xfa, 0xf8, 0xfb, 0xf9, 0xf9, 0xf3, 0xfa, 0xfc, 0xf7, 0x06, 0xf3, 258 | 0x01, 0xfa, 0xf3, 0xf5, 0xed, 0xff, 0xf4, 0x02, 0xfb, 0x01, 0xfe, 0xf9, 259 | 0xeb, 0xfc, 0xfd, 0x06, 0x00, 0xfb, 0x07, 0x0b, 0x06, 0xfb, 0xf5, 0xf5, 260 | 0xf6, 0x02, 0x08, 0xee, 0x05, 0x0c, 0xf9, 0xfe, 0xf4, 0xee, 0xe8, 0xfc, 261 | 0xfd, 0x07, 0x08, 0xe7, 0xfd, 0x09, 0xef, 0x16, 0x00, 0x04, 0x00, 0xf5, 262 | 0xfa, 0x01, 0xfc, 0xf8, 0xea, 0x07, 0xfa, 0x06, 0x00, 0xf8, 0xf6, 0x03, 263 | 0x0f, 0xf8, 0x0d, 0xf4, 0xe5, 0xfd, 0x12, 0x01, 0x04, 0xff, 0x06, 0xf8, 264 | 0xf7, 0x04, 0x08, 0xf5, 0x10, 0x12, 0x0f, 0x01, 0xfa, 0xff, 0x10, 0x0b, 265 | 0x03, 0xf5, 0x09, 0xf8, 0xf7, 0x01, 0x08, 0xfc, 0x07, 0xf4, 0xf9, 0xf6, 266 | 0x00, 0x01, 0x0a, 0xfe, 0x01, 0xe3, 0xfa, 0xff, 0x05, 0x04, 0x01, 0x15, 267 | 0x12, 0x16, 0x06, 0xf8, 0x08, 0xf3, 0xec, 0xf7, 0x0b, 0x20, 0xed, 0x13, 268 | 0xee, 0x0b, 0xf6, 0x03, 0x08, 0xf2, 0xfe, 0x08, 0x01, 0x08, 0x05, 0xfe, 269 | 0x07, 0xfd, 0x07, 0x00, 0x05, 0x09, 0x09, 0x0a, 0xf8, 0x00, 0x06, 0xfb, 270 | 0xfc, 0xfc, 0x00, 0xfd, 0x01, 0xfb, 0x06, 0xf9, 0xf8, 0xfd, 0x03, 0xf9, 271 | 0x01, 0x0d, 0x16, 0xf8, 0xf6, 0x07, 0x01, 0x04, 0xfe, 0xff, 0xfe, 0xfd, 272 | 0xf7, 0x01, 0x02, 0x00, 0xf7, 0x00, 0x06, 0x04, 0x07, 0xff, 0x08, 0xfc, 273 | 0x01, 0xf6, 0xf0, 0x0a, 0x09, 0x0a, 0x01, 0x0a, 0xf8, 0xff, 0xf3, 0xff, 274 | 0x05, 0x06, 0x05, 0xf7, 0x09, 0x00, 0x0a, 0xfb, 0xf9, 0x08, 0xfc, 0xf8, 275 | 0x06, 0x00, 0x04, 0xfe, 0x08, 0xf6, 0xf4, 0xfa, 0x06, 0xfe, 0x01, 0x0b, 276 | 0xf8, 0x06, 0xf5, 0x01, 0x08, 0x04, 0x08, 0x01, 0x0a, 0x00, 0x07, 0x09, 277 | 0x09, 0xfc, 0x09, 0x08, 0xfb, 0xf7, 0x06, 0x09, 0xfd, 0xfb, 0x02, 0x04, 278 | 0xfe, 0x04, 0x0d, 0x09, 0xf4, 0xfc, 0x04, 0x0a, 0xfa, 0x08, 0x06, 0x0b, 279 | 0xfc, 0xfa, 0xf6, 0x08, 0xc3, 0xfb, 0x0a, 0x1a, 0x09, 0x10, 0x04, 0x06, 280 | 0x04, 0x10, 0x16, 0xfe, 0xf0, 0x17, 0x10, 0x03, 0xed, 0x0f, 0xf5, 0xf4, 281 | 0x03, 0x0c, 0x11, 0x18, 0x00, 0x13, 0x23, 0x06, 0x06, 0xf2, 0x0f, 0x17, 282 | 0x0e, 0x0f, 0x16, 0xf2, 0xf8, 0x12, 0x1a, 0x02, 0x01, 0x08, 0x00, 0x17, 283 | 0x0a, 0x0c, 0xff, 0xfb, 0x0d, 0xf3, 0x0e, 0xed, 0x05, 0x04, 0x02, 0x01, 284 | 0x0b, 0x07, 0xfa, 0x0d, 0xf3, 0xf8, 0x10, 0x06, 0xf8, 0xf9, 0x03, 0x00, 285 | 0xf6, 0xf9, 0xf7, 0x00, 0x00, 0xfa, 0x09, 0xfa, 0xfb, 0xfa, 0xf2, 0xfe, 286 | 0x05, 0xf9, 0xf5, 0xf5, 0xff, 0xfa, 0x02, 0xf6, 0xfb, 0x03, 0x08, 0xf4, 287 | 0x08, 0xfb, 0xfd, 0xff, 0xf9, 0xf4, 0xf5, 0x09, 0xff, 0xf9, 0x00, 0x08, 288 | 0xfc, 0x02, 0xf7, 0xff, 0x02, 0xfd, 0x0a, 0x01, 0xfd, 0x03, 0x0a, 0xf3, 289 | 0x03, 0x0a, 0xfa, 0x06, 0xf2, 0xfa, 0xfd, 0x09, 0xfe, 0xf5, 0x02, 0x0a, 290 | 0xf5, 0xfb, 0xfa, 0x16, 0xf4, 0xd3, 0x09, 0x00, 0xfb, 0x00, 0x18, 0xfd, 291 | 0x1b, 0xf9, 0x06, 0x04, 0xfc, 0x08, 0xfb, 0xfb, 0x0a, 0x04, 0x01, 0xec, 292 | 0xf5, 0xf3, 0xf8, 0xf5, 0x02, 0xf9, 0x15, 0x01, 0x0a, 0x00, 0x06, 0x02, 293 | 0xf5, 0xfa, 0xf4, 0x0c, 0x06, 0x06, 0xf3, 0x05, 0xf9, 0x0a, 0xf9, 0x08, 294 | 0xfa, 0x04, 0x1a, 0x00, 0xff, 0x0c, 0xea, 0xf2, 0xfe, 0x0a, 0x08, 0xf3, 295 | 0xfc, 0x12, 0x07, 0x0a, 0xfb, 0x04, 0x02, 0x03, 0x03, 0x03, 0x06, 0x09, 296 | 0xfb, 0xf7, 0x08, 0xfa, 0xf3, 0xf9, 0x04, 0xf9, 0x07, 0xf8, 0x07, 0xf9, 297 | 0x01, 0xf2, 0xfa, 0x02, 0xfe, 0x01, 0x07, 0x02, 0x01, 0xfa, 0x01, 0x09, 298 | 0x0b, 0x06, 0x06, 0xfe, 0x00, 0x09, 0x00, 0xf4, 0xfc, 0x0a, 0x04, 0x0b, 299 | 0x09, 0xf4, 0xf4, 0x06, 0xfa, 0xfc, 0x02, 0x0a, 0xfd, 0x02, 0x07, 0x02, 300 | 0x07, 0xfa, 0x04, 0xfa, 0x01, 0x05, 0xf6, 0x03, 0x04, 0x06, 0x0f, 0xfe, 301 | 0xfa, 0x81, 0x01, 0x07, 0x0b, 0xfd, 0x04, 0xf9, 0x07, 0xfb, 0x07, 0xf8, 302 | 0x0f, 0x01, 0x05, 0xf7, 0xf6, 0x08, 0x08, 0x0c, 0xf6, 0xfa, 0x06, 0x17, 303 | 0xfc, 0x0b, 0xff, 0xeb, 0xe8, 0x03, 0x03, 0x0e, 0x05, 0x11, 0xd8, 0xf5, 304 | 0x04, 0x00, 0x0a, 0xfc, 0x02, 0x09, 0xfe, 0xf8, 0xf0, 0xfb, 0xe0, 0xff, 305 | 0xef, 0x02, 0x10, 0xf5, 0x04, 0xff, 0xf6, 0xf5, 0xff, 0x0a, 0x0b, 0xfb, 306 | 0xe1, 0xf6, 0x02, 0xf4, 0xff, 0xea, 0x0c, 0xe7, 0xfa, 0x04, 0x02, 0x04, 307 | 0xf3, 0x05, 0xfb, 0x05, 0xe8, 0x13, 0xec, 0x1b, 0x0e, 0x0a, 0xfc, 0xf6, 308 | 0x01, 0xfe, 0x0d, 0xb7, 0x0b, 0xf9, 0x12, 0xce, 0xe5, 0xcf, 0x07, 0xfe, 309 | 0x02, 0xfa, 0x09, 0xfc, 0xfa, 0x0a, 0xf0, 0x02, 0x0b, 0xf4, 0xff, 0x08, 310 | 0x0d, 0x0a, 0x12, 0xe9, 0x0a, 0x09, 0xf5, 0xf9, 0x0c, 0xfc, 0xfd, 0x13, 311 | 0x10, 0xe2, 0x1a, 0xf4, 0xfb, 0x05, 0x06, 0xff, 0x04, 0x04, 0xf7, 0xf4, 312 | 0x07, 0xf5, 0x07, 0x03, 0xf8, 0x05, 0xed, 0x03, 0xf9, 0x0b, 0xf8, 0xfb, 313 | 0xf7, 0x03, 0x00, 0x06, 0xf4, 0xe3, 0xf3, 0xfe, 0xf8, 0x0f, 0xfb, 0xee, 314 | 0x06, 0x05, 0x0c, 0xf7, 0x04, 0x02, 0xfd, 0xff, 0xf5, 0x01, 0xff, 0xe4, 315 | 0x01, 0xfc, 0xf8, 0xf9, 0xfb, 0xfa, 0xf9, 0xf9, 0xf7, 0xf3, 0x06, 0xf2, 316 | 0x04, 0x06, 0xfd, 0xea, 0x02, 0x06, 0xfd, 0x00, 0xf1, 0xf9, 0xf6, 0xe9, 317 | 0xca, 0xe3, 0x02, 0xfa, 0xf5, 0xf5, 0x18, 0x07, 0x03, 0x04, 0xf0, 0xff, 318 | 0xe9, 0x00, 0x08, 0xe4, 0x08, 0x05, 0x05, 0xf8, 0x07, 0x01, 0x03, 0xbb, 319 | 0xf7, 0xf8, 0x04, 0x0f, 0xe3, 0x00, 0xf9, 0xec, 0x05, 0xc5, 0xf4, 0xfa, 320 | 0x05, 0x03, 0xf2, 0xee, 0x0a, 0xea, 0xfd, 0x0d, 0xfa, 0x05, 0xd6, 0x02, 321 | 0xf5, 0xfb, 0x15, 0xf3, 0xf9, 0xff, 0x09, 0xfa, 0xf1, 0xf5, 0x08, 0x07, 322 | 0x21, 0x03, 0x05, 0xf9, 0xff, 0xff, 0xfa, 0xf8, 0xfd, 0x07, 0xfd, 0x06, 323 | 0x07, 0xf1, 0xfb, 0x07, 0xf7, 0xee, 0x0a, 0x15, 0x0d, 0xf9, 0x08, 0x10, 324 | 0x05, 0x07, 0xfd, 0xfd, 0x02, 0xfc, 0xfa, 0x0b, 0xf0, 0xf5, 0xf8, 0xfd, 325 | 0xfe, 0xe9, 0x0a, 0x0d, 0x01, 0xfb, 0xfb, 0x08, 0xf6, 0xfc, 0x05, 0x10, 326 | 0x09, 0xf9, 0x06, 0xe7, 0x02, 0x11, 0x09, 0x11, 0x15, 0x08, 0xf3, 0x19, 327 | 0x0a, 0x05, 0xfe, 0x00, 0xfe, 0xee, 0xfa, 0x16, 0xf8, 0xd7, 0xf2, 0x02, 328 | 0xff, 0x04, 0x08, 0x05, 0xfb, 0xff, 0xf9, 0x10, 0x08, 0x18, 0x09, 0x05, 329 | 0x0b, 0x0b, 0xf6, 0x06, 0x09, 0xfe, 0x0e, 0xfe, 0x0a, 0xf8, 0x01, 0xfe, 330 | 0x11, 0xf9, 0x02, 0xfa, 0xff, 0xf2, 0xef, 0xf5, 0xf6, 0x06, 0xf9, 0x02, 331 | 0xf7, 0x0a, 0xf9, 0x0c, 0x03, 0x04, 0x17, 0xff, 0xfa, 0x0e, 0xf8, 0xf6, 332 | 0xfc, 0xfe, 0xfe, 0xfd, 0x0a, 0x06, 0xfc, 0x02, 0xfd, 0x0b, 0x0a, 0xf7, 333 | 0xfd, 0x01, 0x0b, 0x03, 0x06, 0x00, 0x0c, 0xfc, 0xfe, 0xf4, 0x06, 0xf2, 334 | 0x09, 0xf9, 0xfa, 0x07, 0x0a, 0x06, 0x09, 0xfb, 0x0c, 0x04, 0x05, 0xff, 335 | 0xfb, 0x11, 0x05, 0xf7, 0xf5, 0x03, 0xfc, 0x07, 0xfe, 0x00, 0x04, 0x01, 336 | 0xfb, 0x09, 0x04, 0x01, 0x01, 0x06, 0x09, 0x08, 0x07, 0x04, 0xda, 0x0b, 337 | 0x06, 0x0a, 0x06, 0x09, 0x07, 0x0a, 0xfe, 0xfb, 0xff, 0x01, 0xf5, 0x09, 338 | 0x04, 0x03, 0x08, 0xf0, 0x07, 0xf9, 0xf6, 0xfa, 0x06, 0x0c, 0x15, 0xfb, 339 | 0xfe, 0x19, 0xff, 0x05, 0xf6, 0xe5, 0xfd, 0xf0, 0xfe, 0xff, 0x01, 0x0e, 340 | 0xf8, 0x10, 0x09, 0xf4, 0x09, 0xea, 0xf4, 0xff, 0x03, 0xf7, 0x00, 0x06, 341 | 0x04, 0xfe, 0xfc, 0xfb, 0xfc, 0xfa, 0x13, 0xf9, 0x08, 0x0b, 0xfe, 0x0b, 342 | 0xfe, 0x01, 0x05, 0xed, 0x11, 0xf8, 0x1e, 0xfe, 0x03, 0x09, 0xf3, 0x0f, 343 | 0x0b, 0xf9, 0x01, 0x00, 0xf4, 0xfe, 0xf8, 0x0a, 0xf8, 0x04, 0x10, 0xf3, 344 | 0xf9, 0x08, 0x06, 0xf9, 0xfc, 0x03, 0x06, 0x01, 0x00, 0x17, 0x09, 0x1b, 345 | 0xec, 0xfd, 0xfe, 0xfa, 0xfc, 0x0b, 0x1e, 0xfa, 0x05, 0xf9, 0x05, 0x28, 346 | 0xf3, 0xfe, 0xf4, 0xfa, 0x0a, 0x08, 0x02, 0x0c, 0x03, 0x07, 0x1c, 0x04, 347 | 0x05, 0xf7, 0xfb, 0xf3, 0x06, 0xf3, 0x06, 0x00, 0xf6, 0x12, 0x01, 0xf1, 348 | 0x01, 0xfc, 0xf7, 0x01, 0xf5, 0x0a, 0x04, 0x05, 0xfa, 0xfb, 0xfa, 0x02, 349 | 0x00, 0x08, 0x09, 0xff, 0xf7, 0x03, 0x07, 0xff, 0x03, 0x0b, 0x07, 0x00, 350 | 0xfa, 0xf3, 0xff, 0x0b, 0xfb, 0x00, 0x0a, 0x08, 0xff, 0x00, 0x08, 0x03, 351 | 0x03, 0xf0, 0xff, 0x05, 0xff, 0x00, 0x0a, 0x09, 0xff, 0x0d, 0x0c, 0x02, 352 | 0x02, 0x09, 0x0a, 0x05, 0x06, 0x0e, 0xfb, 0x06, 0xfd, 0xfb, 0xfc, 0x06, 353 | 0x0c, 0x08, 0xfc, 0x0c, 0x06, 0x05, 0x0a, 0xfa, 0x07, 0x08, 0x00, 0xf7, 354 | 0xfa, 0xf7, 0x03, 0x07, 0x0d, 0x01, 0x03, 0xfd, 0xf9, 0xfe, 0xfc, 0x07, 355 | 0x01, 0xf7, 0xf4, 0xf4, 0x01, 0xf8, 0xf6, 0x09, 0xfc, 0xfa, 0x0b, 0x08, 356 | 0xfc, 0xeb, 0x02, 0x08, 0xff, 0xfb, 0x04, 0x0c, 0x04, 0xf3, 0xe6, 0x00, 357 | 0xfa, 0x05, 0xfa, 0x07, 0xff, 0x07, 0xff, 0x15, 0xf3, 0x04, 0x08, 0xef, 358 | 0xfb, 0xea, 0xfd, 0x0a, 0x00, 0x0e, 0xee, 0x06, 0x04, 0x02, 0x06, 0x01, 359 | 0xeb, 0xfa, 0xf7, 0x09, 0xf7, 0xf5, 0x06, 0x0c, 0xf3, 0x05, 0x04, 0x05, 360 | 0x09, 0xfd, 0xf7, 0xf8, 0xf5, 0x09, 0xf2, 0x01, 0xfb, 0x05, 0x11, 0x00, 361 | 0x05, 0xfc, 0xe5, 0x06, 0xfc, 0xf6, 0xf8, 0x05, 0x00, 0xfb, 0x0b, 0xfd, 362 | 0x11, 0xfc, 0x00, 0x01, 0x00, 0x0a, 0x03, 0xf8, 0xfd, 0xf8, 0xfe, 0xfe, 363 | 0x0b, 0x11, 0x01, 0xee, 0xfe, 0xfd, 0x10, 0x00, 0xec, 0x01, 0x02, 0xff, 364 | 0x02, 0xfc, 0xf2, 0x08, 0xf5, 0xff, 0x19, 0xf7, 0xfe, 0xff, 0xff, 0xf9, 365 | 0xfe, 0xf8, 0x09, 0xf5, 0x03, 0x03, 0xfe, 0xf8, 0x06, 0x0a, 0xfb, 0xfc, 366 | 0xfc, 0x08, 0xff, 0x01, 0xf9, 0xff, 0xfe, 0xfb, 0x00, 0xf5, 0x02, 0xff, 367 | 0x04, 0x0a, 0x05, 0xff, 0x00, 0xf7, 0x03, 0x01, 0x06, 0x03, 0xf4, 0xfc, 368 | 0x02, 0xfa, 0x09, 0x04, 0xf8, 0xfb, 0x00, 0xff, 0xf8, 0x06, 0xff, 0xfd, 369 | 0x05, 0xfd, 0x00, 0x01, 0x00, 0xfc, 0xf7, 0x0a, 0x06, 0x04, 0xf8, 0xf7, 370 | 0x05, 0x01, 0xfd, 0xe9, 0x01, 0x06, 0x0a, 0x0a, 0xf9, 0x04, 0xfd, 0x03, 371 | 0xf8, 0xfb, 0x03, 0xfe, 0xfd, 0xf7, 0xff, 0xfb, 0x03, 0xff, 0xfe, 0xff, 372 | 0x04, 0xf7, 0x07, 0x05, 0x0a, 0xff, 0x0b, 0x0c, 0xfe, 0xfd, 0x04, 0xfb, 373 | 0xf8, 0x00, 0x09, 0xfe, 0x00, 0x04, 0xfc, 0x09, 0xf6, 0x09, 0xfd, 0xff, 374 | 0xfc, 0xfa, 0x0d, 0x06, 0x08, 0xf8, 0xfd, 0x02, 0x09, 0x07, 0xff, 0x09, 375 | 0x02, 0x08, 0xfb, 0xf9, 0x07, 0xe5, 0x08, 0xf0, 0xfe, 0x10, 0xfb, 0xf9, 376 | 0x09, 0x02, 0xff, 0xf6, 0xff, 0xe2, 0xfe, 0x07, 0xfa, 0xf8, 0x01, 0xfa, 377 | 0x02, 0x1e, 0x08, 0xfe, 0x05, 0xf8, 0xfa, 0xd3, 0x06, 0x0c, 0x16, 0xfb, 378 | 0xf3, 0x01, 0xee, 0xf7, 0xf4, 0xee, 0xe3, 0xf0, 0x0b, 0xf4, 0x03, 0xf9, 379 | 0xf6, 0xfd, 0x05, 0x07, 0xfb, 0x09, 0xdb, 0xf9, 0x0c, 0x04, 0x05, 0x06, 380 | 0x0b, 0xec, 0xf6, 0xf6, 0x08, 0xf0, 0x0a, 0xfe, 0x00, 0x00, 0x00, 0x00, 381 | 0xbe, 0xf8, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 382 | 0xe2, 0xf2, 0xf9, 0xe9, 0xf9, 0xef, 0xe2, 0xfe, 0xf7, 0xf7, 0xef, 0x42, 383 | 0xff, 0x40, 0x45, 0xe5, 0xe3, 0xf8, 0xf7, 0xd1, 0x2b, 0x16, 0x0e, 0xe7, 384 | 0xde, 0x02, 0xec, 0xfa, 0x0a, 0x0e, 0xda, 0xdc, 0xf4, 0xfd, 0xf9, 0xe5, 385 | 0xd2, 0xf6, 0x0c, 0x29, 0xfe, 0xf8, 0x04, 0x06, 0xfa, 0xd5, 0xf8, 0xe1, 386 | 0x3b, 0x0f, 0xc4, 0xed, 0xf6, 0xea, 0x24, 0xc6, 0x02, 0x0a, 0xfa, 0xb4, 387 | 0xcc, 0x24, 0xe8, 0x02, 0xda, 0xf7, 0xe8, 0x08, 0xe1, 0xf4, 0x04, 0xd3, 388 | 0x02, 0x0c, 0x18, 0xf6, 0x14, 0xd9, 0x09, 0xe4, 0xbc, 0x12, 0x15, 0x18, 389 | 0x0a, 0x0a, 0x0a, 0x06, 0x00, 0x0b, 0x13, 0x00, 0x04, 0x04, 0x05, 0xb7, 390 | 0xe9, 0xeb, 0xf9, 0xf2, 0xf4, 0xeb, 0xe3, 0x26, 0x37, 0xe5, 0xfc, 0xfd, 391 | 0xfa, 0xe8, 0xe7, 0xed, 0xff, 0xef, 0xd9, 0xe4, 0xfa, 0xdb, 0xf7, 0xfc, 392 | 0xeb, 0x0f, 0xfb, 0xf6, 0xfe, 0x0f, 0xfd, 0x11, 0xfc, 0xd9, 0xf6, 0x11, 393 | 0x0f, 0xda, 0xef, 0x1e, 0xea, 0xe0, 0x2f, 0xfd, 0xe9, 0xf9, 0xf5, 0xd5, 394 | 0xde, 0x06, 0xf8, 0xe8, 0xd0, 0x1b, 0xd3, 0xd7, 0x23, 0x22, 0x19, 0xd0, 395 | 0xd7, 0xf4, 0x1f, 0xd4, 0x01, 0x22, 0xc5, 0xe1, 0xd5, 0x0f, 0xfc, 0xd9, 396 | 0x26, 0xf2, 0xee, 0xb4, 0xef, 0xdb, 0xee, 0x23, 0x06, 0xf3, 0x2b, 0x04, 397 | 0x2a, 0xdc, 0xd1, 0xe2, 0xdc, 0xf8, 0x2f, 0xef, 0xe2, 0xd9, 0xc6, 0xf9, 398 | 0xee, 0xfc, 0xd6, 0xdd, 0xfd, 0xf6, 0xe8, 0xbf, 0xcd, 0x0e, 0xd9, 0x13, 399 | 0xe9, 0xeb, 0x0e, 0x29, 0x1e, 0x09, 0xe9, 0xc5, 0xf6, 0x0f, 0xcf, 0xdd, 400 | 0x2a, 0x24, 0x1f, 0xc7, 0xce, 0xdd, 0xe1, 0xd4, 0xfd, 0xe8, 0xdf, 0xf8, 401 | 0xd9, 0x12, 0x15, 0x24, 0xe7, 0x06, 0xf9, 0xc6, 0xfe, 0xfd, 0x07, 0xed, 402 | 0xf5, 0x0b, 0xe3, 0xee, 0xd5, 0x0d, 0x0d, 0x0f, 0xec, 0xed, 0xee, 0xf6, 403 | 0xf5, 0xd3, 0x16, 0x13, 0xe6, 0xf0, 0xc8, 0xce, 0xec, 0xfd, 0xee, 0xe0, 404 | 0xfd, 0xde, 0x0d, 0x0e, 0x08, 0xf5, 0x1e, 0x02, 0xc9, 0x24, 0x2c, 0xdb, 405 | 0xdb, 0xde, 0x11, 0x02, 0xea, 0xdc, 0xdc, 0xed, 0xde, 0x12, 0xf4, 0x19, 406 | 0xc9, 0x19, 0xfd, 0x22, 0x13, 0xe8, 0xaf, 0xfd, 0xfa, 0xe6, 0xeb, 0x16, 407 | 0xfc, 0xd3, 0x08, 0xdc, 0x06, 0xd0, 0x1d, 0xf8, 0x29, 0x18, 0xc7, 0xdb, 408 | 0xed, 0xe6, 0x18, 0xd7, 0x04, 0xd9, 0x16, 0xca, 0xf7, 0xd4, 0xfc, 0x02, 409 | 0xf9, 0xea, 0x14, 0xe8, 0xf0, 0xe1, 0xf0, 0xe7, 0xd9, 0x1b, 0xf6, 0x23, 410 | 0x30, 0xd6, 0xc2, 0xbc, 0xe2, 0xd3, 0xef, 0x1a, 0x11, 0x05, 0x03, 0xfc, 411 | 0xee, 0x11, 0x1f, 0xcd, 0x02, 0xea, 0xdb, 0x19, 0xeb, 0xe2, 0x19, 0xc9, 412 | 0x04, 0x09, 0x1c, 0x03, 0x03, 0xf5, 0xbd, 0xf2, 0x00, 0xed, 0x01, 0xd5, 413 | 0xfa, 0xfc, 0xfc, 0x11, 0xd4, 0x20, 0xde, 0xf6, 0x26, 0xd6, 0x1f, 0xc0, 414 | 0xe7, 0xd5, 0xfa, 0xd7, 0x0a, 0xe7, 0x28, 0xe9, 0x01, 0xd5, 0x14, 0xe9, 415 | 0xfb, 0xfe, 0xd6, 0xf2, 0xca, 0xdb, 0x18, 0xe4, 0xf3, 0x1f, 0xf2, 0x0b, 416 | 0xc7, 0x07, 0xe5, 0xd6, 0xfc, 0xc1, 0x17, 0x05, 0xda, 0xde, 0xe9, 0x01, 417 | 0xb8, 0x0d, 0xfa, 0x31, 0x0d, 0x01, 0x26, 0xfb, 0xdd, 0xbd, 0xf0, 0x11, 418 | 0x0c, 0x1d, 0x14, 0xc8, 0x08, 0xc4, 0x0c, 0xfe, 0x0d, 0x16, 0x04, 0x01, 419 | 0x00, 0x01, 0xfe, 0xfc, 0x0f, 0xec, 0xed, 0x14, 0xd6, 0x06, 0xe2, 0x24, 420 | 0xd7, 0xea, 0xe4, 0xee, 0x12, 0x02, 0xd0, 0x04, 0xfd, 0xf4, 0xd0, 0xb8, 421 | 0xba, 0x14, 0x16, 0xbe, 0xfb, 0xf0, 0xf4, 0xfd, 0xe6, 0x18, 0x03, 0xe1, 422 | 0x26, 0x1a, 0x02, 0xef, 0x0f, 0xdc, 0xbb, 0x17, 0xf2, 0xb6, 0xd8, 0xe6, 423 | 0xd4, 0xfa, 0xf0, 0x13, 0xfe, 0xef, 0xeb, 0xee, 0xed, 0xef, 0x38, 0xed, 424 | 0x06, 0xc3, 0x0d, 0xfa, 0x19, 0x2e, 0xb6, 0xf2, 0xef, 0xbd, 0x05, 0x16, 425 | 0xf6, 0xe4, 0xe2, 0x02, 0xf8, 0x12, 0xcf, 0xc9, 0x1d, 0xda, 0x28, 0x18, 426 | 0x0f, 0xdf, 0xde, 0xe9, 0x0e, 0xfb, 0x0b, 0x08, 0x0b, 0x0e, 0x23, 0xfe, 427 | 0x09, 0x06, 0x06, 0x0e, 0x12, 0xf8, 0xc8, 0xee, 0x81, 0xc3, 0xd7, 0xe1, 428 | 0xf4, 0xed, 0x22, 0xe0, 0x09, 0xf5, 0x0e, 0x0d, 0xd5, 0x0b, 0xf0, 0xf2, 429 | 0xcb, 0xca, 0xd7, 0xe9, 0x1d, 0x03, 0xc0, 0x1a, 0xf0, 0xf5, 0x0c, 0xf8, 430 | 0xf2, 0x0c, 0x12, 0xe1, 0xe7, 0xed, 0xd5, 0xfb, 0x2e, 0xef, 0xf3, 0xd4, 431 | 0xd8, 0x17, 0xf0, 0x0e, 0x03, 0x10, 0x0e, 0xfd, 0x05, 0xfb, 0xaf, 0x05, 432 | 0x08, 0x08, 0x0b, 0x07, 0x00, 0xfd, 0xf8, 0xf8, 0xc1, 0xee, 0xe0, 0xdd, 433 | 0x27, 0xfa, 0xeb, 0xfe, 0xf3, 0xe8, 0xde, 0xb0, 0x0a, 0x24, 0x28, 0x3c, 434 | 0xf7, 0x22, 0x0a, 0xe7, 0xf7, 0xf1, 0xe8, 0xe6, 0xed, 0xf0, 0xeb, 0x0f, 435 | 0xff, 0xfa, 0xde, 0xe9, 0x07, 0x1c, 0xd7, 0xeb, 0x12, 0xe9, 0xee, 0xdc, 436 | 0x06, 0xe7, 0xd2, 0x01, 0x00, 0x16, 0xdc, 0xd6, 0xdc, 0xf0, 0xf0, 0xee, 437 | 0xf4, 0x2c, 0x09, 0x00, 0xf8, 0xda, 0xde, 0x09, 0xe2, 0x07, 0xd9, 0xfc, 438 | 0xd0, 0xfc, 0x0f, 0x0b, 0x02, 0x10, 0xbc, 0x0e, 0xfb, 0x04, 0x14, 0xf5, 439 | 0xdf, 0xf1, 0xf2, 0xd0, 0x07, 0xa2, 0x27, 0x07, 0x02, 0x10, 0xf0, 0xd2, 440 | 0xf5, 0x16, 0xfc, 0xd8, 0xce, 0xc8, 0xf7, 0x14, 0xd9, 0xe3, 0xf2, 0x12, 441 | 0xe8, 0xfe, 0xfb, 0x15, 0xcf, 0x20, 0x15, 0xf9, 0xdd, 0xf3, 0xf4, 0xd2, 442 | 0x2d, 0xf0, 0xcf, 0xe2, 0x23, 0xde, 0x15, 0xeb, 0xdd, 0xf7, 0x0a, 0xf7, 443 | 0xbb, 0xf1, 0x06, 0xeb, 0x1e, 0xde, 0xdf, 0xd1, 0x09, 0xfd, 0x02, 0xd1, 444 | 0x1a, 0x03, 0x05, 0xde, 0x03, 0xf9, 0xef, 0xd1, 0x11, 0xd9, 0xf8, 0xdd, 445 | 0xf7, 0x0d, 0x22, 0xe4, 0x08, 0xe6, 0xd5, 0xf0, 0xe9, 0xcb, 0x24, 0x11, 446 | 0xd3, 0xef, 0xee, 0xec, 0xf9, 0x0e, 0xf5, 0x0b, 0x03, 0xdd, 0xeb, 0xfc, 447 | 0xd7, 0x0e, 0x07, 0xf6, 0xf6, 0x08, 0xe7, 0xe6, 0x08, 0xeb, 0x19, 0x09, 448 | 0xe1, 0xda, 0xdf, 0xde, 0x14, 0xf6, 0x1a, 0xea, 0x05, 0xd3, 0xc3, 0xdb, 449 | 0x1d, 0xf6, 0xed, 0x2e, 0x06, 0xf0, 0x0a, 0xb5, 0x22, 0xf8, 0xf2, 0xfd, 450 | 0xf5, 0x05, 0xd7, 0xf3, 0x01, 0x00, 0x06, 0xf8, 0xee, 0x07, 0xe9, 0x01, 451 | 0xdb, 0x01, 0x0b, 0x0c, 0xe3, 0xf5, 0xea, 0xf0, 0xf5, 0xed, 0xf6, 0xf2, 452 | 0xde, 0x15, 0x2d, 0xf7, 0x29, 0xdd, 0xe6, 0xec, 0x15, 0xe8, 0xbc, 0x1c, 453 | 0xcb, 0x1b, 0xff, 0x12, 0xe1, 0x20, 0xd6, 0xf2, 0x1b, 0xed, 0xd2, 0xe6, 454 | 0xfb, 0xfb, 0xee, 0x00, 0xea, 0xd0, 0x0a, 0xb3, 0x85, 0xe7, 0xb6, 0x1a, 455 | 0x20, 0x0a, 0xe2, 0xc8, 0xed, 0xdf, 0x2a, 0x27, 0x06, 0x04, 0xf8, 0xdc, 456 | 0xe8, 0xe2, 0xf0, 0xf6, 0xe7, 0xfb, 0x16, 0xcd, 0x1e, 0x28, 0x13, 0xec, 457 | 0xdf, 0xeb, 0xe9, 0xfd, 0xe3, 0xea, 0xe2, 0xe6, 0x19, 0xe4, 0xe2, 0xe6, 458 | 0x23, 0xba, 0x00, 0xde, 0xd3, 0xd1, 0xd8, 0x06, 0xfa, 0xfb, 0x08, 0x1c, 459 | 0xf7, 0xf2, 0xf7, 0xe3, 0x1b, 0x0f, 0x0d, 0x1a, 0xfd, 0x13, 0x14, 0xfe, 460 | 0xff, 0xfd, 0xf9, 0xff, 0xfc, 0xfc, 0xfc, 0x1c, 0x1e, 0x07, 0x20, 0xd8, 461 | 0xd6, 0xcb, 0x1d, 0x0f, 0x22, 0xef, 0xd0, 0xd3, 0xff, 0xf8, 0xf2, 0xa8, 462 | 0x24, 0x08, 0xef, 0xed, 0xd8, 0xfd, 0x26, 0x00, 0xda, 0xd5, 0x0a, 0xdb, 463 | 0xd8, 0xf4, 0xef, 0xc6, 0x0d, 0xdd, 0xde, 0xcd, 0xf1, 0xde, 0xf9, 0x16, 464 | 0x11, 0xfd, 0xd9, 0xff, 0x0d, 0xef, 0xf2, 0xfa, 0x20, 0x17, 0xc8, 0xc9, 465 | 0x14, 0xbb, 0xc7, 0x24, 0xe9, 0xe2, 0xea, 0x11, 0xd8, 0xfe, 0x05, 0xe6, 466 | 0xea, 0xf9, 0xf6, 0x08, 0xd5, 0xfb, 0xcc, 0xfe, 0xe1, 0x15, 0x0a, 0x11, 467 | 0x1b, 0xf9, 0xc4, 0xf9, 0x00, 0x00, 0x00, 0x00, 0xce, 0xfc, 0xff, 0xff, 468 | 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 469 | 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 470 | 0x00, 0x00, 0x00, 0x00, 0xee, 0xfc, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 471 | 0x08, 0x00, 0x00, 0x00, 0x22, 0x0e, 0x00, 0x00, 0xde, 0xf1, 0xff, 0xff, 472 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 473 | 0x0e, 0xfd, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 474 | 0x1f, 0x02, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x05, 0x02, 0x00, 0x00, 475 | 0xf4, 0xff, 0xff, 0xff, 0xf1, 0xfd, 0xff, 0xff, 0xf2, 0xff, 0xff, 0xff, 476 | 0x20, 0xfe, 0xff, 0xff, 0x2c, 0x00, 0x00, 0x00, 0xeb, 0xff, 0xff, 0xff, 477 | 0xf8, 0x01, 0x00, 0x00, 0xf1, 0xff, 0xff, 0xff, 0x25, 0xfe, 0xff, 0xff, 478 | 0x07, 0xfe, 0xff, 0xff, 0xdc, 0x01, 0x00, 0x00, 0x46, 0xff, 0xff, 0xff, 479 | 0xfd, 0xff, 0xff, 0xff, 0xe7, 0x01, 0x00, 0x00, 0xfe, 0x01, 0x00, 0x00, 480 | 0x9e, 0xff, 0xff, 0xff, 0x82, 0xff, 0xff, 0xff, 0x79, 0xff, 0xff, 0xff, 481 | 0xfc, 0x01, 0x00, 0x00, 0x06, 0x02, 0x00, 0x00, 0xc8, 0xff, 0xff, 0xff, 482 | 0x09, 0xfe, 0xff, 0xff, 0x05, 0xfe, 0xff, 0xff, 0xce, 0xff, 0xff, 0xff, 483 | 0xfb, 0xfd, 0xff, 0xff, 0xf5, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 484 | 0xf4, 0x01, 0x00, 0x00, 0xf6, 0xff, 0xff, 0xff, 0xf7, 0x01, 0x00, 0x00, 485 | 0x97, 0x00, 0x00, 0x00, 0xcd, 0xff, 0xff, 0xff, 0xfb, 0x01, 0x00, 0x00, 486 | 0x04, 0xff, 0xff, 0xff, 0x09, 0xfe, 0xff, 0xff, 0x06, 0xfe, 0xff, 0xff, 487 | 0xfd, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0xf9, 0xff, 0xff, 0xff, 488 | 0x69, 0xff, 0xff, 0xff, 0xf6, 0x01, 0x00, 0x00, 0xdd, 0xfd, 0xff, 0xff, 489 | 0x13, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0x63, 0xfe, 0xff, 0xff, 490 | 0xf8, 0xfd, 0xff, 0xff, 0xa3, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, 491 | 0xf8, 0x01, 0x00, 0x00, 0x31, 0x01, 0x00, 0x00, 0xd0, 0xff, 0xff, 0xff, 492 | 0x71, 0xff, 0xff, 0xff, 0x09, 0x02, 0x00, 0x00, 0xc3, 0xff, 0xff, 0xff, 493 | 0xc4, 0xff, 0xff, 0xff, 0xf5, 0xfd, 0xff, 0xff, 0x4a, 0xfe, 0xff, 0xff, 494 | 0xe7, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x0e, 0x02, 0x00, 0x00, 495 | 0x82, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xfe, 0xff, 0xff, 496 | 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x62, 0xfc, 0xff, 0xff, 497 | 0xed, 0xff, 0xff, 0xff, 0x14, 0xfd, 0xff, 0xff, 0x9a, 0xff, 0xff, 0xff, 498 | 0x40, 0x01, 0x00, 0x00, 0x2a, 0xfc, 0xff, 0xff, 0x2f, 0xfe, 0xff, 0xff, 499 | 0x64, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xf3, 0xff, 0xff, 0xff, 500 | 0x9b, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 501 | 0xfa, 0xff, 0xff, 0xff, 0x55, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 502 | 0xf8, 0x00, 0x00, 0x00, 0xe5, 0xfe, 0xff, 0xff, 0x7d, 0xff, 0xff, 0xff, 503 | 0xe1, 0xff, 0xff, 0xff, 0x69, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 504 | 0xbc, 0xff, 0xff, 0xff, 0x55, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 505 | 0x99, 0xff, 0xff, 0xff, 0x65, 0xff, 0xff, 0xff, 0x35, 0xfc, 0xff, 0xff, 506 | 0xfa, 0xff, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 507 | 0x6e, 0xff, 0xff, 0xff, 0x94, 0xfe, 0xff, 0xff, 0x4b, 0xfb, 0xff, 0xff, 508 | 0x4c, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 509 | 0xae, 0xfc, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0xb7, 0x00, 0x00, 0x00, 510 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd7, 0xff, 0xff, 0xff, 511 | 0x00, 0x00, 0x00, 0x00, 0xf5, 0xff, 0xff, 0xff, 0x6e, 0x00, 0x00, 0x00, 512 | 0x07, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, 0x97, 0x01, 0x00, 0x00, 513 | 0xbd, 0x01, 0x00, 0x00, 0x49, 0xff, 0xff, 0xff, 0x59, 0xfc, 0xff, 0xff, 514 | 0x93, 0xff, 0xff, 0xff, 0xde, 0xff, 0xff, 0xff, 0x14, 0x00, 0x00, 0x00, 515 | 0xda, 0xff, 0xff, 0xff, 0x39, 0xfd, 0xff, 0xff, 0x39, 0x00, 0x00, 0x00, 516 | 0x2b, 0xfc, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xbe, 0x00, 0x00, 0x00, 517 | 0x19, 0x02, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0xc6, 0xff, 0xff, 0xff, 518 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 519 | 0x74, 0xf8, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 520 | 0x00, 0x00, 0x00, 0x00, 0x84, 0xf8, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 521 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 522 | 0x4d, 0x4c, 0x49, 0x52, 0x20, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 523 | 0x65, 0x64, 0x2e, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 524 | 0x00, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0c, 0x00, 525 | 0x10, 0x00, 0x14, 0x00, 0x0e, 0x00, 0x00, 0x00, 0xcc, 0x01, 0x00, 0x00, 526 | 0xc0, 0x01, 0x00, 0x00, 0xb4, 0x01, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 527 | 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 528 | 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00, 529 | 0x48, 0x01, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, 530 | 0x64, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 531 | 0xae, 0xfe, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 532 | 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 533 | 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x4a, 0xff, 0xff, 0xff, 534 | 0x00, 0x00, 0x00, 0x09, 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 535 | 0x18, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 536 | 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 537 | 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 538 | 0x0b, 0x00, 0x00, 0x00, 0xca, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x08, 539 | 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 540 | 0x04, 0x00, 0x00, 0x00, 0x74, 0xf9, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 541 | 0x0b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 542 | 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 543 | 0x18, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x07, 0x00, 0x14, 0x00, 544 | 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 545 | 0x1c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 546 | 0xb6, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 547 | 0x0a, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 548 | 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 549 | 0x1a, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x07, 0x00, 0x14, 0x00, 550 | 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 551 | 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 552 | 0x00, 0x00, 0x06, 0x00, 0x08, 0x00, 0x07, 0x00, 0x06, 0x00, 0x00, 0x00, 553 | 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 554 | 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 555 | 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x0c, 0x00, 0x00, 0x00, 556 | 0x04, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 557 | 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 558 | 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 559 | 0x00, 0x00, 0x0a, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0c, 0x00, 560 | 0x0a, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 561 | 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 562 | 0x01, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 563 | 0x0e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 564 | 0x0f, 0x00, 0x00, 0x00, 0x38, 0x07, 0x00, 0x00, 0x9c, 0x06, 0x00, 0x00, 565 | 0x0c, 0x06, 0x00, 0x00, 0x90, 0x05, 0x00, 0x00, 0x44, 0x05, 0x00, 0x00, 566 | 0xc8, 0x04, 0x00, 0x00, 0x44, 0x04, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 567 | 0x2c, 0x03, 0x00, 0x00, 0x70, 0x02, 0x00, 0x00, 0xac, 0x01, 0x00, 0x00, 568 | 0x00, 0x01, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 569 | 0x04, 0x00, 0x00, 0x00, 0xc8, 0xff, 0xff, 0xff, 0x28, 0x00, 0x00, 0x00, 570 | 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 571 | 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 572 | 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x00, 0x00, 0x00, 0x00, 573 | 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 574 | 0x14, 0x00, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 575 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x00, 0x00, 576 | 0x2c, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 577 | 0x02, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 578 | 0x0d, 0x00, 0x00, 0x00, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x5f, 579 | 0x69, 0x6e, 0x70, 0x75, 0x74, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 580 | 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xa0, 0xf9, 0xff, 0xff, 581 | 0x00, 0x00, 0x00, 0x09, 0x54, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 582 | 0x38, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 583 | 0x02, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 584 | 0x34, 0xfa, 0xff, 0xff, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 585 | 0x01, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 586 | 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3b, 0x0d, 0x00, 0x00, 0x00, 587 | 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x6e, 0x74, 588 | 0x38, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 589 | 0x02, 0x00, 0x00, 0x00, 0x08, 0xfa, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, 590 | 0x94, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 591 | 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 592 | 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0xf4, 0xf9, 0xff, 0xff, 593 | 0x2c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 594 | 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xe1, 0xff, 0xff, 0xff, 595 | 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xc0, 0x3e, 596 | 0x01, 0x00, 0x00, 0x00, 0x21, 0xbb, 0x6e, 0x42, 0x01, 0x00, 0x00, 0x00, 597 | 0x00, 0xa3, 0x11, 0xc2, 0x34, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, 598 | 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 0x65, 0x6e, 0x73, 0x65, 599 | 0x5f, 0x32, 0x2f, 0x4d, 0x61, 0x74, 0x4d, 0x75, 0x6c, 0x3b, 0x73, 0x65, 600 | 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 0x65, 0x6e, 601 | 0x73, 0x65, 0x5f, 0x32, 0x2f, 0x42, 0x69, 0x61, 0x73, 0x41, 0x64, 0x64, 602 | 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 603 | 0x02, 0x00, 0x00, 0x00, 0xb0, 0xfa, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, 604 | 0xac, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 605 | 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 606 | 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x9c, 0xfa, 0xff, 0xff, 607 | 0x2c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 608 | 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 609 | 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x47, 0xd5, 0x43, 0x3e, 610 | 0x01, 0x00, 0x00, 0x00, 0x72, 0x11, 0x43, 0x42, 0x01, 0x00, 0x00, 0x00, 611 | 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, 612 | 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 0x65, 0x6e, 0x73, 0x65, 613 | 0x5f, 0x31, 0x2f, 0x4d, 0x61, 0x74, 0x4d, 0x75, 0x6c, 0x3b, 0x73, 0x65, 614 | 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 0x65, 0x6e, 615 | 0x73, 0x65, 0x5f, 0x31, 0x2f, 0x52, 0x65, 0x6c, 0x75, 0x3b, 0x73, 0x65, 616 | 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 0x65, 0x6e, 617 | 0x73, 0x65, 0x5f, 0x31, 0x2f, 0x42, 0x69, 0x61, 0x73, 0x41, 0x64, 0x64, 618 | 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 619 | 0x40, 0x00, 0x00, 0x00, 0x70, 0xfb, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, 620 | 0xa4, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 621 | 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 622 | 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x5c, 0xfb, 0xff, 0xff, 623 | 0x2c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 624 | 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 625 | 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xa1, 0x34, 0xfd, 0x3e, 626 | 0x01, 0x00, 0x00, 0x00, 0x6c, 0x37, 0xfc, 0x42, 0x01, 0x00, 0x00, 0x00, 627 | 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, 628 | 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 0x65, 0x6e, 0x73, 0x65, 629 | 0x2f, 0x4d, 0x61, 0x74, 0x4d, 0x75, 0x6c, 0x3b, 0x73, 0x65, 0x71, 0x75, 630 | 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 0x65, 0x6e, 0x73, 0x65, 631 | 0x2f, 0x52, 0x65, 0x6c, 0x75, 0x3b, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 632 | 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x2f, 0x42, 633 | 0x69, 0x61, 0x73, 0x41, 0x64, 0x64, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 634 | 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x28, 0xfc, 0xff, 0xff, 635 | 0x00, 0x00, 0x00, 0x09, 0x7c, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 636 | 0x54, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 637 | 0x02, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 638 | 0x14, 0xfc, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 639 | 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 640 | 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 641 | 0x01, 0x00, 0x00, 0x00, 0xba, 0xb9, 0x39, 0x3f, 0x01, 0x00, 0x00, 0x00, 642 | 0x00, 0x00, 0x39, 0x43, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 643 | 0x1a, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 644 | 0x61, 0x6c, 0x2f, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x2f, 0x52, 645 | 0x65, 0x73, 0x68, 0x61, 0x70, 0x65, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 646 | 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x4a, 0xfd, 0xff, 0xff, 647 | 0x00, 0x00, 0x00, 0x09, 0x6c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 648 | 0x44, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x94, 0xfc, 0xff, 0xff, 649 | 0x30, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 650 | 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 651 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 652 | 0xb7, 0xd0, 0xd2, 0x3b, 0x01, 0x00, 0x00, 0x00, 0x16, 0x2b, 0x51, 0x3f, 653 | 0x01, 0x00, 0x00, 0x00, 0xc8, 0x55, 0x46, 0xbf, 0x19, 0x00, 0x00, 0x00, 654 | 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 655 | 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x32, 0x2f, 0x4d, 0x61, 0x74, 0x4d, 0x75, 656 | 0x6c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 657 | 0x40, 0x00, 0x00, 0x00, 0xca, 0xfd, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, 658 | 0x6c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 659 | 0x04, 0x00, 0x00, 0x00, 0x14, 0xfd, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 660 | 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 661 | 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 662 | 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x19, 0xb0, 0x96, 0x3c, 663 | 0x01, 0x00, 0x00, 0x00, 0x30, 0x49, 0x41, 0x3f, 0x01, 0x00, 0x00, 0x00, 664 | 0xb9, 0x82, 0x15, 0xc0, 0x19, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, 665 | 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 0x65, 0x6e, 0x73, 0x65, 666 | 0x5f, 0x31, 0x2f, 0x4d, 0x61, 0x74, 0x4d, 0x75, 0x6c, 0x00, 0x00, 0x00, 667 | 0x02, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 668 | 0x4a, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, 0x64, 0x00, 0x00, 0x00, 669 | 0x06, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 670 | 0x94, 0xfd, 0xff, 0xff, 0x2c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 671 | 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 672 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 673 | 0x77, 0x39, 0xbc, 0x3b, 0x01, 0x00, 0x00, 0x00, 0xe6, 0x50, 0xca, 0x3e, 674 | 0x01, 0x00, 0x00, 0x00, 0x04, 0xc1, 0x3a, 0xbf, 0x17, 0x00, 0x00, 0x00, 675 | 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 676 | 0x65, 0x6e, 0x73, 0x65, 0x2f, 0x4d, 0x61, 0x74, 0x4d, 0x75, 0x6c, 0x00, 677 | 0x02, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 678 | 0xc2, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0x38, 0x00, 0x00, 0x00, 679 | 0x05, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 680 | 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 681 | 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x66, 682 | 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x2f, 0x43, 0x6f, 0x6e, 0x73, 0x74, 683 | 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 684 | 0x0a, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0x68, 0x00, 0x00, 0x00, 685 | 0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 686 | 0xfc, 0xfe, 0xff, 0xff, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 687 | 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 688 | 0x01, 0x00, 0x00, 0x00, 0x9e, 0x44, 0xa1, 0x3a, 0x32, 0x00, 0x00, 0x00, 689 | 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 690 | 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x32, 0x2f, 0x42, 0x69, 0x61, 0x73, 0x41, 691 | 0x64, 0x64, 0x2f, 0x52, 0x65, 0x61, 0x64, 0x56, 0x61, 0x72, 0x69, 0x61, 692 | 0x62, 0x6c, 0x65, 0x4f, 0x70, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 693 | 0x63, 0x65, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 694 | 0x82, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0x6c, 0x00, 0x00, 0x00, 695 | 0x03, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 696 | 0x74, 0xff, 0xff, 0xff, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 697 | 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 698 | 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x0b, 0x15, 0x3c, 699 | 0x32, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 700 | 0x61, 0x6c, 0x2f, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x31, 0x2f, 0x42, 701 | 0x69, 0x61, 0x73, 0x41, 0x64, 0x64, 0x2f, 0x52, 0x65, 0x61, 0x64, 0x56, 702 | 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x4f, 0x70, 0x2f, 0x72, 0x65, 703 | 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 704 | 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x08, 0x00, 705 | 0x07, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00, 0x0e, 0x00, 0x00, 0x00, 706 | 0x00, 0x00, 0x00, 0x02, 0x74, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 707 | 0x34, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x0c, 0x00, 708 | 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x00, 0x00, 709 | 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 710 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 711 | 0x15, 0x8e, 0x88, 0x3b, 0x30, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, 712 | 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 0x65, 0x6e, 0x73, 0x65, 713 | 0x2f, 0x42, 0x69, 0x61, 0x73, 0x41, 0x64, 0x64, 0x2f, 0x52, 0x65, 0x61, 714 | 0x64, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x4f, 0x70, 0x2f, 715 | 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x00, 0x00, 0x00, 0x00, 716 | 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x14, 0x00, 0x1c, 0x00, 717 | 0x08, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 718 | 0x00, 0x00, 0x18, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 719 | 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 720 | 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 721 | 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x14, 0x00, 722 | 0x04, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 723 | 0x30, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 724 | 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 725 | 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 726 | 0xba, 0xb9, 0x39, 0x3f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x43, 727 | 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 728 | 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x5f, 0x69, 0x6e, 0x70, 0x75, 729 | 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x38, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 730 | 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 731 | 0x68, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 732 | 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xd4, 0xff, 0xff, 0xff, 733 | 0x00, 0x00, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 734 | 0xc8, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x72, 0x72, 0x00, 0x00, 0x00, 735 | 0xf0, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x19, 0x02, 0x00, 0x00, 0x00, 736 | 0x19, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x07, 0x00, 0x00, 0x00, 737 | 0x08, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 738 | 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x0c, 0x00, 739 | 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x00, 0x00, 740 | 0x00, 0x00, 0x00, 0x16, 0x16, 0x00, 0x00, 0x00 741 | }; 742 | unsigned int model_data_LED_model_quantized_tflite_len = 8864; 743 | -------------------------------------------------------------------------------- /model_data/LED_model_quantized.tflite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Santandersecurityresearch/CurrentSense-TinyML/ee0b04c33f2b7cbfd6a446c4f724591ddd64d363/model_data/LED_model_quantized.tflite -------------------------------------------------------------------------------- /model_data/checkpoint: -------------------------------------------------------------------------------- 1 | model_checkpoint_path: "pre-fit.weights" 2 | all_model_checkpoint_paths: "pre-fit.weights" 3 | -------------------------------------------------------------------------------- /model_data/pre-fit.weights.data-00000-of-00001: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Santandersecurityresearch/CurrentSense-TinyML/ee0b04c33f2b7cbfd6a446c4f724591ddd64d363/model_data/pre-fit.weights.data-00000-of-00001 -------------------------------------------------------------------------------- /model_data/pre-fit.weights.index: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Santandersecurityresearch/CurrentSense-TinyML/ee0b04c33f2b7cbfd6a446c4f724591ddd64d363/model_data/pre-fit.weights.index --------------------------------------------------------------------------------