diff --git a/DHT_sensor_library/CONTRIBUTING.md b/DHT_sensor_library/CONTRIBUTING.md deleted file mode 100644 index 3227bf9..0000000 --- a/DHT_sensor_library/CONTRIBUTING.md +++ /dev/null @@ -1,13 +0,0 @@ -# Contribution Guidlines - -This library is the culmination of the expertise of many members of the open source community who have dedicated their time and hard work. The best way to ask for help or propose a new idea is to [create a new issue](https://github.com/adafruit/DHT-sensor-library/issues/new) while creating a Pull Request with your code changes allows you to share your own innovations with the rest of the community. - -The following are some guidelines to observe when creating issues or PRs: - -- Be friendly; it is important that we can all enjoy a safe space as we are all working on the same project and it is okay for people to have different ideas - -- [Use code blocks](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet#code); it helps us help you when we can read your code! On that note also refrain from pasting more than 30 lines of code in a post, instead [create a gist](https://gist.github.com/) if you need to share large snippets - -- Use reasonable titles; refrain from using overly long or capitalized titles as they are usually annoying and do little to encourage others to help :smile: - -- Be detailed; refrain from mentioning code problems without sharing your source code and always give information regarding your board and version of the library diff --git a/DHT_sensor_library/DHT.cpp b/DHT_sensor_library/DHT.cpp deleted file mode 100644 index a48ac74..0000000 --- a/DHT_sensor_library/DHT.cpp +++ /dev/null @@ -1,390 +0,0 @@ -/*! - * @file DHT.cpp - * - * @mainpage DHT series of low cost temperature/humidity sensors. - * - * @section intro_sec Introduction - * - * This is a library for DHT series of low cost temperature/humidity sensors. - * - * You must have Adafruit Unified Sensor Library library installed to use this - * class. - * - * Adafruit invests time and resources providing this open source code, - * please support Adafruit andopen-source hardware by purchasing products - * from Adafruit! - * - * @section author Author - * - * Written by Adafruit Industries. - * - * @section license License - * - * MIT license, all text above must be included in any redistribution - */ - -#include "DHT.h" - -#define MIN_INTERVAL 2000 /**< min interval value */ -#define TIMEOUT \ - UINT32_MAX /**< Used programmatically for timeout. \ - Not a timeout duration. Type: uint32_t. */ - -/*! - * @brief Instantiates a new DHT class - * @param pin - * pin number that sensor is connected - * @param type - * type of sensor - * @param count - * number of sensors - */ -DHT::DHT(uint8_t pin, uint8_t type, uint8_t count) { - (void)count; // Workaround to avoid compiler warning. - _pin = pin; - _type = type; -#ifdef __AVR - _bit = digitalPinToBitMask(pin); - _port = digitalPinToPort(pin); -#endif - _maxcycles = - microsecondsToClockCycles(1000); // 1 millisecond timeout for - // reading pulses from DHT sensor. - // Note that count is now ignored as the DHT reading algorithm adjusts itself - // based on the speed of the processor. -} - -/*! - * @brief Setup sensor pins and set pull timings - * @param usec - * Optionally pass pull-up time (in microseconds) before DHT reading - *starts. Default is 55 (see function declaration in DHT.h). - */ -void DHT::begin(uint8_t usec) { - // set up the pins! - pinMode(_pin, INPUT_PULLUP); - // Using this value makes sure that millis() - lastreadtime will be - // >= MIN_INTERVAL right away. Note that this assignment wraps around, - // but so will the subtraction. - _lastreadtime = millis() - MIN_INTERVAL; - DEBUG_PRINT("DHT max clock cycles: "); - DEBUG_PRINTLN(_maxcycles, DEC); - pullTime = usec; -} - -/*! - * @brief Read temperature - * @param S - * Scale. Boolean value: - * - true = Fahrenheit - * - false = Celcius - * @param force - * true if in force mode - * @return Temperature value in selected scale - */ -float DHT::readTemperature(bool S, bool force) { - float f = NAN; - - if (read(force)) { - switch (_type) { - case DHT11: - f = data[2]; - if (data[3] & 0x80) { - f = -1 - f; - } - f += (data[3] & 0x0f) * 0.1; - if (S) { - f = convertCtoF(f); - } - break; - case DHT12: - f = data[2]; - f += (data[3] & 0x0f) * 0.1; - if (data[2] & 0x80) { - f *= -1; - } - if (S) { - f = convertCtoF(f); - } - break; - case DHT22: - case DHT21: - f = ((word)(data[2] & 0x7F)) << 8 | data[3]; - f *= 0.1; - if (data[2] & 0x80) { - f *= -1; - } - if (S) { - f = convertCtoF(f); - } - break; - } - } - return f; -} - -/*! - * @brief Converts Celcius to Fahrenheit - * @param c - * value in Celcius - * @return float value in Fahrenheit - */ -float DHT::convertCtoF(float c) { return c * 1.8 + 32; } - -/*! - * @brief Converts Fahrenheit to Celcius - * @param f - * value in Fahrenheit - * @return float value in Celcius - */ -float DHT::convertFtoC(float f) { return (f - 32) * 0.55555; } - -/*! - * @brief Read Humidity - * @param force - * force read mode - * @return float value - humidity in percent - */ -float DHT::readHumidity(bool force) { - float f = NAN; - if (read(force)) { - switch (_type) { - case DHT11: - case DHT12: - f = data[0] + data[1] * 0.1; - break; - case DHT22: - case DHT21: - f = ((word)data[0]) << 8 | data[1]; - f *= 0.1; - break; - } - } - return f; -} - -/*! - * @brief Compute Heat Index - * Simplified version that reads temp and humidity from sensor - * @param isFahrenheit - * true if fahrenheit, false if celcius - *(default true) - * @return float heat index - */ -float DHT::computeHeatIndex(bool isFahrenheit) { - float hi = computeHeatIndex(readTemperature(isFahrenheit), readHumidity(), - isFahrenheit); - return hi; -} - -/*! - * @brief Compute Heat Index - * Using both Rothfusz and Steadman's equations - * (http://www.wpc.ncep.noaa.gov/html/heatindex_equation.shtml) - * @param temperature - * temperature in selected scale - * @param percentHumidity - * humidity in percent - * @param isFahrenheit - * true if fahrenheit, false if celcius - * @return float heat index - */ -float DHT::computeHeatIndex(float temperature, float percentHumidity, - bool isFahrenheit) { - float hi; - - if (!isFahrenheit) - temperature = convertCtoF(temperature); - - hi = 0.5 * (temperature + 61.0 + ((temperature - 68.0) * 1.2) + - (percentHumidity * 0.094)); - - if (hi > 79) { - hi = -42.379 + 2.04901523 * temperature + 10.14333127 * percentHumidity + - -0.22475541 * temperature * percentHumidity + - -0.00683783 * pow(temperature, 2) + - -0.05481717 * pow(percentHumidity, 2) + - 0.00122874 * pow(temperature, 2) * percentHumidity + - 0.00085282 * temperature * pow(percentHumidity, 2) + - -0.00000199 * pow(temperature, 2) * pow(percentHumidity, 2); - - if ((percentHumidity < 13) && (temperature >= 80.0) && - (temperature <= 112.0)) - hi -= ((13.0 - percentHumidity) * 0.25) * - sqrt((17.0 - abs(temperature - 95.0)) * 0.05882); - - else if ((percentHumidity > 85.0) && (temperature >= 80.0) && - (temperature <= 87.0)) - hi += ((percentHumidity - 85.0) * 0.1) * ((87.0 - temperature) * 0.2); - } - - return isFahrenheit ? hi : convertFtoC(hi); -} - -/*! - * @brief Read value from sensor or return last one from less than two - *seconds. - * @param force - * true if using force mode - * @return float value - */ -bool DHT::read(bool force) { - // Check if sensor was read less than two seconds ago and return early - // to use last reading. - uint32_t currenttime = millis(); - if (!force && ((currenttime - _lastreadtime) < MIN_INTERVAL)) { - return _lastresult; // return last correct measurement - } - _lastreadtime = currenttime; - - // Reset 40 bits of received data to zero. - data[0] = data[1] = data[2] = data[3] = data[4] = 0; - -#if defined(ESP8266) - yield(); // Handle WiFi / reset software watchdog -#endif - - // Send start signal. See DHT datasheet for full signal diagram: - // http://www.adafruit.com/datasheets/Digital%20humidity%20and%20temperature%20sensor%20AM2302.pdf - - // Go into high impedence state to let pull-up raise data line level and - // start the reading process. - pinMode(_pin, INPUT_PULLUP); - delay(1); - - // First set data line low for a period according to sensor type - pinMode(_pin, OUTPUT); - digitalWrite(_pin, LOW); - switch (_type) { - case DHT22: - case DHT21: - delayMicroseconds(1100); // data sheet says "at least 1ms" - break; - case DHT11: - default: - delay(20); // data sheet says at least 18ms, 20ms just to be safe - break; - } - - uint32_t cycles[80]; - { - // End the start signal by setting data line high for 40 microseconds. - pinMode(_pin, INPUT_PULLUP); - - // Delay a moment to let sensor pull data line low. - delayMicroseconds(pullTime); - - // Now start reading the data line to get the value from the DHT sensor. - - // Turn off interrupts temporarily because the next sections - // are timing critical and we don't want any interruptions. - InterruptLock lock; - - // First expect a low signal for ~80 microseconds followed by a high signal - // for ~80 microseconds again. - if (expectPulse(LOW) == TIMEOUT) { - DEBUG_PRINTLN(F("DHT timeout waiting for start signal low pulse.")); - _lastresult = false; - return _lastresult; - } - if (expectPulse(HIGH) == TIMEOUT) { - DEBUG_PRINTLN(F("DHT timeout waiting for start signal high pulse.")); - _lastresult = false; - return _lastresult; - } - - // Now read the 40 bits sent by the sensor. Each bit is sent as a 50 - // microsecond low pulse followed by a variable length high pulse. If the - // high pulse is ~28 microseconds then it's a 0 and if it's ~70 microseconds - // then it's a 1. We measure the cycle count of the initial 50us low pulse - // and use that to compare to the cycle count of the high pulse to determine - // if the bit is a 0 (high state cycle count < low state cycle count), or a - // 1 (high state cycle count > low state cycle count). Note that for speed - // all the pulses are read into a array and then examined in a later step. - for (int i = 0; i < 80; i += 2) { - cycles[i] = expectPulse(LOW); - cycles[i + 1] = expectPulse(HIGH); - } - } // Timing critical code is now complete. - - // Inspect pulses and determine which ones are 0 (high state cycle count < low - // state cycle count), or 1 (high state cycle count > low state cycle count). - for (int i = 0; i < 40; ++i) { - uint32_t lowCycles = cycles[2 * i]; - uint32_t highCycles = cycles[2 * i + 1]; - if ((lowCycles == TIMEOUT) || (highCycles == TIMEOUT)) { - DEBUG_PRINTLN(F("DHT timeout waiting for pulse.")); - _lastresult = false; - return _lastresult; - } - data[i / 8] <<= 1; - // Now compare the low and high cycle times to see if the bit is a 0 or 1. - if (highCycles > lowCycles) { - // High cycles are greater than 50us low cycle count, must be a 1. - data[i / 8] |= 1; - } - // Else high cycles are less than (or equal to, a weird case) the 50us low - // cycle count so this must be a zero. Nothing needs to be changed in the - // stored data. - } - - DEBUG_PRINTLN(F("Received from DHT:")); - DEBUG_PRINT(data[0], HEX); - DEBUG_PRINT(F(", ")); - DEBUG_PRINT(data[1], HEX); - DEBUG_PRINT(F(", ")); - DEBUG_PRINT(data[2], HEX); - DEBUG_PRINT(F(", ")); - DEBUG_PRINT(data[3], HEX); - DEBUG_PRINT(F(", ")); - DEBUG_PRINT(data[4], HEX); - DEBUG_PRINT(F(" =? ")); - DEBUG_PRINTLN((data[0] + data[1] + data[2] + data[3]) & 0xFF, HEX); - - // Check we read 40 bits and that the checksum matches. - if (data[4] == ((data[0] + data[1] + data[2] + data[3]) & 0xFF)) { - _lastresult = true; - return _lastresult; - } else { - DEBUG_PRINTLN(F("DHT checksum failure!")); - _lastresult = false; - return _lastresult; - } -} - -// Expect the signal line to be at the specified level for a period of time and -// return a count of loop cycles spent at that level (this cycle count can be -// used to compare the relative time of two pulses). If more than a millisecond -// ellapses without the level changing then the call fails with a 0 response. -// This is adapted from Arduino's pulseInLong function (which is only available -// in the very latest IDE versions): -// https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/cores/arduino/wiring_pulse.c -uint32_t DHT::expectPulse(bool level) { -// F_CPU is not be known at compile time on platforms such as STM32F103. -// The preprocessor seems to evaluate it to zero in that case. -#if (F_CPU > 16000000L) || (F_CPU == 0L) - uint32_t count = 0; -#else - uint16_t count = 0; // To work fast enough on slower AVR boards -#endif -// On AVR platforms use direct GPIO port access as it's much faster and better -// for catching pulses that are 10's of microseconds in length: -#ifdef __AVR - uint8_t portState = level ? _bit : 0; - while ((*portInputRegister(_port) & _bit) == portState) { - if (count++ >= _maxcycles) { - return TIMEOUT; // Exceeded timeout, fail. - } - } -// Otherwise fall back to using digitalRead (this seems to be necessary on -// ESP8266 right now, perhaps bugs in direct port access functions?). -#else - while (digitalRead(_pin) == level) { - if (count++ >= _maxcycles) { - return TIMEOUT; // Exceeded timeout, fail. - } - } -#endif - - return count; -} diff --git a/DHT_sensor_library/DHT.h b/DHT_sensor_library/DHT.h deleted file mode 100644 index 95570e1..0000000 --- a/DHT_sensor_library/DHT.h +++ /dev/null @@ -1,109 +0,0 @@ -/*! - * @file DHT.h - * - * This is a library for DHT series of low cost temperature/humidity sensors. - * - * You must have Adafruit Unified Sensor Library library installed to use this - * class. - * - * Adafruit invests time and resources providing this open source code, - * please support Adafruit andopen-source hardware by purchasing products - * from Adafruit! - * - * Written by Adafruit Industries. - * - * MIT license, all text above must be included in any redistribution - */ - -#ifndef DHT_H -#define DHT_H - -#include "Arduino.h" - -/* Uncomment to enable printing out nice debug messages. */ -//#define DHT_DEBUG - -#define DEBUG_PRINTER \ - Serial /**< Define where debug output will be printed. \ - */ - -/* Setup debug printing macros. */ -#ifdef DHT_DEBUG -#define DEBUG_PRINT(...) \ - { DEBUG_PRINTER.print(__VA_ARGS__); } -#define DEBUG_PRINTLN(...) \ - { DEBUG_PRINTER.println(__VA_ARGS__); } -#else -#define DEBUG_PRINT(...) \ - {} /**< Debug Print Placeholder if Debug is disabled */ -#define DEBUG_PRINTLN(...) \ - {} /**< Debug Print Line Placeholder if Debug is disabled */ -#endif - -/* Define types of sensors. */ -static const uint8_t DHT11{11}; /**< DHT TYPE 11 */ -static const uint8_t DHT12{12}; /**< DHY TYPE 12 */ -static const uint8_t DHT21{21}; /**< DHT TYPE 21 */ -static const uint8_t DHT22{22}; /**< DHT TYPE 22 */ -static const uint8_t AM2301{21}; /**< AM2301 */ - -#if defined(TARGET_NAME) && (TARGET_NAME == ARDUINO_NANO33BLE) -#ifndef microsecondsToClockCycles -/*! - * As of 7 Sep 2020 the Arduino Nano 33 BLE boards do not have - * microsecondsToClockCycles defined. - */ -#define microsecondsToClockCycles(a) ((a) * (SystemCoreClock / 1000000L)) -#endif -#endif - -/*! - * @brief Class that stores state and functions for DHT - */ -class DHT { -public: - DHT(uint8_t pin, uint8_t type, uint8_t count = 6); - void begin(uint8_t usec = 55); - float readTemperature(bool S = false, bool force = false); - float convertCtoF(float); - float convertFtoC(float); - float computeHeatIndex(bool isFahrenheit = true); - float computeHeatIndex(float temperature, float percentHumidity, - bool isFahrenheit = true); - float readHumidity(bool force = false); - bool read(bool force = false); - -private: - uint8_t data[5]; - uint8_t _pin, _type; -#ifdef __AVR - // Use direct GPIO access on an 8-bit AVR so keep track of the port and - // bitmask for the digital pin connected to the DHT. Other platforms will use - // digitalRead. - uint8_t _bit, _port; -#endif - uint32_t _lastreadtime, _maxcycles; - bool _lastresult; - uint8_t pullTime; // Time (in usec) to pull up data line before reading - - uint32_t expectPulse(bool level); -}; - -/*! - * @brief Class that defines Interrupt Lock Avaiability - */ -class InterruptLock { -public: - InterruptLock() { -#if !defined(ARDUINO_ARCH_NRF52) - noInterrupts(); -#endif - } - ~InterruptLock() { -#if !defined(ARDUINO_ARCH_NRF52) - interrupts(); -#endif - } -}; - -#endif diff --git a/DHT_sensor_library/DHT_U.cpp b/DHT_sensor_library/DHT_U.cpp deleted file mode 100644 index 4182ed9..0000000 --- a/DHT_sensor_library/DHT_U.cpp +++ /dev/null @@ -1,239 +0,0 @@ -/*! - * @file DHT_U.cpp - * - * Temperature & Humidity Unified Sensor Library - * - * This is a library for DHT series of low cost temperature/humidity sensors. - * - * You must have Adafruit Unified Sensor Library library installed to use this - * class. - * - * Adafruit invests time and resources providing this open source code, - * please support Adafruit andopen-source hardware by purchasing products - * from Adafruit! - */ -#include "DHT_U.h" - -/*! - * @brief Instantiates a new DHT_Unified class - * @param pin - * pin number that sensor is connected - * @param type - * type of sensor - * @param count - * number of sensors - * @param tempSensorId - * temperature sensor id - * @param humiditySensorId - * humidity sensor id - */ -DHT_Unified::DHT_Unified(uint8_t pin, uint8_t type, uint8_t count, - int32_t tempSensorId, int32_t humiditySensorId) - : _dht(pin, type, count), _type(type), _temp(this, tempSensorId), - _humidity(this, humiditySensorId) {} - -/*! - * @brief Setup sensor (calls begin on It) - */ -void DHT_Unified::begin() { _dht.begin(); } - -/*! - * @brief Sets sensor name - * @param sensor - * Sensor that will be set - */ -void DHT_Unified::setName(sensor_t *sensor) { - switch (_type) { - case DHT11: - strncpy(sensor->name, "DHT11", sizeof(sensor->name) - 1); - break; - case DHT12: - strncpy(sensor->name, "DHT12", sizeof(sensor->name) - 1); - break; - case DHT21: - strncpy(sensor->name, "DHT21", sizeof(sensor->name) - 1); - break; - case DHT22: - strncpy(sensor->name, "DHT22", sizeof(sensor->name) - 1); - break; - default: - // TODO: Perhaps this should be an error? However main DHT library doesn't - // enforce restrictions on the sensor type value. Pick a generic name for - // now. - strncpy(sensor->name, "DHT?", sizeof(sensor->name) - 1); - break; - } - sensor->name[sizeof(sensor->name) - 1] = 0; -} - -/*! - * @brief Sets Minimum Delay Value - * @param sensor - * Sensor that will be set - */ -void DHT_Unified::setMinDelay(sensor_t *sensor) { - switch (_type) { - case DHT11: - sensor->min_delay = 1000000L; // 1 second (in microseconds) - break; - case DHT12: - sensor->min_delay = 2000000L; // 2 second (in microseconds) - break; - case DHT21: - sensor->min_delay = 2000000L; // 2 seconds (in microseconds) - break; - case DHT22: - sensor->min_delay = 2000000L; // 2 seconds (in microseconds) - break; - default: - // Default to slowest sample rate in case of unknown type. - sensor->min_delay = 2000000L; // 2 seconds (in microseconds) - break; - } -} - -/*! - * @brief Instantiates a new DHT_Unified Temperature Class - * @param parent - * Parent Sensor - * @param id - * Sensor id - */ -DHT_Unified::Temperature::Temperature(DHT_Unified *parent, int32_t id) - : _parent(parent), _id(id) {} - -/*! - * @brief Reads the sensor and returns the data as a sensors_event_t - * @param event - * @return always returns true - */ -bool DHT_Unified::Temperature::getEvent(sensors_event_t *event) { - // Clear event definition. - memset(event, 0, sizeof(sensors_event_t)); - // Populate sensor reading values. - event->version = sizeof(sensors_event_t); - event->sensor_id = _id; - event->type = SENSOR_TYPE_AMBIENT_TEMPERATURE; - event->timestamp = millis(); - event->temperature = _parent->_dht.readTemperature(); - - return true; -} - -/*! - * @brief Provides the sensor_t data for this sensor - * @param sensor - */ -void DHT_Unified::Temperature::getSensor(sensor_t *sensor) { - // Clear sensor definition. - memset(sensor, 0, sizeof(sensor_t)); - // Set sensor name. - _parent->setName(sensor); - // Set version and ID - sensor->version = DHT_SENSOR_VERSION; - sensor->sensor_id = _id; - // Set type and characteristics. - sensor->type = SENSOR_TYPE_AMBIENT_TEMPERATURE; - _parent->setMinDelay(sensor); - switch (_parent->_type) { - case DHT11: - sensor->max_value = 50.0F; - sensor->min_value = 0.0F; - sensor->resolution = 2.0F; - break; - case DHT12: - sensor->max_value = 60.0F; - sensor->min_value = -20.0F; - sensor->resolution = 0.5F; - break; - case DHT21: - sensor->max_value = 80.0F; - sensor->min_value = -40.0F; - sensor->resolution = 0.1F; - break; - case DHT22: - sensor->max_value = 125.0F; - sensor->min_value = -40.0F; - sensor->resolution = 0.1F; - break; - default: - // Unknown type, default to 0. - sensor->max_value = 0.0F; - sensor->min_value = 0.0F; - sensor->resolution = 0.0F; - break; - } -} - -/*! - * @brief Instantiates a new DHT_Unified Humidity Class - * @param parent - * Parent Sensor - * @param id - * Sensor id - */ -DHT_Unified::Humidity::Humidity(DHT_Unified *parent, int32_t id) - : _parent(parent), _id(id) {} - -/*! - * @brief Reads the sensor and returns the data as a sensors_event_t - * @param event - * @return always returns true - */ -bool DHT_Unified::Humidity::getEvent(sensors_event_t *event) { - // Clear event definition. - memset(event, 0, sizeof(sensors_event_t)); - // Populate sensor reading values. - event->version = sizeof(sensors_event_t); - event->sensor_id = _id; - event->type = SENSOR_TYPE_RELATIVE_HUMIDITY; - event->timestamp = millis(); - event->relative_humidity = _parent->_dht.readHumidity(); - - return true; -} - -/*! - * @brief Provides the sensor_t data for this sensor - * @param sensor - */ -void DHT_Unified::Humidity::getSensor(sensor_t *sensor) { - // Clear sensor definition. - memset(sensor, 0, sizeof(sensor_t)); - // Set sensor name. - _parent->setName(sensor); - // Set version and ID - sensor->version = DHT_SENSOR_VERSION; - sensor->sensor_id = _id; - // Set type and characteristics. - sensor->type = SENSOR_TYPE_RELATIVE_HUMIDITY; - _parent->setMinDelay(sensor); - switch (_parent->_type) { - case DHT11: - sensor->max_value = 80.0F; - sensor->min_value = 20.0F; - sensor->resolution = 5.0F; - break; - case DHT12: - sensor->max_value = 95.0F; - sensor->min_value = 20.0F; - sensor->resolution = 5.0F; - break; - case DHT21: - sensor->max_value = 100.0F; - sensor->min_value = 0.0F; - sensor->resolution = 0.1F; - break; - case DHT22: - sensor->max_value = 100.0F; - sensor->min_value = 0.0F; - sensor->resolution = 0.1F; - break; - default: - // Unknown type, default to 0. - sensor->max_value = 0.0F; - sensor->min_value = 0.0F; - sensor->resolution = 0.0F; - break; - } -} diff --git a/DHT_sensor_library/DHT_U.h b/DHT_sensor_library/DHT_U.h deleted file mode 100644 index 3d4ba83..0000000 --- a/DHT_sensor_library/DHT_U.h +++ /dev/null @@ -1,101 +0,0 @@ -/*! - * @file DHT_U.h - * - * DHT Temperature & Humidity Unified Sensor Library - * - * Adafruit invests time and resources providing this open source code, - * please support Adafruit andopen-source hardware by purchasing products - * from Adafruit! - * - * Written by Tony DiCola (Adafruit Industries) 2014. - * - * MIT license, all text above must be included in any redistribution - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - */ - -#ifndef DHT_U_H -#define DHT_U_H - -#include -#include - -#define DHT_SENSOR_VERSION 1 /**< Sensor Version */ - -/*! - * @brief Class that stores state and functions for interacting with - * DHT_Unified. - */ -class DHT_Unified { -public: - DHT_Unified(uint8_t pin, uint8_t type, uint8_t count = 6, - int32_t tempSensorId = -1, int32_t humiditySensorId = -1); - void begin(); - - /*! - * @brief Class that stores state and functions about Temperature - */ - class Temperature : public Adafruit_Sensor { - public: - Temperature(DHT_Unified *parent, int32_t id); - bool getEvent(sensors_event_t *event); - void getSensor(sensor_t *sensor); - - private: - DHT_Unified *_parent; - int32_t _id; - }; - - /*! - * @brief Class that stores state and functions about Humidity - */ - class Humidity : public Adafruit_Sensor { - public: - Humidity(DHT_Unified *parent, int32_t id); - bool getEvent(sensors_event_t *event); - void getSensor(sensor_t *sensor); - - private: - DHT_Unified *_parent; - int32_t _id; - }; - - /*! - * @brief Returns temperature stored in _temp - * @return Temperature value - */ - Temperature temperature() { return _temp; } - - /*! - * @brief Returns humidity stored in _humidity - * @return Humidity value - */ - Humidity humidity() { return _humidity; } - -private: - DHT _dht; - uint8_t _type; - Temperature _temp; - Humidity _humidity; - - void setName(sensor_t *sensor); - void setMinDelay(sensor_t *sensor); -}; - -#endif diff --git a/DHT_sensor_library/README.md b/DHT_sensor_library/README.md deleted file mode 100644 index ba87187..0000000 --- a/DHT_sensor_library/README.md +++ /dev/null @@ -1,58 +0,0 @@ -# DHT sensor library [![Build Status](https://github.com/adafruit/DHT-sensor-library/workflows/Arduino%20Library%20CI/badge.svg)](https://github.com/adafruit/DHT-sensor-library/actions) - -## Description - -An Arduino library for the DHT series of low-cost temperature/humidity sensors. - -You can find DHT tutorials [here](https://learn.adafruit.com/dht). - -# Dependencies - * [Adafruit Unified Sensor Driver](https://github.com/adafruit/Adafruit_Sensor) - -# Contributing - -Contributions are welcome! Not only you’ll encourage the development of the library, but you’ll also learn how to best use the library and probably some C++ too - -Please read our [Code of Conduct](https://github.com/adafruit/DHT-sensor-library/blob/master/CODE_OF_CONDUCT.md>) -before contributing to help this project stay welcoming. - -## Documentation and doxygen -Documentation is produced by doxygen. Contributions should include documentation for any new code added. - -Some examples of how to use doxygen can be found in these guide pages: - -https://learn.adafruit.com/the-well-automated-arduino-library/doxygen - -https://learn.adafruit.com/the-well-automated-arduino-library/doxygen-tips - -Written by Adafruit Industries based on work by: - - * T. DiCola - * P. Y. Dragon - * L. Fried - * J. Hoffmann - * M. Kooijman - * J. M. Dana - * S. Conaway - * S. IJskes - * T. Forbes - * B. C - * T. J Myers - * L. Sørup - * per1234 - * O. Duffy - * matthiasdanner - * J. Lim - * G. Ambrozio - * chelmi - * adams13x13 - * Spacefish - * I. Scheller - * C. Miller - * 7eggert - - -MIT license, check license.txt for more information -All text above must be included in any redistribution - -To install, use the Arduino Library Manager and search for "DHT sensor library" and install the library. diff --git a/DHT_sensor_library/code-of-conduct.md b/DHT_sensor_library/code-of-conduct.md deleted file mode 100644 index 8ee6e44..0000000 --- a/DHT_sensor_library/code-of-conduct.md +++ /dev/null @@ -1,127 +0,0 @@ -# Adafruit Community Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as -contributors and leaders pledge to making participation in our project and -our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, gender identity and expression, level or type of -experience, education, socio-economic status, nationality, personal appearance, -race, religion, or sexual identity and orientation. - -## Our Standards - -We are committed to providing a friendly, safe and welcoming environment for -all. - -Examples of behavior that contributes to creating a positive environment -include: - -* Be kind and courteous to others -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Collaborating with other community members -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and sexual attention or advances -* The use of inappropriate images, including in a community member's avatar -* The use of inappropriate language, including in a community member's nickname -* Any spamming, flaming, baiting or other attention-stealing behavior -* Excessive or unwelcome helping; answering outside the scope of the question - asked -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic - address, without explicit permission -* Other conduct which could reasonably be considered inappropriate - -The goal of the standards and moderation guidelines outlined here is to build -and maintain a respectful community. We ask that you don’t just aim to be -"technically unimpeachable", but rather try to be your best self. - -We value many things beyond technical expertise, including collaboration and -supporting others within our community. Providing a positive experience for -other community members can have a much more significant impact than simply -providing the correct answer. - -## Our Responsibilities - -Project leaders are responsible for clarifying the standards of acceptable -behavior and are expected to take appropriate and fair corrective action in -response to any instances of unacceptable behavior. - -Project leaders have the right and responsibility to remove, edit, or -reject messages, comments, commits, code, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any community member for other behaviors that they deem -inappropriate, threatening, offensive, or harmful. - -## Moderation - -Instances of behaviors that violate the Adafruit Community Code of Conduct -may be reported by any member of the community. Community members are -encouraged to report these situations, including situations they witness -involving other community members. - -You may report in the following ways: - -In any situation, you may send an email to . - -On the Adafruit Discord, you may send an open message from any channel -to all Community Helpers by tagging @community helpers. You may also send an -open message from any channel, or a direct message to @kattni#1507, -@tannewt#4653, @Dan Halbert#1614, @cater#2442, @sommersoft#0222, or -@Andon#8175. - -Email and direct message reports will be kept confidential. - -In situations on Discord where the issue is particularly egregious, possibly -illegal, requires immediate action, or violates the Discord terms of service, -you should also report the message directly to Discord. - -These are the steps for upholding our community’s standards of conduct. - -1. Any member of the community may report any situation that violates the -Adafruit Community Code of Conduct. All reports will be reviewed and -investigated. -2. If the behavior is an egregious violation, the community member who -committed the violation may be banned immediately, without warning. -3. Otherwise, moderators will first respond to such behavior with a warning. -4. Moderators follow a soft "three strikes" policy - the community member may -be given another chance, if they are receptive to the warning and change their -behavior. -5. If the community member is unreceptive or unreasonable when warned by a -moderator, or the warning goes unheeded, they may be banned for a first or -second offense. Repeated offenses will result in the community member being -banned. - -## Scope - -This Code of Conduct and the enforcement policies listed above apply to all -Adafruit Community venues. This includes but is not limited to any community -spaces (both public and private), the entire Adafruit Discord server, and -Adafruit GitHub repositories. Examples of Adafruit Community spaces include -but are not limited to meet-ups, audio chats on the Adafruit Discord, or -interaction at a conference. - -This Code of Conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. As a community -member, you are representing our community, and are expected to behave -accordingly. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], -version 1.4, available at -, -and the [Rust Code of Conduct](https://www.rust-lang.org/en-US/conduct.html). - -For other projects adopting the Adafruit Community Code of -Conduct, please contact the maintainers of those projects for enforcement. -If you wish to use this code of conduct for your own project, consider -explicitly mentioning your moderation policy or making a copy with your -own moderation policy so as to avoid confusion. diff --git a/DHT_sensor_library/examples/DHT_Unified_Sensor/DHT_Unified_Sensor.ino b/DHT_sensor_library/examples/DHT_Unified_Sensor/DHT_Unified_Sensor.ino deleted file mode 100644 index 0f70347..0000000 --- a/DHT_sensor_library/examples/DHT_Unified_Sensor/DHT_Unified_Sensor.ino +++ /dev/null @@ -1,85 +0,0 @@ -// DHT Temperature & Humidity Sensor -// Unified Sensor Library Example -// Written by Tony DiCola for Adafruit Industries -// Released under an MIT license. - -// REQUIRES the following Arduino libraries: -// - DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library -// - Adafruit Unified Sensor Lib: https://github.com/adafruit/Adafruit_Sensor - -#include -#include -#include - -#define DHTPIN 2 // Digital pin connected to the DHT sensor -// Feather HUZZAH ESP8266 note: use pins 3, 4, 5, 12, 13 or 14 -- -// Pin 15 can work but DHT must be disconnected during program upload. - -// Uncomment the type of sensor in use: -//#define DHTTYPE DHT11 // DHT 11 -#define DHTTYPE DHT22 // DHT 22 (AM2302) -//#define DHTTYPE DHT21 // DHT 21 (AM2301) - -// See guide for details on sensor wiring and usage: -// https://learn.adafruit.com/dht/overview - -DHT_Unified dht(DHTPIN, DHTTYPE); - -uint32_t delayMS; - -void setup() { - Serial.begin(9600); - // Initialize device. - dht.begin(); - Serial.println(F("DHTxx Unified Sensor Example")); - // Print temperature sensor details. - sensor_t sensor; - dht.temperature().getSensor(&sensor); - Serial.println(F("------------------------------------")); - Serial.println(F("Temperature Sensor")); - Serial.print (F("Sensor Type: ")); Serial.println(sensor.name); - Serial.print (F("Driver Ver: ")); Serial.println(sensor.version); - Serial.print (F("Unique ID: ")); Serial.println(sensor.sensor_id); - Serial.print (F("Max Value: ")); Serial.print(sensor.max_value); Serial.println(F("°C")); - Serial.print (F("Min Value: ")); Serial.print(sensor.min_value); Serial.println(F("°C")); - Serial.print (F("Resolution: ")); Serial.print(sensor.resolution); Serial.println(F("°C")); - Serial.println(F("------------------------------------")); - // Print humidity sensor details. - dht.humidity().getSensor(&sensor); - Serial.println(F("Humidity Sensor")); - Serial.print (F("Sensor Type: ")); Serial.println(sensor.name); - Serial.print (F("Driver Ver: ")); Serial.println(sensor.version); - Serial.print (F("Unique ID: ")); Serial.println(sensor.sensor_id); - Serial.print (F("Max Value: ")); Serial.print(sensor.max_value); Serial.println(F("%")); - Serial.print (F("Min Value: ")); Serial.print(sensor.min_value); Serial.println(F("%")); - Serial.print (F("Resolution: ")); Serial.print(sensor.resolution); Serial.println(F("%")); - Serial.println(F("------------------------------------")); - // Set delay between sensor readings based on sensor details. - delayMS = sensor.min_delay / 1000; -} - -void loop() { - // Delay between measurements. - delay(delayMS); - // Get temperature event and print its value. - sensors_event_t event; - dht.temperature().getEvent(&event); - if (isnan(event.temperature)) { - Serial.println(F("Error reading temperature!")); - } - else { - Serial.print(F("Temperature: ")); - Serial.print(event.temperature); - Serial.println(F("°C")); - } - // Get humidity event and print its value. - dht.humidity().getEvent(&event); - if (isnan(event.relative_humidity)) { - Serial.println(F("Error reading humidity!")); - } - else { - Serial.print(F("Humidity: ")); - Serial.print(event.relative_humidity); - Serial.println(F("%")); - } -} diff --git a/DHT_sensor_library/examples/DHTtester/DHTtester.ino b/DHT_sensor_library/examples/DHTtester/DHTtester.ino deleted file mode 100644 index d13507b..0000000 --- a/DHT_sensor_library/examples/DHTtester/DHTtester.ino +++ /dev/null @@ -1,74 +0,0 @@ -// Example testing sketch for various DHT humidity/temperature sensors -// Written by ladyada, public domain - -// REQUIRES the following Arduino libraries: -// - DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library -// - Adafruit Unified Sensor Lib: https://github.com/adafruit/Adafruit_Sensor - -#include "DHT.h" - -#define DHTPIN 2 // Digital pin connected to the DHT sensor -// Feather HUZZAH ESP8266 note: use pins 3, 4, 5, 12, 13 or 14 -- -// Pin 15 can work but DHT must be disconnected during program upload. - -// Uncomment whatever type you're using! -//#define DHTTYPE DHT11 // DHT 11 -#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 -//#define DHTTYPE DHT21 // DHT 21 (AM2301) - -// Connect pin 1 (on the left) of the sensor to +5V -// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1 -// to 3.3V instead of 5V! -// Connect pin 2 of the sensor to whatever your DHTPIN is -// Connect pin 3 (on the right) of the sensor to GROUND (if your sensor has 3 pins) -// Connect pin 4 (on the right) of the sensor to GROUND and leave the pin 3 EMPTY (if your sensor has 4 pins) -// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor - -// Initialize DHT sensor. -// Note that older versions of this library took an optional third parameter to -// tweak the timings for faster processors. This parameter is no longer needed -// as the current DHT reading algorithm adjusts itself to work on faster procs. -DHT dht(DHTPIN, DHTTYPE); - -void setup() { - Serial.begin(9600); - Serial.println(F("DHTxx test!")); - - dht.begin(); -} - -void loop() { - // Wait a few seconds between measurements. - delay(2000); - - // Reading temperature or humidity takes about 250 milliseconds! - // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) - float h = dht.readHumidity(); - // Read temperature as Celsius (the default) - float t = dht.readTemperature(); - // Read temperature as Fahrenheit (isFahrenheit = true) - float f = dht.readTemperature(true); - - // Check if any reads failed and exit early (to try again). - if (isnan(h) || isnan(t) || isnan(f)) { - Serial.println(F("Failed to read from DHT sensor!")); - return; - } - - // Compute heat index in Fahrenheit (the default) - float hif = dht.computeHeatIndex(f, h); - // Compute heat index in Celsius (isFahreheit = false) - float hic = dht.computeHeatIndex(t, h, false); - - Serial.print(F("Humidity: ")); - Serial.print(h); - Serial.print(F("% Temperature: ")); - Serial.print(t); - Serial.print(F("°C ")); - Serial.print(f); - Serial.print(F("°F Heat index: ")); - Serial.print(hic); - Serial.print(F("°C ")); - Serial.print(hif); - Serial.println(F("°F")); -} diff --git a/DHT_sensor_library/keywords.txt b/DHT_sensor_library/keywords.txt deleted file mode 100644 index 3b0280f..0000000 --- a/DHT_sensor_library/keywords.txt +++ /dev/null @@ -1,22 +0,0 @@ -########################################### -# Syntax Coloring Map For DHT-sensor-library -########################################### - -########################################### -# Datatypes (KEYWORD1) -########################################### - -DHT KEYWORD1 - -########################################### -# Methods and Functions (KEYWORD2) -########################################### - -begin KEYWORD2 -readTemperature KEYWORD2 -convertCtoF KEYWORD2 -convertFtoC KEYWORD2 -computeHeatIndex KEYWORD2 -readHumidity KEYWORD2 -read KEYWORD2 - diff --git a/DHT_sensor_library/library.properties b/DHT_sensor_library/library.properties deleted file mode 100644 index 56f2b42..0000000 --- a/DHT_sensor_library/library.properties +++ /dev/null @@ -1,10 +0,0 @@ -name=DHT sensor library -version=1.4.4 -author=Adafruit -maintainer=Adafruit -sentence=Arduino library for DHT11, DHT22, etc Temp & Humidity Sensors -paragraph=Arduino library for DHT11, DHT22, etc Temp & Humidity Sensors -category=Sensors -url=https://github.com/adafruit/DHT-sensor-library -architectures=* -depends=Adafruit Unified Sensor diff --git a/DHT_sensor_library/license.txt b/DHT_sensor_library/license.txt deleted file mode 100644 index f06f843..0000000 --- a/DHT_sensor_library/license.txt +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2020 Adafruit Industries - - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE -OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Dht11/History/dht11.~(1).cpp.Zip b/Dht11/History/dht11.~(1).cpp.Zip new file mode 100644 index 0000000..d822f0d Binary files /dev/null and b/Dht11/History/dht11.~(1).cpp.Zip differ diff --git a/Dht11/History/dht11.~(1).h.Zip b/Dht11/History/dht11.~(1).h.Zip new file mode 100644 index 0000000..82feaba Binary files /dev/null and b/Dht11/History/dht11.~(1).h.Zip differ diff --git a/Dht11/History/dht11.~(10).cpp.Zip b/Dht11/History/dht11.~(10).cpp.Zip new file mode 100644 index 0000000..3cebc42 Binary files /dev/null and b/Dht11/History/dht11.~(10).cpp.Zip differ diff --git a/Dht11/History/dht11.~(11).cpp.Zip b/Dht11/History/dht11.~(11).cpp.Zip new file mode 100644 index 0000000..fc0bc8a Binary files /dev/null and b/Dht11/History/dht11.~(11).cpp.Zip differ diff --git a/Dht11/History/dht11.~(12).cpp.Zip b/Dht11/History/dht11.~(12).cpp.Zip new file mode 100644 index 0000000..6b84306 Binary files /dev/null and b/Dht11/History/dht11.~(12).cpp.Zip differ diff --git a/Dht11/History/dht11.~(13).cpp.Zip b/Dht11/History/dht11.~(13).cpp.Zip new file mode 100644 index 0000000..9a56c43 Binary files /dev/null and b/Dht11/History/dht11.~(13).cpp.Zip differ diff --git a/Dht11/History/dht11.~(14).cpp.Zip b/Dht11/History/dht11.~(14).cpp.Zip new file mode 100644 index 0000000..563b53f Binary files /dev/null and b/Dht11/History/dht11.~(14).cpp.Zip differ diff --git a/Dht11/History/dht11.~(15).cpp.Zip b/Dht11/History/dht11.~(15).cpp.Zip new file mode 100644 index 0000000..85ea13d Binary files /dev/null and b/Dht11/History/dht11.~(15).cpp.Zip differ diff --git a/Dht11/History/dht11.~(16).cpp.Zip b/Dht11/History/dht11.~(16).cpp.Zip new file mode 100644 index 0000000..1b7f797 Binary files /dev/null and b/Dht11/History/dht11.~(16).cpp.Zip differ diff --git a/Dht11/History/dht11.~(17).cpp.Zip b/Dht11/History/dht11.~(17).cpp.Zip new file mode 100644 index 0000000..a2e1a63 Binary files /dev/null and b/Dht11/History/dht11.~(17).cpp.Zip differ diff --git a/Dht11/History/dht11.~(2).cpp.Zip b/Dht11/History/dht11.~(2).cpp.Zip new file mode 100644 index 0000000..2692f7c Binary files /dev/null and b/Dht11/History/dht11.~(2).cpp.Zip differ diff --git a/Dht11/History/dht11.~(3).cpp.Zip b/Dht11/History/dht11.~(3).cpp.Zip new file mode 100644 index 0000000..0123fce Binary files /dev/null and b/Dht11/History/dht11.~(3).cpp.Zip differ diff --git a/Dht11/History/dht11.~(4).cpp.Zip b/Dht11/History/dht11.~(4).cpp.Zip new file mode 100644 index 0000000..6977458 Binary files /dev/null and b/Dht11/History/dht11.~(4).cpp.Zip differ diff --git a/Dht11/History/dht11.~(5).cpp.Zip b/Dht11/History/dht11.~(5).cpp.Zip new file mode 100644 index 0000000..59df3d8 Binary files /dev/null and b/Dht11/History/dht11.~(5).cpp.Zip differ diff --git a/Dht11/History/dht11.~(6).cpp.Zip b/Dht11/History/dht11.~(6).cpp.Zip new file mode 100644 index 0000000..c36613d Binary files /dev/null and b/Dht11/History/dht11.~(6).cpp.Zip differ diff --git a/Dht11/History/dht11.~(7).cpp.Zip b/Dht11/History/dht11.~(7).cpp.Zip new file mode 100644 index 0000000..a3b61d8 Binary files /dev/null and b/Dht11/History/dht11.~(7).cpp.Zip differ diff --git a/Dht11/History/dht11.~(8).cpp.Zip b/Dht11/History/dht11.~(8).cpp.Zip new file mode 100644 index 0000000..ba7ee6b Binary files /dev/null and b/Dht11/History/dht11.~(8).cpp.Zip differ diff --git a/Dht11/History/dht11.~(9).cpp.Zip b/Dht11/History/dht11.~(9).cpp.Zip new file mode 100644 index 0000000..dfb1701 Binary files /dev/null and b/Dht11/History/dht11.~(9).cpp.Zip differ diff --git a/Dht11/__Previews/dht11.cppPreview b/Dht11/__Previews/dht11.cppPreview new file mode 100644 index 0000000..18ca8b9 --- /dev/null +++ b/Dht11/__Previews/dht11.cppPreview @@ -0,0 +1,14 @@ +[Preview] +LargeImageOriginalSize=708000 +LargeImageWidth=354 +LargeImageHeight=500 +LargeImage=78DAECBDDF6B2357B6F7BDFE91F7EEB9786ECECDB998AB84D0174D8621E86D33641EDC3121072798268FE60491F699398EA3EE99B41DDA694D9BD03E9123DAF6A86DE12802A718D781D62865832507C9C212BC32A2FC80047A74236474E3E8C2377AF75AA55D2EFD70B7FBF7AFEFC587DADAB56BEF5D25FB5B4BBB56ADD5E974A803000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F08A93B0CA140A06A9D3AE3DD7712BF51659964527AD3ABE0700C04B4B2A699155AE91994A52586965C2CA50221CA4A899A7A0FA9C37A36E99B5346FDB5266F8F85ABB43C9F5252987A2A6F4110C85DCF6ACBD5C3F3115A4F8B76155EFECE37A2B5F73CACDB29A43D3ED371A8DB96387136A7E89B0ECAFE52D770CABEC99873A5ED747232199CBD27A921A6A0C33BEED6A71C1AE4B3997CD52566D2BF53A95B256CF393C2A3C2F994FBE28D72D188ACA9CCA5642E6C4659E77309C70DB3CC9780080D78BB6E20F1F7F457FBDF315C543DF50E4E66DDA3DEA9011FC93EC378221B76D2868A8AD4D17462695B6F85D1D8EA4948D5B4B51ACD8A65A324CE5A63A2E142423B22BED0DBB4DB611A164AD4DBB91B0D36F242ADBF09D886852DE3468617D47FA9CBD3AD6D326B67B44C1C9715A9A9BA454AD43E33E9FE8FBC2F2BADBBE7F6C99D7CA0A35D4B690DC96CFE96D677B90ABCA36B7B727FBABB903F91CBD1B1BB83EAC9D5AEB13C669B959B67ADAF15C6DB5DD8D18EEE78C9A8B6DC4A48FC04797E47A78DB0C1B0F00F0E6C1F628DB6779A5913794BE4CFEC77FF6D8A76CD3F5EB306B1DB7611B553447E96C331373ED61EE8F75282C3ADD3CB593557D221C165DE27EB99F914B3EE9AB5DCBBBFDEA31B50E1B4A873B47BBF4B79BCE786C1FB39DDCDFDE3BB6D8C32B77655DA25028B9F670A5712C7670BD7542E974BA67CD626979E9A9EBF0CEE29CCC93AF55BF0E0F1B0F00F066632A4D667DF3D6698DD3BFBDB5AEF693DF2FF6FC4EE7E352667E687BB67FCB56F2A1BFF5F5D8ACBB7A8DE23C6B04FAB8BC2A0F5B8F3EB4EB43E7D42CE79F685D42AFE778D725783D87F7E58B29D174DDE649C6030000000000000000DEB875E47481EC421AD70200009E32AD13A5B196F3BCAA6E17C8CA3ACFB48E1B1579A6A5CBDBB90355CE8A16EB63D8DF2B5DB0A95129894ECB315D7FDDCE71E35CE37BD75279CD947DDA781D98CBDAE7CD5B2F7E06665ECAFC1C6C313081EF1100F05A7090DBA3C396D2E5C39CEBD3B5B7775A4EA60F445BB3768B92F1BF53E7A4253A9D3B507AFB6B95F6BABE5FBB999CE874BD52EF798EE5FA1C84830363BB7E1186AD74B728FE5C5C2E2AFD2DC6623DF5D26EFD47B71C0A279EFBBB210000F0AC7498F5D3DC4CD226DBC6850C650A75B7BC1657F5E626DD374DCAFCF327F7B878B2409B1BAB94FC294E8DE30EADADAD0EBCBF766E1DEEFA1B7F17325479537CBC52A1E59E7AF6BFE0F64ED9F1A5609F377C870080577AED375B92B585475DCB28140A4FE57D67AF8F32AF53B8FE6A1E3F396F3DFB3C7B8F010000000000000000000000000000000000000000000000000000000000785DD1F1D7CF130FF849C67811F9EC0000E045E0E4CA08492C1D7E87CDECE650D339E9F8BDE161F9E93EFBC38712DB7CDF4AC8FB6E9CA342E76333A34E0EBA70384C658EFBD31D4BC7ECD1F9E9748C77CEFFE1ED2B993229307B9B52A1C0C07C399650A5943DF7FB7A7C2EE130C7644FAA6DA427EF9DCE2BA2CF8FDBEAF7B0B9CCC7EBF3D17DEABC729CFF4EDF273E9D0AE3FD6A00C06371A4E09C749CDB6839788542D76FB8F9E916EEE5C9AF348873FB885E77F322FDE9EA0D79DFF8BD77FDF405C77EA8A568CA1FA158B148A3EFFC8BE8966F7C52B569D3C7FEB0E434F28EC9712338EF1D8F99BC1D106DBEF1F91F7BFAFAD3D58F289C69AA761F0CCC99630995FA726A9C15C382CF8573E34596A3145D8E481DC7ABE0184299F09D9E3EB80D6F57569C769C77AFCC7934549FB70301F71D6B9E236F751C223DFEB3FC7D0000787DE15C48912FFE374DDFB3E8CAE8FBF4F1EFFF40E39333544BDEA5BBC99A2A076937F285E8CC47EF8C8A0E5F9F37254FE8DB6FBF4FBF9F98A5991B7FA6D9C004959B6D0AF8FD724C6C7E4EDAFCEEDD8FCED461D6DF898F03D23E7F6F4EF535EFF6757D3E41E3D33334ED7BABE7581D4BA83F16F2593A3C6F9669ECE205BA7CF923FAFAF3316917F08D5353ED0BF8E728A0C60E7DFE81C4ACB8F0F688CC99EF3FBC9DF207C8C814293819A0BF7E34F6401DE67514AFCD0C0000CF022361D159F9E986C15AF7BB7702033AEC0F27940E7FFED8F3A8D7EB4F741E4EDEBCC73F7ED8BA04000000000000000000000000000000000000000000000000000000000000787368B53B64052DA110B29EA8AF82597F6A7D01009E3EDE983FFCCE5C30181E9AC79EDF5BE677CF5A274A1FACB4C2A2BA5D202B5B92B2BC8FDC2D1F372AB49D3B50E5ACBCB3EC1CE3D4A70B36352AAA5DBA209F1F25CECF79D1F1873846849EF7B0761C1B88E31971D91BD3285F6B4BB99637DDB8490905B7D7EF59731C231D43C9DB67365111BD2B8595EE854BD4B0D4B986D4B9962BF299F7D58BA7BA7852ABCB7ED1C868C1AD6FE52B3DFDA6A3B6D4A71559D5AED36C50215692F12A892C55CAC7720C6BAEB4E9ABF7F6C575DC17F7A1C73E34796E69679EDD39C85CCD42F79E9096B27CCFDDB2EE87C7E17AC44702E0F1D1317FE43DE5A93F0D6DC37172742C06E620B747872D65B71DE6E4F361F5D02DE7F6F628993EA0CE7183B2768B92F1BF3BB1280E6DCA1D34A8F36B95F6944E73DDB0383F67D11F7782B5B03F0685BCB36DA8736917297AD78917A1B7FDF823CE3BDAB162DB8D69C43A7C93EB8F76C94C25DDB84946F08AB46F179DBE388E918EA1E4ED33B7FB2B75EC032A648EE9205255750DDA8B38E7DA5054BB65AE3BB03BF4EBAE73CD0E227BCEF1CB7B74ACB65B57FFBBA7DF03D56FBD7848F54C950A3FD7C90CDC17CD2CA87A6B72837273F7C9AE9D5075715B7433F7F79C5B3FECDCF53CBC63EF457354CF37640E079B0772BFA8EFD72939ABE6D856DFE362955A7649CA7BDFAA6DE7D83D37FDFD203E12008F8E37E60FDBC3BF79FBFDA1FF4BC37498ED5C7333499BCAD66DFDDA72CBF54286D6E2AA6C6ED27DD3A4CC3F7F728F8B270BB4B9B14AC99FE23D717EBC7679EDA8E6C6D3F4CEE5DC3A2CFA6AD37721E34C1D9673F54DD3A59109CAFC23ECC63432BE9FA38BBE000527C7C956F6B08E9BC4F1EBB8FDC7231768E6F3518963A463280DD3E1C39AB28D950E5BC14D32C7E24375B84767BB5AB87A455D37B68793BDFB596F572FC7A56FD664D6DC7A2C2BE5CE5195B6E7D232F649D1B1593337B6DDFAF3EAF0B6D2E19FAEE5448737BECC28BBDAF9DE32E18C6C4BF6091DA6F47DA3F71EC3203E12008F8F37E6CFE5CF6F8AB6E9DFEBFDEB127AFDE1209D3C77FF39BB41E67D8BB67E5A19D8F7A4717E86C1EB0A9381002DCFF81FB82E7116DA1E7E9CB137E66DB2FC714AFA4D8A4FA4A96A6569CD67D2D64A893655FD862F4EF18FE2AA2E2EEB02723D43058AFBD6645D62F5D29AE8702391EBED77B624F6ADE953CCA769C3AFB47AA7A0CAB6D46F0736C48E36FDDB644E5A647E9D73EBFBE718BFBA25F3609DD563F3BAC4CAEF9C39ADFEE67B8A2BCDE73587835092726643F565CA399576AA649B7C4C925647BE97F3581DBF2FF707FC2F0100000000000000000000F06249252DB2CA3579D6CFF9E91256A6273F1D3FF71A969F4EF2CAF5AD038BCF16EF0B85DCF61C2B9DEB27A68214FF36DC939F8EF360E8FC74DE676AD168AC278F1CE790E3FDB5BCE58E61953DF350C7EBFA68C479EEC371DA1B6A0C33BE2D3E7027AD3A15ECBA9473D92C65D5B652AF53296B3DD69AB0776D59CF839F39F1B5D2E76D2553326FF6CDE23110371E00D04F5BF1878FBFA2BFDEF98AE2A16FC4E7CAEB5BC5F98BFA7DD52E8C4C4ADE20ADC3DA2F827DB96AC9B03C03374241D707817DB838475C52E9D56E24DCF54F707C1AC27722A24F79D3A085F51DE973F6EA584F9BD8EE91F8222CCD4D52AAD6A1719F4F746E6179DD6DDF3FB6CC6B6545FC0D0AC96DC79F767BBBEBB751757DE5C41FA1EB0F37CC4742FB57888F85715AEE7F26198D387E16CBD188E4F3E373FAF8F3FFA05B1F5CA63F2FC5D4F93B7DEB3C4A0000E0EAC74E8D3E1F7D8BEE465374F1ADB7E9FDCB7F105F2CF6AD623BCE9BBF48EBF0378B96E870E0E3891E1D660D0C0426C91FF08B16721E386ECF9A1408DCA051553F3F312ADAC6FBB9FDC8259F9B133A6377A4DFF5F9A91E1D36940EB32FC2ADB9DB4E5FFE295AF822D0D3BE7F6CADC3A57A8BD622CB6203DBB96DAA348EC95CDDA07AEB84BE8F7C4F1BF72D6A94724F4D87E5DED6F517FE7FFFE35BBAF3B73BB47CFB534A457E800E03001E4AA29B33D45BA7DF93F3FA0C9FF5DE9CD76797B5D0C903D71CDABE6C393E6CC5FDFC993ECA5A4F039C9754D9C37381F173F936EBE3CECA1F7738E41D90275D9718F18DCADA89CCB79B7FF477973EA1C4CC2825AC32DD0E7C8475090000000000000000E071DF654E17E45D625C0B000078BA9C150B4DE29A358E1F100B2D2DFE5EC362A1492CB5E3C6B9C60F86A2F2DC8BD7A1FB639E69DF2F6FBD3C1333F352CE343BB41898C0F70800782DD0B1D0EA852D893990DBDAA6EDAD9C5BE65868ACB31C0B6DFBC7FF728F4B1F34E8B85EA0DD8C132B666F2F37F4D99937D6CE40AC0AED17E189B5634436C966DFE6D0725F0C9EA6B4D7F1780000E075D261DE664B15D79EE5D866BA5CC839B632DBC3DBCAF6ED9CB4E49D889CB287AD745AEA752C34FDCEC47974D8CA644EFD840D9BDAB5247D77272C65B6778BB1704F3DB7BBBBB0E096F91D0FC4AF0500BCF26BBF4A5F796DE151D7320A85C293FBCA59E59E18F2BC4EA13F87E53D91E6403DBF83372CEE3C0000000000000000005E3CBC9E5AB616712D0000E005A1FD0B702D0000003A0C0000589700000000000000000000000000F026D0E477CF8261F77D337E9758C727E7778087C5776038667AEDA8E6E68EE3383A9C8BC2CC17DD6338FF5B34D47BBCCEF796E6F79F4F5A3DFBBCB1793E9D0A0FBC7FDC1F63A87F4E7C1E9C8FAE3FCE0FF775D63B7EDEBECA6AEE7ABF2E3F49BC770000382FFEA96E6E39BB2DF1CA02B793D4B60DF24776DD9C3DFD700E21DE726C1D9D93EE0BD55EE7AA3BE236376F4BAC88FE639D7C6F8D9E38121297A25D74730DF13EADA383C7EFB9E56B0B09270768BE46A3BE716A96136418F6405F67E5B5F0F6A5E356F49787E53F020080A7690FFFE6EDF7DDD8919C4F88F3C835956EFDC6374D1F8F5C10BBF82C1DF673EEB86E4EBADF4FCCD3F8E48CE4AA5B34F3E4BBF8DB017B58E77B1BAAC39E18699C3F8E7319F78FCBB12D0ED249D7DEE61C736C032738BF516453FAE88FB7C67D0D8BEDE3ED8BE730EA1BA17038EC96F5EF02E83000E059A373DCF7E7B27C10F9AE8DC91A372C860EE775CEEFEC0E3DD6C9F7763CB8AEE089CD7316BC9ED0A80CF7758E295D1E16E7E7BC7D9DB52ED12C233E1B0000000000000000F02CB0ADB2FB0C8B7369204F3B00003C5F5AED0EE5E66EB89FBD654DBDD6A6B5111F9DD4F2949B0950FC8351B282415ABBE4A3D577DFA5BA6D4BD99CBE4D9BAADE9EBFDEEBABB65323CB3F419BFE0095F69B644D0628A9CAACF9D98445AB9746E8B86C517CF4036AE59D356A737649FAAADF5B70DB3CCA7955CA4DFA49CD99D78BD3EB49DAE6F13AA7BE1B8D6647CE89CF2337E3A774D4A4F8E5CBD4B0123D73DA8AA464BEF6D2DC996395D4BDCC54FDEBB97B31BF58A06460B2E7FED63FB6773C6F7963DE94365B9F8FB9F3B81F50E7D12C9F8ECDD7D6531F9F8AD2FD719F1CEF9D87B75F7DAE876682B6C646E5FB8D8F8E52DC1F54DFD3286D4CAA31FF724DAE7F65F19B33BF33FCFF00F0F42829CD6A249607CA5EB6160D5A1D9F142DE3B2E91BA7FAFE3A6D25CAB439FA0E6D5DFD900E6B4EDB4C38237E63FAD8A2D2103E4E72D7FD10A74E2D450776874EBA3E71B9E85DD96E7C392FBAC37A96EBFA63147FEC6DD37F7FE0F6FA18AF06DFF99FFF43E9BE5FEE1DBB0B112AD96D6A18919EE393B763726CE68B40CF58FDE3B1EE1416A67AEF2D66DE1D5B6B6C726E912A895E5FE54ABE461B4ADF4E6CE38163FF7475D6ED478F5D57F7487D9DF53C3603CE39B97E77C99ABA772C4ADB6A24D63D6642EE8D277D3E22DE73D2E77AB0FE23C53EF952DD7F97A87E54541A1EA0CC0D35AF49E7BE9389EE3FF03B03003C3DB6974CF7FFD65B767D1C8CA268E961645ECAF5B24D0DDB16ED48DF59A6C2DDA8688068B6FADFE5FF5B77ED43E925DBC8ACC387BFA4A8958A48DB7A2C46873F2769EF6E4C6CC4BD154727B76F7DEB96799F6E53CD588F640FAF7DF2B19A47917286EDE854F84EAF96C68A72BFC87C6BB863C9B97AE624F6E3DC2DAAF2FA8DC79E667D75EF01EA5ADD0FCC913DC4CFAE600CF7EDF08ECDD7A76A18B4E5BFAEC65EEF19BBE73AAB79F0356C5899015B37DDBD1FF0FDA1BAC39F433D3678FF39E97335D43D8ABF87BFFF71968E33EA5A1B3F2BDD57F3FAB9287F03FC5D9EF59DE1FF0680A74FC3E3B7E52D33FC5B963587FF37759969D865D71ED5F6E9303DD2BAC5FA580805E5B73CB7E3ADEECB0A869D36CAA6B4C209AAAB3EB9AE10756CC74228F848E7C3F3D1F793B4C76EED3FA752D899971EC33B273E2F9E7B36147AACB5737D4D1A7D3E74DEB1594779BFD7C6967DC6E975E635077D0D1B3B8F9E7BDA7B4E8558C23D572B1475FA56E79F56E7A8DBC877A0F6F17774D67786FF1900000000000000000000000000000000000000000000000000000000E0D1E038F06614EF460100C08B241A31701D0000E005B264EC3F347705000000D8C30000F0BAAE0F7F1DB88E6B01000000000000000080D78EFC7EF15CED4AF516D985F44B31E7E27E1EDFDD732095B4701D00780C6AED0EF983211A7DE75DCA9B51F28733747BDCC903D7DFD6B0DBD4CCC4A860D729BEBA41696B93D2459B2CCBA2A4B949AD5F5BB46926E573A698266BD3A4FBA649C7C70D3237B7A5DEFC6F9336D6D6944ED7E9B851A1AD4C8936EE5B542F6C3FD5F39A9E5FA7C064909AFB0619FB4DD9F6B7B93415A5C4CCA894AFCF9B140CFA15416AABCF6357BEA4F1093FDD5C58A6E0E4385D78FBF7D42C27E49866599D47B94913177F4B8B3B450A077BE3E4AF8EAC911554D7E4AF49327DEA5CF3754A4FC4A9523EA60D5F9C3ACD0625A3B694E37E8B4A0B498AFB36281BDCA4F87481ACC90D3203F7E9A45677FBACD74E287E59B51FDDA4865D9572BDA8FABDBE49E6BC4D957B494A2E14C8F46F9339A9AE6722D353DFCA57DCBE781E6B6AEC4A222B9FAD50418DBF466B23AB745CAED0EA449A0A8B5B32069F476ED6A49CD938EDF78B8C945B3B25B72F3E27FEDBD9590CE0FF0A80C7C0668DED6A49D0B0E9683732B45D8473021DED4AF9205755DB066D6FE5D4F698B60A753AAC1E2A3DDD925C3FE6D6B6E86CD66E516E2F47BF56736E3FC97F26A97EE294F7F64EEBA3665E7430A488260C29F3BDC13B074BE91FD7F7D3ECCBA36944A2725EA99021DBDD213E24FEC82E2566C72893B1E8C2C8A4E8F0BFFEC647477CAE376F4B9B9BAA0D9FF3949FAF892DC7EC17F364ABF126463FA3DDA3A61AA3F77AE5A27BB2CDFC579AE263266D2A2DAB461CCDAB460E64DBE89639AF11EBED41C4B99E69A3213ABCE93745DBBCFD6E7C99A18E7DE09659AB59370BBBBFCA31B939A5DDC58233F677999EFAFE73DFEBCE437310D9A3BD688E7EBA96A3DCB2DA77549531D2C19F9CFEC24EEE2643F5ABCF818F19D61700E0D1098613AEBF31DB3437D81E1E923348DBC35E1D6E1C77C4CEAD941C9DC9962ACE67FB90AC6C49D626AAAA4D35B74D2DA5BD5B5BEA7F3B9D96367CECDADAAA944F5AF573CDF5BC3A7C776181324AE38AB1F0507B98FD4A82C1302594DE5B8930959B1DE987CB8BEA7EE053B66E38A4EE0921B5AF565336AF1AA3D39463182B9351BF01A252F6E65BD63ACCF7A2CC7452B44A6B2EDBAF7ADBF068B2A369CEF5CC291D660DCC840EE4FED6A3959B4AB7938752CFE56AB323FA7EA0F4968FD9BE99A5EAE2B6E4ECCE7C69F6D47BFBE1F1593BD9C6D65ACFF3FCF1568EEAC9035A792F29C7F118325765CF276773D2EF4FAA5FAF0E7BFBE26B680EC9A105007838FCFFA37598D72982CA364E848367AE0F571AC794B5AC019D7810BC969156C7D4ABA5E7724E56DED14E5E5F79D4F5615E97C8EFEC3EFED8414BA864AA9455DB9255A55298F3DBDB4E7D22EB9659072BF99694B9ADB74D8F762A9DD36D1ACD6329A7F9F8768BB2898A7CAE9B052A98F5A1F5DEBEF4187A7C5E97E07221E4DCCB4A56830AD182DBA661954483B9DFCA4E55B625F350DABBF3B52AF85F0200000000000000F05884A2A6FC868F464252E675525EA7D0CFCDF85999775D96D74343915D6AEE47650D83D76683A128A5CC847CD6C7E8F6B55AD9AD97B6E18453EEAED18A8F422D4FF95A5BCA3C9772B3E9AED7EAB179AD84DBF07E1E2F9972E61A0E85A898B77AFA92381BEB4959E7E6B6FA9C78DD25B9BE24FB3F9D0ABB6D0100E045112BB6A996749E537D1608D2B8CFD7E3A7C07E07BC5D58DF91FAD9AB63F2797D698996969768391A511A58EEF1A5E0638AED4E8FEF9BDE9FAA75A896EAFA17D452144E58D2EFBEB144FF1608B9FE12DFCDCCB9C7AEAC38ED23A99A1C13598E4A0C8DB95B8E4FC3375351F165F0F625ED57567AFC275CBF8CBB31F7995FBF3F060000BC88677481C024F9037E5AB811A4807F4AFC6E6B3B468F7E65EC8EF875ADCF4FD14CA22C7EA2133309BAA574F88FD7EED2B57F0F89CEB2AD6B84BAB6EE64802E5C9AA08E6D906F629E02E32314BD179631FC6C572B5B3530BBA43EB376DEA4857B791963E18B002D99659947E8F30FDCFA297F80F2B64D6F5D788BBEBC3246734B8E3DFCD18511D1616F5FE7D1613CDF0700BC4CB06DC8FAF9B0BA7EDEFBDD98AC53FC6EFC3695CD79F9DD5FB692CF75EE01A5F1ACC3FDF57A5DC23FB3EC9E87775D020000000000000000000000005E3B1F08C3A6B2B5886B0100002F00F653B81D98A361F1D20000003C1F0C8E1136C47F00000000D625000000000000000000009EF45920C7D47911B1192AF596C48DC7F700007859E19809B5BC49662A29EF2567AC84686671DF72639E1989A85BE6F77E758C35AD6FFA7D601DDB8CE3B0797316718C072E7F363ADA53CFC770FC751D936D58BCB55834EAEEAFE5AD9EF86EDE986EF9E2BE3BB6F77D64CE6361C6B725CF07C796E7394B7CF9464362D357EA752A652DF71C1EE71AEAFC241CA72D118BBA31E0D80785E71B0D0565AE5C67E58B1207EE49C60300BC5EDC8815E96F77BEA23FFFEE033AEAD47A72AB79F3D0E932C75B1B7DE75F7A7458C7C7E17866ACEB3A3683F6C3B875EB5BF9FCD5B5DB03FE19E13B11D14CA39B5F4EC76773DA39F6F3C497F3125B8863AF79E3BB7963BAF58FAD63ADB10E1792DB92F7EEA45E70F333719BDC5E370751EE40E2BD1563B1A11ADB9F53A93FF7883E9F68C4E8F9CC79966C2346BEF1498951A773E071EEBBB3C60300BC79B00DC7317ED96E635B38BC382B317CBD769E5787453BBBF122759EB5A595BBB2657B98358AF546DB7F6C13BA7182C3E19E7AD6CD914B3E3706B0B673FB75D8D8DC144DD3636B5B5AE788E363BC63CB31DDDC78BC2E51283879EFBCF999EAAD1337EF1DE7BA3B2B47F393EAF0CEE29CCC99AF955787CF1A0F00F06663E66B3DBF95BD79E8BC9ADC4F5E69AB3E8E7556B74B99F9A1EF879C553FECB7BED65AD1DE87CCDF3BB6CC6BBF38D0E6D0AED3B03C798F9A93AE7FAE7A3DA77F5D82D761786D85F384725DC2CA888E3FC9780000000000000000C09B44A9DEA28DD5B8ACA33EAF315349F89A0100DE0CD8972BBEBA41696B935ABF3ABEB649D3296F9A49F99C29A669F5FB84948F8F1B646E6E4BD9FC6F9336D6D6944ED729BD11A7D6498736EE5B542F6C9F7BFCC0F4A2E43C6A660CC98BB4341B907A7F3823B994F01D0100DE04B42FD761AB23CFB0B60A753AAC1E2A3DDDA2637E7EB7B5AD74D6ECFA7AE5E8D76ACE3D36F9CF24D54FD8F7AB40D55FCF7E8EE5E66EEED7E1A979C92BE7F80ED8F45DC820C47E0300BC49B02F97A9EC61ED53FB304497953D6C2ABB77EBA7959E7D6C0F3FEAF83A5767B39CA0C940809667FCF85E0000000000000000000000000000000000000000000000000000000000000000003C753877DCD781EBB8160000F002D17924000000BC18968CFD33736D000000803D0C0000AFFBFAB01945DE60000000000000C0AB4DC1AC9315B48442C87AEC7E5AED8EEA23FDC4FD00005E0E86E5AE1F06E7C0B30BE99762CEC869FF7C400E42001E8F9AB295FCC1108DBEF32EE5CDA8E491BB3DEEA361B98C0CBB4DCD4CAC27075EBA689F9903CFDA34E9BE699E9903EFB851A1AD4CE99173E09D87E9F975373F93B1DFECE669EA6D73692A4A899951295F9F372918F44BAEA7B6FA3C76E54B1A9FF0D3CD85650A4E8ED385B77F2F3946F89866599D47B94913177F4B8B3B450AABEBE7ED7775644D6CCFE45F9364FAD4B9E6EB949E8853A57C4C1BBE38759A0D4A466D29C7FD1695169214F76D5036B849F1E90259931B6406EED349ED348F6BBD7642F1CBAAFDE82635ECAA94EB45D5EFF54D32E76DAADC4B5272A140A67F9BCC49753D13999EFA56BEE2F6C5F3585363571259F96C850A6AFC355A1B59A5E372855627D25458DC9231F83C72B326E5CCC669BF5F64A4DCDA29B97DF139210721008F8FCD1ADBD592A061D3D16E6468BB88DAD739DA95B2CE81B7BDC5B9ED86E7C0639DCDDAAD3373E071796FEFB43E6AE64507438A68C29032DF1BBC73B094FEE9DC785E581B7BEE1991A89C572A64C87677880F893FB24B89D931CA642CBA3032293AFCAFBFF1D1119FEBCDDBD2E6A66AC3E73CE5E76B62CB31FBC53CD96ABC89D1CF68F7A8A9C6E8BD5EB9E89E6C33FF95A6F898499B4ACBAA1147F3AA9103D936BAE546B3237A7B1071AE67DA68880E6FFA4DD1366FBF1B5F66A8631FB865D66AD6CDC2EEAF724C6E4E6977B1E08CFD5DA6A7BEFFDCF7BAF3D01C44F6682F9AA39FAEE528B7ACF61D55658C74F027A73FA5B1725D55BFFA1CF898617D01001E1DCEFBA9FD8DD9A6B9C1F670BB76A63DECD5E1C67147ECDC4AC9D1996CA9E27CB60FC9CA96646DA27ACC7947B725DFDDD696FADF4EA7A50D1FBBB6B62AE59356FD5C733DAF0EDF5D58A08CD2B8622C3CD41E66BF9260304C09A5F756224CE56647FAE1F2A2BA1FF894AD1B0EA97B4248EDABD594CDABC6E834E518C6CA64D46F80A8943BCDF2800EF3BD28339D14ADD29ACBF6ABDE363C9AEC689A733D734A87590333A103B9BFF568E5A6D2EDE4A1D473B9DAEC88BE1F28BDE563B66F66A9BAB82DEBC1992FCD9E7A6F3F3C3E6B27DBD85AEB799E3FDECA513D79402BEF25E5381E43E6AAECF9E46C4EFAFD49F5EBD5616F5F7C0DCD6808FF53003C06FCFFA37598D72982CA364E848367AE0F732ED2AC650DE8C4039F39D9EA37B43AA65E2D3D9773B2F28E76F2FACAA3AE0FF3BA447E67F7F1C7EE3E5BAB64AA9455DB9255A552D8A274D476EA1359B7CC3A58C9B7A4CC6DBD6D7AB453E99C6ED3681E4B39CDC7B75B944D54E473DD2CC8B3BD61F5DEBEF4187A7C5E97F03EC32B590D2A440B6E9B8655120DE67E2B3B55D996CC4369EFCED7AAE07F09000000006F0C6C6B0E5B0B000000F07884A2A6FC868F464252668DE5750AFDDC8C9F9579D765793D3414D9A5E67E54D630588F83A128A5CC847CD6C7E8F6B55AD9AD97B6E18453EEAED18A8F422D4FF95A5BCA3C9772B3E9AED7EAB179AD84DBF07E1E2F9972E61A0E85A898B77AFA92381BEB4959E7E6B6FA9C78DD25B9BE24FB3F9D0ABB6D0100E045112BB6A996749E537D1608D2B8CFD7E3A7C07E07BC5D58DF91FAD9AB63F2797D698996969768391A511A58EEF1A5E0638AED4E8FEF9BDE9FAA75A896EAFA17D452144E58D2EFBEB144FF1608B9FE12DFCDCCB9C7AEAC38ED23A99A1C13598E4A0C8DB95B8E4FC3375351F165F0F625ED57567AFC275CBF8CBB31F7995FBF3F060000BC88677481C024F9037E5AB811A4807F4AFC6E6B3B468F7E65EC8EF875ADCF4FD14CA22C7EA2133309BAA574F88FD7EED2B57F0F89CEB2AD6B84BAB6EE64802E5C9AA08E6D906F629E02E32314BD179631FC6C572B5B3530BBA43EB376DEA4857B791963E18B002D99659947E8F30FDCFA297F80F2B64D6F5D788BBEBC3246734B8E3DFCD18511D1616F5FE7D1613CDF0700BC546BBECA3664FD7C585D3FEFFD6E4CD6297E377E9BCAE6BCFCEE2F5BC9E73AF780D278D6E1FE7ABD2EE19F5976CFC3BB2E0100000000000000008067F0ECCDB0A96C2DE25A0000C00BC2E0980843D64B0100003C7BD84FE176608E86C54B030000007B180000DE04F89D33E46B060000000000000000C02BB9AE516E0E8D03EF7D16C83175E602E3CF775EFB45C97BB7B11A7F68DBE791930E79EF0000C3B8112BD2DFEE7C457FFEDD0774D4A9F5E4F4F1E63FD2658EF333FACEBF38B1CD24B6FB695C068EA3C33118F43BC1FAF9DFAD5BDFCAE7AFAEDD1E782E18BE139177878D6E5E231D17C869E7C47898F8725E625A70CC1F6F5C216F2CA1FEB1758C1FCE6351486E4BBEA5937AC1CD0BC26D727BDDDC17B9038933548CC506AE8F8EF5E6A53FE6BDCEA364D81DBAF2DBDFC83DE9DAE20EFD5234E8D60797E9D627971C1D3E630C00C09BCDDB1703F48FF00C5D0C7C4D99C40CCD4C8FD36C6042ED6B939F63F0043FEFD16189F3E3F7D3F8A4D2C244AC5787974C89FFC35AC8B12602BE71D15BAD976F5F78B7A79EFB1AB9E473634FEAB840FD3A6C6C6E52B2D616BDF6C615F2C612F28EEDD561B687D722CB927FB452AD92B9BA213A5C6F9DD0F791EF25E768A3947B2A3ACCE56FC3779C39DB6D89FB76E76F77E8876FFF267E81D06100C0C348E46B6E2C4AC69BFFC8ABC9FDE8F8385CF6C6FA4999F9A17EC9DEFAB37EABEB386C3C87D1CB9769C21F7CE8FCBD639F159FE7D0E6BC76C70F3C8747652A6A2A3B7D54E21771DC378E1B77CD1FA0A9C57F487EE751DFB4BACF249F680C00000000000000000038701E8B50372EFBCB32272B5DA093561DDF0F00E0957C974E72B68523943012B46F25243F5B71DF7273C4D976DE2DB3F6724EBAC0EC6D9A9EF85072BF99F9A29B0B8EDB70CE0A9D232E1C0EF78CA773D8B18E5BFBC59EE3B9DFA8ACEFB6DDF6AD13A5B156DAF1CD386991952D49F9B851A14AE358CAA5AC45DBB90329B316EB63B89E9FC765553DEB341FC3DB4A29FBC8D787D77E79EEFAFE93697668519E67E26F0800F064DC641FB2A35DFAE4F20D3A625FB25A4AFCD66A6DDBCD47B4B338D7E3B7B61F9DA270A649CBC10F2874FD06ED1EF1BE3FD18591495787AF7C16103DFDD81F1E18331434C45FE288CB9EE323376F8B7E0FCBC57990DBA3C396D2E5C39CEB73B6B7D72D1FB628693AFE0AE9ED6DDA565ACB9ACD3ACDBA2C6D954E577FED50BD90A3123FAB53FB7B9E0B9EE10B918AEDCA3345DB8891B1FE638FCF43289CC0733700C0131352B66FB95613BBD42ADB94305392F358AF3F48FEE4BC29FE0BDA7742ECD668586CE4A4E4590E8BBDC8BE0DDA76D476E49FFCDF0CF834F058AC6D5CD6C7738E66DFC5DF0ED8C35E1DE66DB654716CE3E306358E3B5266FBB6902BB8F6B0D6E182D2DB6AB54AE9749AEC429A92850A6DC657A53CE09F71860E736CE64EBBA8743844771716C40E2EC64EAF0FF23703009E175E1FB6F3D214DB77D01E3612D6507FB6FCCEEEF0B5DF6C891A95D2B9C7D5EB1285C293AF19B3FF5B50DE6551F78D7CCDBD87E06F020000000000000000000000F0AA9333CBD4DA717C0D8E796DB55BF652C9D7281D0C52DDB6A99208CB674B7DAE662CD91E972D4A87A2940E3BCFEB2A990CB5DA1DB52FE4B42F37E9D04C50DD34A86495E518397E77C72DA74321D956BACF080B66DEDDA739E97B26A6C7B0A321774E3C97FEF967131695C26AFEB5B6B4C92A0A66920AA1D33A0DF7A5C7E673D1637099FB396B0C00007812920BF74467FACB5E36679645835AA9086D5D777C0A4A468292F331DABA9BA0E34C8C72A91A95EC36E5FEFC01A5232947BB94EEFEF3EA2D5AFBE422FD74C1893B965B59117DABC696E860D3A086D2D0BDE59BE233C7ED0FA377A8F4ED8AE8F79A6F948ADF5D97360D23D233A702FBDCB58B5452FB5A4963607F0FAA6FF1BB28B6A5CCF79CC3C80FEA1C4C3A88A5DC796CAB79146E2EC8FE2DFF3794337E11BFBEC2FC823B77FCCD00009E05DB4BA66B6F7ACB5ED2779645F7D24B86EC679DCCCD2D51A3A6EAA6025457DA9AB9758B0E8D22D9B51AD9F3D745CF7E543A5C4FC5687BD1D1C2E2FA69CC316E5B2FDBD450B6763D1693F6B9AF6F297D5F77C738585872DB0CB375D9566F1DD5A8BAC3E5D0804FEFE1CF49E99BED779E63BDEBFF6B2C44A4FCF73FCEF6CC23A9C6E7B1B7A2FB74F84B4AEE3D7B7763D20F6F1B4DFCBD00009E0D8D7C7168593E373BCE6F75ED4BC6EB10A1A0BB96A07FCBF36F76DED7CA5BA7EB17BB3BA295D96854E99CB32E51379D9896E9A879E6FA03F7930D07655DC0BB66F1A8E8B5105E87B0C209C7AECF3BF3947514A5F57A5D44AF47F03E59EF50FBE4B8A03AC768ECB40DFE5E0000000000000000000000000000000000000000000000000000000000F088700E24CE9FF12CC7E05C44C362AFF753CB236E0300E0CDE356C4907C18ACC54ECC7327775CDEB69D1C1DF9A29BA782E3A0732C78CECDC175CDB225B939B85D3412727370E878F1DC5F727DA99B3B2E2B5ACC3932386F465A516F3424775CA55EA74AA542A3EF7E44C362ACF3BD22D8CD17C263D5DA4D3546921256D99D078FA573C7E9DC783AAFC8D27A52B6C82907007839ED6143DEE30D276BD42EC6C8E0D8391D278E4364392A79E9A6FE6490BD1B51F66A9952C55DAAA59C783A173F5BA05A322CB93A8C5090FE2DE0E412CD77DF598EA46A125327993E903C4659DBC9097790ABAA6D43CA9C3BAEA1B655A5D50F9AA71189BA39F2EE2E19EAF32DC96BE71F1D935C4A4B919468712AB224EDA391D3B8719C534E9791530E00F0B23132364DFE809F260301D1E3806F5C74986DDBB72EBC45E39341BA752B42B7FED34F4B37AF53EDFFEEBAF94363F30B14084CCAF1ACC30BF7F21450ED6BDDD8995A87D7E249DA3437E9BE694AEE4E737543749873297F1FF99E36EE5BD428E5CEA5C31F8DFE279513CBF29975D8362292BB34FCC70FDC760FD261E4940300BCECA4CCFCC0DAC0B4D257E3E60425953697CDF9C1F5DF7253747860BDB7BB2ED15F7FC8F9923BC78FB4863DEA1BA144BE485397DE96F588E9B1119A37CBCA1EF6C97D60E477FF4B729C72FDD8D5591AF18D926F7C923AB6E1AE4B000000000000000000E0F5F0759BFAF0B72FFD3CF3FBC507EE2FEE9FAE13A792F0990300BC18E6964CF17178EF2D1FEDEE38FE68DA372C180CC9BAAC9188D2F8C4148DFA83F22C8FFD23029F7C44D3DF1B746FDA27FE6C139746286A26A53DFB4B2C27D8A7CC2FFD45A331F2A9FDECFB36BF9E94BAA9809F9AED9AF8CCF1E77FAC2FB963373B4D0AF8679C63EF85C91F9872FC306C5BC6E175E2F989D19EB987424EFB7DC3598F36EC3635334EDE8D26AF718F8D504AD5052703B4341B70DAEC37A9B9EF3CCFF38733B4B318C0DF0400E0F9EBF0ADDBB20D4CCC53AA668B76FEE1A2CFF5EDD2FE0753F3F71C1D56E5F5254374FADFBF5AA2F5F8B764DCBC2E3E6EDEF6B76EC7A48F283FF753DA3D712528CFFF6E7D1D91EDCDE8BEF8524C4CCF4BBFF11F23EED8C5A31A256FCFC973BEE9F918ED476F8A9672FBA9BF06C5FF613712EB997B2CF38BF473B4EBF8D4450C5BF2CA71F99DF73FA5998911D727EF3BF6D5537360FF8BDD8881BF0300C08BFDEDDE7DF76279725634CAEBFFEBD555F6F7726C557E5F224CE55A4D746FE18F9768C9D8A7C8EC55F19BF0BEC3C1F674241C262B99A258D47917836D69EF3B16ACD3DC6F399FEC199BEBE57D928C2163CB3E35D750C8F15166DF33EFDC6B6DDBEDA7DF1E66DB9CCF23A6B4B95D4BD27777C203F630CFEB59BF570800000F22CCEF37F4F9ABF17B735A5787C15AC9EF22B336878361399EDF737B19E6DEBF3EACCF83D7B675D9BB3E0C000000000000000080970B7E6F6DC2CFEF29475FCCDA75B949A5FFF3FFD1C66A9C4E5AF507B6E5183EFC3CF0698CEB5DAFE07563C48103003C4FBFB551DF3885827EAA1DD52810B8416381498A7F1B767DD8D80762F65B43E24E188B73AE3F9B393F21EBC5DA6F6D2A92223B13A3C0271F4BBDF65B73DA3863F4F7A5FDD6F45AEFD2CA5D8901B4FA7D4262B4B55A0DB54D537C758DEA7681E2C90235ECB4C4AFF0AE01F7BF731D5073E2381A895854C60EABB1C5372E705BC60CFC795A1DBB286D38769BF7F91DAF7D5F7CFB7DFCAD00009E8BDF1AFB4B68DF2EF637E0183A09A563BB91708FEF447439E21EAFFDD9B4BF986EF3633C469FFCE70F14FDCB27F259FBAD396D4E63BAE9BE52B5CE80CF1CFBC2B10EA7374CF97C522FC8F620B727DBF441838E55DD6EA6F0C0731C1DBB4A57C7467BC6E6D8403C677E16C9F1DA786CDD06FE6C008017E9B7E6B54725B67098630F875DDF09FE9D3E72C9E7FA8E697FB6538D7574F86EF42E196A9F11D9242BFFB3EBB7C6F6A96EDFDF57BFCF1CDBC3957A8B0A8592D8C362DF664BD4A894A49C2BD864A5D30F8D31CF73D2F1D7B40EF33AC68EB2C1790E8E0F9D7DDAC6630F6B9F3DFCAD00009E97EFD7B0786BDA1FF8613E69DA7F987FCBF37B7276D9926D7F9CC9B3C618B63EDC1F2BB875D2513A6C9FFBBCB4EEF33C785DC2BBF6A17D9743EA1E91E1F8F6AA0DAF4BC09F0D00000000003C087E17829FB9E15A0000C0D35B1F0E8742E29FD51FE747AFD9EA9C74DA376CCAFFBF4FD77139CE7A3796845EEBD5EF35F3B1DE78F0C811070000C3FD25BE998A76E3FC04DD7C9BFA1917EB28FBB0E9383F46B246EBFF58779F654556569CB5D86E1E5169C37176DA458ADE75623CE8AD3CFF438E38000018F01FFEE8C288C4CA61FFAD852F023DBE06BC9D594C50C0EFC4F9F9706442E2FC043E1CE9D1616679D1EAF17F73629BF5EA3072C40100C020DA7FB8671D58D9ADC3F2CEF5A3D72538AED9F884DF8D85C6B9479767FC67E6A903000000000000000000380B8EF3E37D66F722E0F7E9F85DBA87C5F9E1F7E2F09D01005EE5E774AF6B9C1F5EA71EF18DCA1C6F7D3929F9E9AEF903921B6FEAE34F682A96A15A2A424BCBA7EBD7C855070078117E6BAF739C1F8E1BC1F6F28DAB1F3AE3AB73FB311EA185CFFE4C5FADCC513166B8B1250000E045BDC7F13AC7F9D11A7B7DF6AE68FCB5C51DBAFBE33AEDFF1C9373E2397BED61E4AA0300BC085ED7383FFA3EC3EF017ADFF1E3B56F5E27E12D6B6EB30C7F660000000000000000E079C3B9809EE55A28E7AE677F8687ADE1CA3AEED4B3F551E07509EFFA432A69E16F0000F0C2B9123228E80FC83BC8B55AD9F529CBDB364DB0AF59BE486FBF354AF7A67D12C7279598277F604AD65CEF2CCC532030297127A6C7DEA285F51DA97763FDD86D6A6662B4913E206BD3A4FBA64905BB4EF1D50D4A5B9B546F3468636D8D4AF53A15D259778DDA3B3F5E6B0EF8E72830E9F83107BE5890726DC790F568F649E37C1AF366D98DC569ECD4C43F4DC7C9F0AB7E9D9C1B1DF8A701005E4A7BD81FF08B0EF3B3AC80D261F69BE0E75B6F5D784B7C7B6FDD8AD0ADFFF4D3D2CDEB54FBBFBB4A17A7C8AFF43636BF203ACCC7731C8A857B795723C5EF2C55A34E2D25F6F0A6B9293A5C691C93A974B8D36950BD7542DF47BEA78DFB16354AB9A1F38BEC1E51BBE8C408B25211376F9CEB43D7FDBC7BD471FD34FA7320D95E9BDB136F087E110080979161BE0CD34A5F8D9B139454DA5C36E787FA490C8B0774567C9F439BDF8D3B3ED77CBCF6706247DD0394FD9B3053CAFE1EA1B1ABB3620FFBC627697EFE1BB1C513CB33726F499A9C9B799AAE2D7C4F7EBFD3A65634106F08000000000000000000000000BAE4CC32B5BACFD58EF97DB59DC1380BF55A9BAC60904E6A79CA85C35266EC6888EE8CCED03522AA2C06A8D5EE483D3FEF4B474DB75DC988A96D48DA379A4E9B525F9E511E5BB7A9E46B94566DEAB62D6D0BA1A0CC81F759A1A87CE6634A56D91DC33B277CAF0080578DE4C23D37FFA7B7ECA5F8634CB490F71D6C1AD4505AB9BD7C930A77964543D353DF50CEB0A55C985FA0C35A874E8A06ED258B54B87E4D7CCEAC58D1D1FEAE1FC5C05CBA6D4E8A31DA9C59165D353F1FA3C3C80F4ACB4DAAC67EA0033EB65D3CBD8FACAC88FEFFF39B2599D39E9A13BE5300C0ABC8F69229F66E7FD9F571308AE2477118999772BD6C5343D9AB9BD35F49DBADE83E1DFEE268EB5ED737ECD0F899EAFB4569979EBB251A5D6D36A9FA4B92EAB1185533BDEF51E8360D2BE37C561A5FB81B25632122EDB7FEFC9EE87B2B15A192DDA68611A1E2FAA91F9A9E13BE4F00C0AB4A235F1C5A164DECAE33B0E67AD71CD83EE6B502594F2837A99EB7547D98AABB3B6E9B4A222C6B0D5C3E669B371876D71BBC63E8368D1DC35DBF68717FAA7F19279CA052C270FB6DD8CEBA44DD8CBA6B2732277C970000000000000000000000000000000000000000000000000000000000000000009E12C372DA3F4D9E66EEB827E9AB3FA7DD9312ECBE1BE8AD0B272C3797D4A3C239456A790B7F9300BCC270BE8BDFBCFDBEE8006B4E70729C021F4F88C65E9A8A52626674E8714B2B77A5BD3F18A2D177DEA5BC19A58B13F3B4B853A499D1B7A8ADDA8C5DF992C627FC3DC779F3D3754E5ABD1A3519A0A5599D536E30775CEBA443969556C7AF51DD2E38F7835A9BC2F22EF3690E9125B32C7DCDF80352CF7DF5DF3386F5A5732DF597BD39ED34DF6F6C0DCDB9D7FAB5451B7193CC8D0D3A56E76759594AAB363AFF08F7FBB0B11F7A5FB1DBEEB5E2EFEFA2FAFE9EE53D1100F0ECF14FFDC9D102F5FF2DB9386F27A96D1BE48FEC5262764C6CAEFE6322CB8E6E70EE3723E8C49AFC42B5DF3D6A522A749D8EB8CDCDDB43C73BC85589F3D3713E25CE65C45816DB74367D1732A83F2FD3E0F17BB20D454D5AB8363968AB2B6DE63E6F0702E7EE8BDB8FFA46281C0EBB659D5B54E7BBF3924C1FD071A34259BBD5734ED55F3BD43838CDB5B7914CD396191FAAEF7AECB37438184E38B99EFA6284EABC7BCEB5C2DF2F00AF8B3DCCF6ACD623D69FA694C394E0B83A9635D41ED65AA17F53874437C2F2BB7BD1CC93EFE26F29DA1FCBA7714C59E9EF784087DBB5247D7727ECFEDE1E96C3D3CA96A85129B99F598BE702933D7ACBB9453BB6D1F3DBBD5DCB3FB4AF47B187F7720772BC5D48F79C53B250A1CDF8AAD46BFBFF209DEEB1871F36F6C3743866D83DD78AD735869D1F0000000000000000000000003C8847C94FC764C311375F9CAED3F1DC75ECF6E3B275661EBA6CC272FAE9FA3814CCBC734CB3EC1EEBE4AA0BCBB1DE71746C79C9931735F1FD01005E1BCE939F4EE7A4AB1A11375FDC412C4507A9E240BE38B73C240F9DCE6BC4DB7A2C44B9E5E8694E3BD56FBDB82FED8A9194D2E05A4F3E3CC983D4CD9357B8398DEF0E00F0DAC03A98999A19287B498753B431EAF802677E5CA7ED6B2BF4D3675F5161F31F747FDC476660925ACA4EDD5B899CEAB0B14F26FBF07A749DFB8FFB3E25733228B6772EEAF85DF071AB9F4ED3D6E763CE784AC3373E1E15CDF68ECD65B68933537E7C770080D70AB631EBC6D240D9F5839DBEA7F4CF4FD9AF3FA785DF07E83813A38D3B095ABBE4A3CD511F6D285DE59C9D6BBE518AFB55F94E9036462E51BDDDA4F83BEFBB5ACC7DAF5E1A7172DCDF9DA5B52B5392D36ECD17A0B59131A9DFF08D53727149F49D3F2FFCCFB7DDB1F53CD28100BE370000000000000000000000000000000000000000000000000000000000BC3144CDBC1B3FB83FCE30000080F3A173578442612AEE5B4E5991B76DC93764E58B1287DCCAD7641F1FC3B1D7A53C240EC5B07A8E85CE71DED38A7AEB44CAD9749A0A8592C44F2F55AA54A954CEADFD3C3FCE1B92697668313081EF1100F04A13E31C3BED227D75CDC961A473EE7099731F71DEA3DD8841E13B11C947C7FA978A6D5251956D23D6D3D7EE919357336F0EC66CD37983B6B79D3C15DBC9827C4E664A92E3EDA45577DB7AF3740CE4045AFF51C62EC69CB139070872B301005E650213F34A3B6DBA3AE6D89501DFB8E830DBC96F5D788BC62783F48FA5088D5CF2B9F67060669102AABEB9DFABB7D3F71C7BBA3F470FE70D3257371C1DCED9620FFF1859A3C671837E5A5BA5CDF421554AD9F3E970C4B937A442CBF21939810000AF1B2993356D30B76671FF54EB02B34B14F02B1D2EF7E67A177BF98C7E0F6DB6778FDDCFE6465A74F951E77763617DE8D800000000000000000080DF1A00008097CF6FAD71DC916773E2BB56B0A9512991952ED071A342957A4BEA3BC7E75B2B6EF23A74DEE91F7E6B0000F8AD9DCF6F2D932EB8CFE872074A6F7FADD25EEEC0392693A3D64987EA95F3F9AD31775796DC32FCD60000F05B7BB8DF5ACE6E9075DFA4C8DA06C59305DADC58A5E44F71B193D7D656C51E3EAFFF30B364ECBB3637FCD60000F05B3B9FDFDA59D4EBF573B765DB7CDC17907B836D84F07D010000000000000000F05B7B69FCD6625173E89A4A2A690D5F83794AF5ECC3614663F89B0000BCB47E6BE942892C2B4B7621DD137BAD73D272FDD68E8F1BB2E536FAB8D1B1ABD297D67BFD5CCE3843F339F6845EA70E064394379DCFFE7046F479587D3931E3DE53741C376FBD3EE6AC7ADD573462C0970E00F058683F35AD235EBFB5A9BF06C53F6D3712A3E872E4F439DDD4FC507F09F65B1B3646327D20BEC259BB259F75EC352EEFEDE54EFD24EE6FD096191FD05557F7BBB6AEAE0F8613AE3D6E972DDA37967ACEE1BB90D1631F9F55AFFB74E2071943AFCF59F5DF75EBD987A36C21E60500E0D1092B2DABB59B140D39FE07E1AEDEB19D1C5275AC71FBC57C8FDF5A6CFD474AD53A033E0B67F9ADB1AFB0952D89ADCBB1D738E630FB13F7FBAD59569A0ED269D7D758EB6D24BA3CD4EEF5EA7053E9B0AE8F19B69A4392BEBB13EE5DB738A35E7C921716C4962DC6861F7356BDEE4BDFC7E04B070078567E6BFDEBC2618F7DFA300AB942CFE7FED86B67110C45655D82EDE190675DE22CBBD3BB3ECCC70E6B77563DAFBB9C754E328F33EAB92FAC0F0300000000000000008F876D95DDF80CC79D0E62350000C073A6D5EE506EEEC6692C084F59D36876686DC447563048C7E50499B34BB4C93E0AF71668CD17A0523706445669BA2E6FCC9B64F94769633248CBEFFAA8343B4669C31ED0F96CC2A2D54B23AA5F4BB59FA04D7FA0C7EFAD5E6BCBD827B53CE5660214FF6054E6B1F5F91855CA4DDA9C18A7CD809FD63E9D74EBF998F8F8246527C7655DB7506C5323B1DC33A7562A82EF1F00F0D2C07670666A66A0EC652B94523AE7A7D68E41B9E85DC70F622542E9548D363E1E75754D97B99F8DD1692ADC0EBA65D33FE8F77BDC6C4A3FF2B99971EE057DFE11E9704A34B6954F487963D42F31E20A99269DD8863B6F5D2FCF026B1D774E85C8AE6873697DC19D13BE7700C0CB06EB54BDEB7FEB2D6BE2D3F7C852F6A57D7796D6AE4C513D6F892D6CCE44E8FEB8632B6F4F5D75CBE6C4A7141FFD40CA1B57AEB8E57EBF83E47C4CF5334A71A5D1F7037362675717E77ADA6CF0D8EA1EC073D265B6773BB514DDBFB620FD2EBFF7564FFD6638411BAADF16CF736246C65DF97DC09D47567C2BF0BD0300000000000000004F9BB3E2DD000000785E3123A2B80E0000F082E0776CF7FB9EB1010000803D0C0000581F06000000000000000000000F22BF5F7CACE3D6E2498925FFA0369CCBA859467C7600C0B38563B48FBEF32EDD088568E2E26F6971A74833A36F515BED1BBBF2258D4FF87BDA6FE76CC987B1F2FD2A150A596A54B2A2699CC7682B53A28DFB16D50BDB64A50B145F5D238EDFAECB8D4A45F27698D1D3BC1CBA1C35EBE4BBB44689B0450BEB550A062D0A2B66EFDA52BE34B24A65BB4181C07D0AF8D5BE509A0CBB4DCD4C4CF4D21F0C0D9C47B39CA06F0D75FCE4382DCE057ADF7D4E1F38F9ED72DB92032FBEBA41696B93EA8D066DACADC93971BBA565F89200009E83BF84D2B023B59D18FD8C768F9A940A5D97CF919BB707DA6E6F3B7939CD0DDE3694FE966837E3E4CFF0E68E630E727B43CB6731712529BAFDBF3E4E2BEDDDA43F5C5CA564F144CAB357E31453E55A324B56F9988C5081221C8FED68578EB5879C47A753A39B9C17AEDBC60BE7C0E36D7A7BBB3BBFD31C78C97F26DD73F2E62F0200806781556E4AAE1EDE26CDA8D2BCB0C4915C5476B24FD995FDF9EDEBAD13B12373E696E89695DDA24A293B903BAE52ADBADAEB2D9F650F5BF916C5A205B17DD9EEE56DDE2C50B9D971EAAC92B40B456DB1998D48D5B587B99E73CFF59F07DBC9177D01B1876BF9DE383D9C7BC99DAB27071E9F5F3A9D76F340C31E0600000000000000005E933590505462F93285BEF58E27E98B6306E3FA02005E5524DF5CC7C94F513753B8260000F09CE17C739CEB8DCB99F51DB7ECC5E43C6D93E3920BEEA76088ECF9098A8FCD4ADEA1D5513F956E8F8B8EAF8ECE483BCEF9968E9A14BF7C991ACDA69BAB2E37D3EB0327F9DFBA39E2B8AC73D2714E395D2E2477DD3C74F5E2BE9B7B2EFED1E73D7D79F3D6E9B1D36692B6C6469DFC73A34E0E0F9D6F6EEB2FD724974765F11B2AED37D5BC0394E45C77ED9AF4C5E784BF0F00C0F3626B66D98D2FE12D6B3877DB49D110ADFDEFD9EFE8FE7840F497F309714ECD93A2E3B3A0CB8D7C4DFA28FEE8D4276FC7446F335FF4FAF0D6D53DC0F48D537D7F5DCADCEFCABFFE46959B6EB91849495F3C7661FEBF686BD1A0D5F1493A0CF907CE43E7C163F4D807EB3F52EC932F2937B744F5A3A2F49BB9A1E632E9E452CA44F729F7435CCEE5C0EEB8E7A2B70000F03CE0FCCA85851B0365AF5ED66331D1C2DCD7B7E8D0F8D9CDAB59FD2529FBAA194BDA358C53FDDABBDBD5E75851F27166BE3506F22FD7CB36356C272F33F7CBE31F46E6DDB25DAB29FBFBBA67ECA2E872E6666F8CB8C39F93321E1FC336B11EDB5888C8FCFEFEC7593ACEC4A4DFFABE9ACBCF45B1ABB7940E1FFE929273D1E7C97DF1167F1B0080E7AAC55D1BB6BF2C5AA97ED7EB6762D5DD1D4AAB6DC94C49CE7B2B18769FBBF1EF79DEC79ACA39EAF533345E27E032B7EFD1604FBFBCE6E01D4397C5FF58CD87CBAC9BBA2FDBE383CC94ACF2E933C058C21D9B9FE7B13F34CF271D0AB96D2A89B0ECE37E781FCF9FFBE0CFBA2FFC5D000000000000000000CF969C79EAB796F9626E681B5E6FD0BFE5B9AC7FD3CBEFFEEE7A031FAFD728F8B7BD5E3F607F09BD16D0B0123DFD7AD718B8CC5BBD56A1CBAD235E9308C9987A1FAF4FE4A2BDEF29EBB50B5EA796B9265354324C776CBD8EC1F3E6F9F279886F05AF4DECA4640CDDA660E6A9100D4B9D5E57A958F05106003C3B4ACB33EE7AAD2E7B3928B6C59F206B9569FBEB3BF4EB6ECC7DF6964BD5649F687AB75CBC6BC8FAF2C1E63F9CE7752B11D96E7F131AF0C3E0B5E8BDE59B52E67ECD6B8B74582CBBE534FB4B34CB327623B12C7E103CCFC2CDE95E9F8FEBCE7A6EC948B8BE123CBF834DC31D23ABE67C5C4EC87AF081D2EBADBB09797657E7F5F0B6D271B59FFD2472CB51CA24CA54BC3EA5C6AAA9FD165563F0AD06003C439B58690EFB02F79735D523F68D70B46D6B65853646A7C5179735EBB0D8145F03ADABBAECD5DFAD10DB9BFE01BF35B6A137D8FF4DE9A5539E2653F55B57E3EB728163AA35335DBFB4654A87538E0FDC54AFDF5A6E65E9D4CEEEB6E1F971598F51C834E9C436DCB1FF397F4FD9D9CE7DC79C9A779F23B2FF1B9F4BE66FDFD2DE7F7C46B98505758F29E26F0500F06CB57861DDF591F096E59D3B657F6EF846E5BD87CC977F51BAF601A513CA3E0EF868637C42F6FDF4FE3BB4A57EEB2747475D7F893555CFBFEBE3D3F7E4FD8EE4C4788FDF9AB3CEE0A7F8F824D57FF907C555BFF2BE87D23D5D3E56F3B81F9893B1AB8B73B4C17DA963D281C0C0BAC47D55B73AE1A7B5B7DF22DB9C77E6D76DCF63B0AD7EFFDA82F4BBFCDE5B54B9A7B4FE86B287CD28DD9F5B92310E6EFC99D6AE4C89FDBD72719492EFFF467CE1D2B104FE4E000000000000000080A70CE2FC0000C09B1BE7A7B0537363ED24EF5954981EA5F45DE4210200BC79BCA8383F4E0C1F27D64EBD96A1B50B1F5276E6737C270080372FB6C40B8AF3C37E183AD68E68FADDA8F85CE03B0100BC915AFC02E2FCE8F7DBBCEFD1B56A657C1F0000000000000000C09BF21EDD39E2FC7863F0E4C2CE3A845E7FB0C20977BD41C70392F58A6E1E4FF6C74807D5B1B63D745DA29270FC23F43A868ED1A3C7E0F56A5DAF731E49BC6233DA936F94DB0DEB1F00005E051E16E7C71B83A7706745F48F73BCD5A333F26C8D35949FB7157F8875633DAC38317C0C27BE84AE2FC47F18E83BF3F59CF8BFE50C270E7CF2CAA8D4EBD842D5A613DB42C710DA98989576E6E551CA2E866983DF57EEC69F00008057D6267E489C1F6F0C9E92718F36037E32950EB7760C5A1DF9D0B5553726E6A97554545A3A4169334F6B174729F3E51532A7A2743F30A6ECDB899E7E39864375C7923EF878B6AD4DD6D576D1F5C7905C1937AED25622AF743D4CC9857BAE0F1CC7E6D163CB333F753CC766C3770A007825B5F801717E9C7CC74EDC9DBAB1D4739C8EA9F6B449464D3A0CCDE0BB010000000000000000000000000000000000000000000000000000000000000000000000E035C05644F656A876D2A1A0155204296F47295430A95C4950301DA5F27147EA99682126DB90A2735273CAE930351B961C13E636B99094795F7F8E252FF956DB6D1FCC26DCF1B82FDE5AA5305975678C70B72FAEE7CFDC96C768B7F264359AB2DFAA1729910DE27B0500BC72AC17FFEA968D5C54B6A1039B9AF528853331BA958E89E646ED3C758ECBAACDAE6A63778FB1958E1A14ABB7A9668745133F338334BAF4168DDF77B4FAAC71E7B66F4B7B23AD7456F5D96C2464BCDD5FD5FDE120E2999377BCD3397A9931AF5251DD4B7673317CA70080578A44A54C97E3EF52AD6EB93629D747D89E4D87C82C845C5B39920DF7E8306B68EDA44951D54EB45B1DC3F628EB64B864393673DF7853A6B27D739BD4AEC7C41ED6EDB9CF6076466CE0E98245FEB84FC6169DDE5A7175D8AA6686EA70C0FC9B637FABF9E931F0FD02005E158A5527163BEB6DB9927C605BBD0670D67A03EFD75A3E0CD6F7849D92B5076FFB703631B4CFA6226C85DD7D7CDFE8EFBF7F4C3D06BE5B0000000000000000000000000000000000000000000000000000000000000000009A9C5996EDB122F3C51CAE090000BC004ACB33B2ADD7DA6E190000C073B48913656AE5130365000000CF8F469EE353363D655C130000000000000000003C5B6CEBD45FA26E22662F00003C6F5A6DA5C1654BCA99F51DB7DC4F2156A44EBBD853C7DA6D058314BF3C4AC7CD326D8C4F931998A4E577DF55E54FA5DC48CC9039BD28ED32F3D36E9BB86AE38DFB5E4AD9D2C69C0C92BDBE426B233E2A858354C9D7DC32B733BF589076F6D25C4FBD17737649DAF0B978DB67A2FBAAECA785F73EA6ED4FFF4DEA0B6A4E69438DED1F9579759A65FC5D00009E3B5B33CBAE267ACB1AD6C2D5F149D1AA7E9D662D4B2AFD3A6ED7287D7D46B4D9BCFA27B77C528CD1F7EF5D96762B177DAADE2FF55BAA8DB71FD6C2CDD1776843E9F061688ACC1B31659F47E9A49677CBD5DD1DDA9E9A97F9ED7E1BEBA9F7F6959C5F173D6D58999EF6E95846E69F547ABCF5D55F644E3FAA39F17E53B5CB0683F4A0BCA60000F0CC7C259ACADE5DB83150F6525776733D369883D30A275CFDAA949BA26D7B73D7DD321FE39695667ADB0CEB2BADF6B58E6A540885A860E67BCA7C3CCF4FF7E5AD1FB4D3C3D4D8317ADABB6344C3322F6F7D3661B93634FE2600002F87DF5A73489BE2B9FACA86A2A77D598987B679DEB07D7FD6BC000000000000000000F0FAF8ADF1FA2C3F7B2B4C8FE17ABF60EAFB67AF2B9DF7FB7F92BF118E5FC2CF5DF15D00F0E87E6B6BBE096AE5D9CFC0A4B50BEF913519A0FB8180F8AA693F30F64FF3AEBF2EBDFBAE3CF7E2FF3B1E23FEC147033E611BF3A6EC8F7FF4399592BB6EBF4BEF7F2ABE199B01FFE0BA72C2A2D54B2332CFF8F824A527C7A9D3AE91158A52FCF26579EEA6CBECC3B1313123F7017B3E20FE12DACFAE924CD1FD719F7BBEF189A08C775E9D2814DB941CB9E0F85A74FDF2D8074EFBD971BFABEABCB8BEB4745BEAF57C4B3B35F75C93F331AA2E06283E7D8F8EF77B9F37A6D793E2C7D73097E47E664743EEBEF84C82EAD1A99E7AD6393EEF616BDFFC9CF53074C769A3E691E5EBA6E6CECF2D37F979E5BD05F9FE878DADE7CB7E31DEBF91AD449E16FFC7FF23CF695BEDA6DBDE3B06D7DFFECD985C6B1E2F737301FF77003C86DFDA81615361FD472A2C042876F92BF57FBE28FFD7079198EB07C6FE69DE63627FBC21FB0E2251C75F4C69706E766E401BD81FEE30E4A78364CDEDD7F8E35DCA4DFABAEDEC81F9E6A277657B5863BF38C3AD2FFE181B28A7D5BD83B5F0707D51F441FBD9B1769BEAFE52B76DD1DEDCCACA50FB8DDB337C1FEAD1C858911AC594F89668BF3CD7078EFDE954BFC52543EE535A17F57CBDE7CAD7B0303747077667E01AEE2E4464BB7DEBDB9EFAA58979F1F12BCC4F9D796DCED2617D0FD163697F92E49551E7736279E8D87C6FDBF00707FE46F8FEF24FBF9F0EED5A4F7BEF18E2D33D15956BCEFE89FDE7090078B8DF1AEBC73F2F5F14FDD8FAF37B6293B27F99D8A11E3F30EF31C5F598EC638D632D644DE6FFE5417B936D24C77742F75B3FAA51F69B3BA20FFD733DFC39497B77638E7EA8FEBDF63BD7F797B59F9CD642ED67C7765A7587C70B896FDCDAC8D823F9AD1523299933DB8A85BB4BAE0F1CDBFEEC4FC7FD366A35C71EEEBE6BE29DAF3E576E9355EDE55CFB7E2FE49466B576A294B91D1BB8376E7EB3A8BEA7AF07DF61F9D077E69C330BEB4E9B45537D5F8E0D5DC834C50ECF855272CFDB5E727EA3F48FCDF7E1617F2F252321E75C8D2DF5B4F78EC1DF019F37B749A76AD061001EC36F8D6D9E4A22EC6A49BF5E0CF3032B44A2E75A2F9477DD3CBFB7757FFDF6A7FBDE9D55766D54699BC9B87D693FE6D3F2A3AC9D3EDABA255F073E679E6B2174FEB1F47CCF0BDFC3FAFDA335FDEFAF489DACF737CF5C83D26BC1FC8E8BF75CBCDF81F64FF48EAD7F57F4FF8DE8FB9CBEDFEAF6C3C6E0360F9A1F00000000007872F8FD3ABD66E22DE3DA00005E56CE9B9FEEAC77ECDC358266597E97F26FF4ACAC1947A5CCBFDDF56F5AFECDEA6DE3ED4FAF51E8B5055E3FD56BC9FC9B76D86F73F151E8AE09E8F792B3E120253F9D73D67A39D6842E972DF95D6E0543F21B9CD713BCEBC13CC6B098410000F03C384F7EBA5C4AE9702D35248E83F3ACBDC1CFD042CBD2C746F08A5BEED8066D4CCC3A717E2E8FAAFA19A94FAB3603B6ECEED1C018FC8CB0958AD0F6E28ED2E564AF0FDB629836C639465A868A3F38CF7ED8EF61EB96F3FCAA1A9B77CB5BD7E7A910D9949871255E7F4E1AD43022A763DF75625FC0BF1500F0426CE287E4A763DB917D7037477D83F1D6941D69B2162A7DE367F8EC8BBAF56F97DC326B6872E19E13F7F28B404F9B015F88AEE6F63F5B2A7DBBD0E37775EA0B35EFDAB41B13F3D43A2A52FCF2042DBC7D51FC5D8BF377DC72727C821ACD26997EBFF8B956950EAF5D1C55EDAF50A368D0EAC88788F3030078B15A2C3E4DCD81B2D7F63D8CFC70AEBE7E1A9B768F67FBF7616D34FC9EC8B0F6C9858468E7F1BEF1CCCE7F6F2582BF03000000000000000000717EC093C4F229371FE8A727DFF743FCF89EF46F01F17C00409C9F3729CE4FFFBCB66FC4DC770ABDF17C6CF5997D44F8BBC8CDDD1818A3AAC630FD733227BE0667C5F3F1CEC93BC6562229D753BF5789783E0020CECF9B1AE747EBF0B0583B997927BE4449D9CC67C5F3615D3DB18D33E3F9F4B7F78EC1B17CEAE6BC737D10CF0700C4F97943E3FCF0BDA3BABE3010CF87630FF33573F57A483C9FE366B3C73F70583C9F9CF1CB99F17CF8DC8A770DA9473C1F0010E7E74D8DF323F53BF981583B6E9C1ECFDA707F3C1FE77DC3DE7B517F3C9FFE3979C7F0C60B423C1F00000000000000002F83DF1A0000805727CE8F7E165F88ED4A7BF637E335C662FCF4798FEECB547DE9F6FDF5C51FBA7128D47C0B71278F849D327BFACDCD4EBBBE66F81B0000BCF0D8122F419C1F7E46C47ECAA63F20BEBFECCBCB7EAABA5EFB1378FBD2ED335F5EE9A967FFA9FB8131795E9F36F364A9363F8A8FDA2FA7FDEE383E65887509007869B4F82588F373A6BDCECFEA9596663D797900000000000000000000C019F127901B0F0070DE75E1A7909F4E3FEBD2EF6CA5BBEFC8F13B75FCDE156B928EF9C3E3541246CFFB74DC46970BB144CFBB79FA3D2EFD9C8EDF8DD6C7E8B1BC5AC7CFF5F89D628EEFC0CF14BD637359E7C8F33E6FD4B9EDF89D41795F9AC753E31C26ADA1E7E7CDB9D7FF1EA1CE7B57E7B8489EDC78FAFCD2C1A09B278FDFC3D3EDDDF7C44351F7FD3CEFB9EAF3E87FCFD05BAFDF87E373F55ECF42D473ADF0370FC04BC9C3E2FCB056703C1E8E81D6EF2F21316D944EF03BB6DE7837E9B93FD1F6ADDBD43062B43D352F7DEE7E1BA35C2C233115380619C78271DBC7FE313466507F6C1E89EDD08DE1332C368EE86A2C255AC4FBBC63F33D60584C1D1D7F47F6DFFE8EB6160D5A1DF53B7E6F7DB172748CA1FE72CF355163B23E9B5FCECB9C73A1943AD74D89CDC37E2787768D2AF7E6DC7782BDF18A38BE83B7AF834DA73EC9317AD47DA86AF5BE53EEAD3F4816DD7395D84ADDEBB9F5D55FDCB1F1F70EC0AB19E747EB437F2C1FB1C74221D7CED4B6AB6B7FA97DAC05DAC6B4C5860D4B7C1DB60725F64FD7DED33E70C36206E9D83CFAFEA063F89C35A703B66FD5D8AC4F7A6C1E83CBC362EAE87E5817735FDFA243A328DA58FC2142D55F92B2AF9A716C5AF3439F7B7FD0E581FB809B3B3AE4E68776CFAF6B93EA38190DF69FF3C4FF11FB56DDEF787E7C3DB52DEEF86A8765FE833EDCDDFA76EDCCEBE91D1B00F0EAC5F9E98F0BF32C191633A8E77EE089E7C36B030F6A7B5EBCF12D757CB89299523A1A148D937B4B77ADC01BBFE669C6B2F1C6FF115DED9E236B717F5CA5A7793D010000000000000000000000F05B7B12BF35FDDC8BD755791D352BCF871CFF2BAF8F97F619D36DBCFD797DB974999F6FB1EF966D185432CC1E7FB89CC7478EF369685F357EAEE58D59AE7DBFCE8A2B0F00002F032F43BCB502F77FB42BFB3293B31237A8A4B49FF30FE552453AFC2545F55444625C702EB9BD95881B3BAD1E9DA1E20F8EDF4421FE03156245395E7C867FDE475C3500C06BEDB7E6F529D376E8DEDC75B7CCC7B8658F6F1BB719B81F787CB974FE36ED03C63E70EC3BA6CB6CF7BABE58ED9AEBABC6EF6224EFE5DD5CCCDA6F0D71D500006F92DF5A36143DEDEB0C9F296F9BA70DAF6B1C97F3F85E010000000000000080979C679D9F8ED767F9595A617A0CD7FB3950E7F7EF1E10E34DBEEF87C4807BD2BF057ED6CACF48F17D00F0286BA98E4F57667D67208E0FC3F987D8EF2B193569EDC27B644D06E87E2040C71CFF2CE8A785F73EA64662A6E75DDAA577DF75DF13E631E21F7C34F07EEEC6BC29FBFFFFF6CEA6B78D2B4BC3F78FCC6E7E412F7A9541E045904D205818240DA6852003C52318013B0111ABC7A351D346C79221598C04434AA8212479E8989069024A21620361339401896AC821442E2408D4C204086D0419DEB8BDC8A6E7BEA778CAB748EA2B911D2BFD2E1EA854ACBA5FC53A7578EBDCF7643FFCCC6C15D68372E7DFFD58341690C3A89B76C3D7177BA59DD9FE41B336D81FE894219F92E8B0B5B69FD9FD4B0323F21CA84FC544FB066DCABE1F318F0BC5E05D1ECACD0EC4A5BE93DA0FE8FF147A2FC81C777E783688C940DFEFF5FAE57E6DFB25EF08E72765BFB6776BB519F4B53095318DD998C90EDF35CF36D3A13AD6160B92C3693F3F2FCF33D5A9C8477D1DB7AD996B1DED7A7823236D5AC955CCECBFFE8BBC4385AE10EA5BB3F5E15A3C1ABFD15147C3D68172D1268C81FB5D70CB72DB047B8B3E6DD83EED359B32E6FA3EA03C36C3FB8B9053709CDEDAB65737D5C507A63A133399F73FB7F7DAACC44F6CA7325D35D240E60F37E4B3ED54DAD7FEB236F8D1E878470C0674DC761351B35D6806E57A7F98338F065543A7DE1943D7D2397375CA80EAB0B9DB1ABBBCBB38DBA1DD96979C7575B13B88853B4A77A23DFE782D5333FBB5A2C496B83A736297A14167CBADCDFB39F0D436697BDDBE620CBB69C001CD83FA70E27647DBD02FE4E53BCC0EEBF3F0AFD1A8C457E7A3D74C36E23FD790676A3FB7D0B50ED8D51FEB5EC77741CB6A3FDED5A373F5E7A0A5D74D0B8F1072C47A8E23F2D355ADFF5678F7B7E293FDEF85373AFC5AC4F9B6E7A12B0C0E9FE8F72BEC14FC34B73E94B79749763D07FEE3BD9E88C946FD3834D5C74159DFD8FD28E7C5F6C9FB8F78E4D31C7FCFFAD9B0AF189B95BE9E139FE7EAF99C647CF2F699F16834D6B61FB17843261F89748D39515F143959255ED09B973CAACB8EDE1ACAC67EB70E948B631AC9918EEF455096F57BDD36E137925E7B1D7FB1E149DBCF8332EF2D4208218410420821BFF85ABD524B1782E34108213F4DE7079A3B784F8577431D3926BAE5946BE55C53AD1DBCA3DFB81EEB8CA1AAEC0431156E9E36B1DB2D6D9F8D74DAD7EEC19C31622192B920975C7BEEB86EFA4147CED5E692A1F7716E8E38ADD3D580EF962F6EBF5E09690C85CADF3908E5CF43AC87E6C9937C1D4E8E91502CC6E45781D6919B030F7DC7B67B9DDC3C79DA0F6CE3BA3E5DF5DFB785EBF3CBD19C1DEEF968AFEE2F635E98394E0979651CA7F303AD1DBC9F41EECB6FDEFA34D0E0D92D786247B2A339D1F371CFC95FF5DFD3E15D5075F3C06C2C4C9BBDBBE158A6BD8A7F9F7F77F5AA1F97517B2E5A42AEB64FE3897D56C406CCDA97D3F2ACC8C726250E6DDF4B06EFEE5D8DA176FDA0A328C7AFDBE74BCE3E47D6439A41886BD0F1D8984D9AA5FEC1E09DD3F6F2B7BE6DBBEDDBF0B5B19990C650FBBB3F89131BBDDE112BF85DECDAA16BBE1BA954603FF51D266C27DE4D6E8DF6755CA7EA836CD76DBC9BC33B55B73EF4ED6931651ECEAEDA674221740EDAABFB714E756C9CF70721AFCA27CEED883D6ADF0EE2D6AC7DFCE18F9F9A47333326FFC517261F8D4A0C29FC2DC4DCDEEB8FC9BDED9EF3975B29F90C76386B6D2762D8EE7D10EB88CF45BC84C6A92E4DE66C3949931DC9490C6EB6AF476CEFC36B77A44ECDD9069BB93D7B53E29AF3D198C46FE17D3EDEF5AFFCC7C58EF82ED7A70D619F27F0FBE0CBA2ADDAA7356BFFB45CE4FCD49CCBA87BE5333F0EE3E16C49DA5EFE9F983D266DED5C9F7D060C84EDFC6D4F7C4A37962C146376B7649E6D7A9DD763F456685E07B109F0CD376E454DE36F7FEBB84E6EAC87BB2DBF71864642F5C1BE6EDD9E9198B9DDC474E81CB4D7DDFF70728CF70721BFF2B835F185ADBFF7C0DA53D8C46E715DF0FDB06E63AFB923F1BEC7FD56FEA66FF844F3121243FB53E2CE4E912FEEB0B8B3F698B28EB6D936E17980BAF07C509F18FF973F8F85AE197EA7B8F162EEB61B9FA6F5E1B3C24C4E9E397806B4C7FBE97ED8F08D11CEE91342082184104208399F3A3F78AF84DFB83FB71CCCEFEA6FE5F3AC25A4F3DADDE628CEAB6610F57C0879753A3FAA4B83F7607FBDE46BD7C036FE582F067A359833CDE27D554B3B672936EAC719B4E9E084622A664BA2B753E8EB0D69F094A71603FD209DEBDCCE3C0862C7A027534DA7CDA3FF9B33F99E1EB115AE9690B6C33D5E72E339756C15FDED47E38321DD1D9CFF4D3C61BE8E443B74770E6329362E63F378F65648E7C7ADBB5A401DFDE6C1BFBD15D2FC29CC7A81CECFBEAD0FBA44681FDAE19E1F8AA7B0CF9D42EFEFBB6A0CE9F843DF015A49989FC61877D3187ADAB463D5DB27EF290B977B8FD4AAD0983B576F887A3E84BC3A9D1FC49169EC14747996236F8AFFB99B180AF46A1AA98CFC55ED9C95817EFFFC66B14307C7D5F991B8DDE18F431A3C6B73F703FDA02066A3152FE66FFBBEF1BDB762662F37D3D2DD79A125A4ED68ACAF868E77EBD8ADD5C5D635ECEF81ED422DD48FED4CD16CD59F8734840E8BBDC0EF08E4CC139B84F61E94039D1FD82DAD7BAB58F763B033B590E60FCE77757E5087EA10B56B1705EFE76C5FF79B4DD171EBD01872B48B10EBA131CADD3486D0D70DDB571CDBAD1ED70EC3FE2E477D5F7EC5DAE4FAD475EAF91072C66BDE8ECA4F57B7F64BEFBB7AB110CA0BA779E4B08D78D7C66A2958D7A0EB2DDCFC749DF51F0471536EAE3BA9239D0C6CA7FA60284BD74B54E7D266CBD689BA61BFD407DD48A6A41D9A0FCF5D5F11AA239E341B8944473FD6EC31E8CB49733C17ACFF0E5BB662EDF053FB1BA16ACBC4183CDEAC85EA563B2EBEAEAD43F3E7A10DBA1FED75D777FC30D72527A06D37FA87751E5B5E2E185BFC26D0F1D73E69CC9DD6A7BE6DB7BC7EDDE61D1A8BFE730EB9019FC9F7E340CAA925FD67F35AB1493B4CC859D9E263F2D3E9DAB286973CBBF947D877AC91B376A5DB7CC863A71D8DD54A47EC5837DBF17363CD7EF27CB8B5FFDDD66E1F55F771DA6BB28EE49035773F698EBA7C7AFD331D777D96EAB34CFBDA90F70B07BC870821841042082184BC56716B841042CE2E6E0DF165F5A90193ED1B355BDEDD2027D933BCEB72E2BDDCDC711ACBB557DB94382ECD4307FD343D46E20892715E074208E3D68E895B438CD377FD3189A9451C9A9B4B0DB6D7CDAF891C656E2C5775EA4BB332EB0579E84403E1CA2835150921E414716B12EFEA7D1F6826C22EEF655A7938C727FC78A652D9EC7E5F90382B59DFF6F1653FFFE6CD097B6E4D6C7B792C6DEACDA669789E59895E0FE2D35E762C0321849CF7B8355FD7376EB6F2459947502D76C4D76A3CDBFEAA67B64A3BA1FCC688E5822DD6B859C43AC17F169DB37CE5C47167841042082184104208F9757292FC748410425E2EC7E5A7238410F2927DE263F2D31142087905B6B8233F1DC784104208218410420821E434942A4D138FC7CDF37392374DDB7BD045D7839C9E78226DF25D74A009799D3991CECF545E72AB212FCEEC3B1F9ABDBBC3263F9B375B2303A239B135D92FEBEABE7EFB6DC9C371EF628FC9BEF59EBFCEAEBE233A3F9223ADA7D7647F1F91FD2B9FF599A5A97CB08DB5D05A16EAC4BABBF6B694760E4CCC9691ABD4CCD440C4F4F7C54CECA301D1AA18BDED99FEC1B859BC3B6E7ADEF84FB16D582F5D693E0FEECB82DDDEC92D04DB3A1F9E2936CDFCDCB019BBFA5FF2FFFB97FCEDF6FD5AD681DD9E8DF59881CB717365744CEA8AD87655F269B390DBB1FF474D3A9D343D912113B7E3061B3BB55890E38662BEC646AEB46386FBFC9C7093F39E292C4E99A6BD16D1D8907F8CED53DFE53F99BED8A0F4D5ED472C3A2265A5EF26E5786C2FDAF37B2F0E046DF2D65783BEC2D6F7F45E34E9843D275FB16DED3709DBC6E6133C0312D2762F9736B1D80D93C433C18E4B3C9E947237BD79333DF5E2DD81BB7FC67E5FB08D73FA86A782EB82BE61FF642C66FB7410B4319DF34CCF457BFD5ADA4E6EB903F6BB20E3F3E778E81AE39AF7F6F8F9FA6063D1D69D524EFA847E24E351292391CECBB3F772C23371FB3D1DB475EFD8EF5ECC8E5F2C1A37CD4ACEF4C466ED6711BBCD671E79FD384EE7C7CDA5569EFCCA2CBC1D11DD1E68FD546BCF03CD9F156B8390BB6EE5CA0762576163255FD0AC17E4A1C376DEDE3F7B9B8BAD3C72FE36CE77CB3A8C91C12BA666CF5B4F654CDD4B05FBD30BFE76DD3235E0E7517BDEA5AC5BA37341FF36D3D3FEB9731993B476DF5BB86F6AD636DD9FCEC8767A7A3CD8DFAE4B5498BC666E4C4C04F57A293FE7D3C464468E2DE53226E1D5CD4E7ECADF7F3325F58EA5374D3C53137B3032606D8A1D27D8B4796BA78BF5A66DD3981C033D259489FEACA7BCB6BAC7C5660F4F65E4783C17523727CCE7A3A9509BDCBEA6D20BC1F95E6ADDFEAD3BFFA74DD15EE3C89B6F98F7DEF2F3AE0E58BB1AB1F6EBC97A4A9E593A56EEFEDF7D9490670ECE492C7E1F5C974CF9409E3FA357FAA45C6D23FA84E784B6C92D37B5FE44FE7EF5A57D2EF45D3151FB7D594FF9EBDED34EFF759CBBF5C3F7873D79EE250B4D33979E33CD42526C398E933AEA1EEF79F27A6A4B1CA3F3A3BA3EB0C3D0EDD9B2DFEB871F7D6EEFD79A69FCAD209F217F198E5D9B5E90BC711BD6D6FCD82CF8FA3F2D9D1FE4A1C3F6DE4EDDFAC975B9DF75BB01FD1FA72CE4E1E9A63F111BFC42FC26F83AD1488FF888B065BDD607C7FEBCE7997426E7FBC38E0FABE7ABDDC3F6E2BC27ED829F055F0A3E553AE5FFAEC5B6CE6F60DBF5A16053128944706C3C99131F0D9FC13EC2C7AC943D7B4CDA24D3696B9393522FCAC336CE9F191A119B02DF117E34EC3DEAC05F1C03DB8132E1BFB6FB6FD897B065A10E1C2FF31AD65F4C2492419BDCBEAA3F0CBF15E526DB722DA96D435995560E41D481E3762A85D058B9FBB54F3827E58C978E8187DC7FF61C6D23DA91B1E3A1BF55DC726123312ED3C3C3A1E74FA5B62976187F4BE572D056F4C31BBBD36187D17F5C0F1D035C3BDFFFAE07FEF04E89FE30399F3A3FAADF03FF1673069AB318B9E53487B1FAC09A5F133A3FD0FF81CE8FE6A1D3724A2D6D62DD46AE65B7ACAE73A92DDBF473FB5A6E3D336047CE625E167667A75438D539783E9C455F4EDA579D2BC07611B955759EC179861CC5598DD561E506B6DADA5AD8F99C7D7EC37EEAF310CF26F441DB0A9B9D8C27CD4972E3F9FEF0819C83799512ED3021841042082184BC36303F1D218450E7871042A8F3439D1F4208A1CE0F2184104208218410420879959A31BAB640D7B1FDDCB2B0CEAE7D0DF6ABC6EDD379D35D22E41799173E417EBAADD24EB0EEADB1BE2A7F375A6B63B1666E2B190FADB953B07615EBE4D61299D0B9A0DEB26F5BC97857EDA1523C21C7413F48D7E83D73D6EFD5DBEC233E7B9CF3B503AAF98A5F7F97BEE0B8EAE457B28EAC54A9059A33B0B9A5D63A6AD80E6C4FA43CB1276A8B758D34D6CFE9BA5C6C7BF373A17572B20ED97EEE7979F95FF586B01FEB7375BD2D6C13F6C34E7D1AF1B57CB0960C6DC11A331C9348C46D1B93A1F5D9683BCEA96D9664FDB0EAB5E19881215F97011A3CDA46AC45C631B0D1EE36EC75B08ECDF617F5A1FE4AB3E9AF81B6E393B4E3A3DA3EBAC65BD6959772C11A3DB44BEA73C640FB84F5C9B1BE5BBECE4F5BDDED7DD2EB1168D041DBC7D69DF3B0BEDBD749D275D4F8BE351667780F937FAAB8B54777EE887D6C64E6CD76EDB968B6885DDBC9891604B4D1B6973D5913FDC3C2981CBF557F6E9E163DB3B7BA2EC77E77F56AE898439F0DA9A2DCA7CBF6DEC43AEAED6F975F7C566C4ADDB5B9B05E4BB57C60CA37C7CD5E2517C441FF7D3DD55176E3892595128D18D53058B7FB6A19BB0FEB7D619BA6FDEDF88D19B165D08C69D70C9A1BBD156C4FA737AD8DF2D735DFCF94CDBBC3C3E67BCF33973E593043B1DF999ADDD6FDF39F5C0A953331715BFE7E7E6DD2D7BB594807BA3699DB49D1C251BD9B601D75D1EF57CA8E71CAAB9B7F3C590FCAD2E30FDADAE86AE2E8367479CA495F67077A3CFD3D3D818D443B747CD45643AB02C7A82D547D09E8AA41A34DC7C0ED13CA480FF9EDC01876D3E6D13605F5D9F1C7F3AD92F744B3087D6CD753022BB7BDE05943C8AF5DE707D4165FD821D5FD111B3E73CD5F0F522C84347C6A0BE3A63C3161F77D1F68FE34ACFF84FF5D9D9F92B5B5EDF752DDDA92FAD475D9861D863E10B61FDAFB1B75EF7B990E1F177E7263B5247EF4BE682A1C98DDC47477CD859945B9EF556F66F86EA9433308DBED9A31AEFFE6EA0575D30C523F11E7406FD2D5126AD79910ED48EBF3168A79D10FC27947E9FCA85DFC8768FBBCD012127F3AE9FBCFED6D54FBD7AEF3D3AE1904FB8A72D00EF5815D6D1F1CA3B6BA5DCF47C7C0ED532E930EE92E1D658755BF49359B9A182F6817B5C6A4DD0EAFD967F271FA7C849C2B5B7C84CE8FEAF7ECB5E630613B75AE40E70DEA9984E8F9B8F312F091033D206B2F36ECFDB4964C86E62D0E6B8F96BBBFF342FF07FA6BD0185A3B660E54E7359E1DA24B83CF93C9B3D30B7A993A3867D1C676DBEBEAFCBC0CCD9EA3F476DAB5DE8267CB09AE47BB265143D6821EF0FE2584104208218410726ED1398CBD33881B7B5DC15C8E6A479FD7B6F3BB4AFED9E3D6DCD831B55B98AB457C05E2C7F017760C73C03A1FACB16328F7B4716B7AEFE97C30FEA26CD4AF9F61EED78D9FD3B9E9FD364D73F7788DAD5B6BB5A19A4A9B47F6BCDAED3BB6FC44D0169485631EAFAECB71BA5FE7C5D11EC48868B95A078ED3B1C27E6D53BB8DD7F78AED7AF73A0FDFDE571D2F6D2F3ED7725107CAD9B06D7B5CA975CCE3077D9AF33AE6CBDD6B031BADFD7EFAA469FF2624D7A0DB27D4A3D715C7EBFEF66BA8FB751E5FDBAB04E3D9DA8F76E978EAB5D6FDDAF6C3BE932FF21124648C8E6A13DA833EB5BFC370C7702397EBB896184FF45BC77B6FB314D4471B425E65DC9AC68E3D6AC54995733B123FF6F7F58CC95F9B95776EDB88297B5EF36374C766E4EF7E6EE1D4716B1A17B781F88AE681D451CDD4A46C8DA1135B8F7C63CD175A9DD507D94363EEE4F38C6F579706E3E62F172EC87EC4626CD8763FDB4C8B2D6864A6CCD2C0A81CB3971E31EB33A9C066E56393B27FDF4B06ED419C48ED7E26548F9E8372505FFEFD48E87D12F2FDED2E264CF6E27B1D3E6AEDC18BBE6AB92BB6DCDDD4FDA0BD3246CBDF9A7D94955890EBB616BF1CEC0FC663CEEF93D8D82FA74D6164A1636CDC6BE3F65BEBAE66EF4BF91BB349B3D43F68AAB7FD588CB5B199505F0FBB86C1FFB65D886F785AF09F617BDEBC8CC37E2BC7E0236F33185B77BFD465DBBE77B73356B896756225EC786D5550BE77689B966DFF352FAD5B873B86EDD752FA817782F619F9B49891F8C8EAF51BA1FA6843C8AB8A5BD3FB3F75F9B6FD3EA682D835C4A1E19CDDD4947CB7F119E286BF7EE382DCFFC86777DAB835371F1EEE659CA365EF7E5F303FCC65A44EE48CDECB24826748FE839E8E76BBC78B0F6DEB835FB491B6BE4DCB0786DFB9914CBDF0F3AC9D50BFB06A8F515F487D36F8DC85BB15F35D7F8F9CBF66CBD463F17B017FE14F3EDEAC75F587C5B626CBF6986847DC0762FFB4AF5AAEAE69D1F6A21DEAEF699B7E18BF1EFA7D8176DCEBEDF37DE9623EF0EFDAEDBE7B6D1EDBEBA23EEC367CF14422C811A8BEB91B3BA37DD5F1E9760DB58DB2D6C7EEDBB8351D8C33CE43AC21C64ABE0BADB175F7AB4F0E1FD96D3BEA9E8F0C9952D4CFE5AC7134EDD7AC7DDC357FA25B873B86EEB5D4DF147A5F20DE47E37C4E12B743C859C6ADB9EBD8F4B720D6D8E177999BB7CE5D7787EFAA7BEF9C266ECD5D9BE7FB29B6BE7C51EE47B70EF1B74BE523E398DCE39F9E61BE74D881673B673FDF8ADFBDDAD7A38E83ED70C76F239196BEBBFBF7364FD63EBD36676953D00F778E48F2BEC27F3CC36BA0DFCB8D13CE1FB7E74FEC980F6B8D61C7675C2B42082184104208212F0DE6A72384905F3E7E56E383CA8BAB87AE05BE73E586C43E2C4DE5E5DD08DE6D6FDDB96DB646FBCC9A5737F5BBC326FBEF9FFAEF85E6C7657E30FBFEFB32DFB6141B37CB12C7F467F3F5C55EF3B4B96356AE7E72A4DEDA726CC83C8CC6827744EE3B9AEC48CEECA58742FBB5BEFD5289D7951072EE589178A6838EEDD07B975B5F9887F379D3A8234E2066CA37E2F29E0ADB777EF35B3947DF8354678682182CF8D988B9123B9FDE348FBEB8247FB717FEFBD0F6684C11E22EDA3F9B1F9832CB91374D756AA8333E2D3DC7EB4908F955C6AD856CE9D88C1F7BB65993D833376ECD8D81825D46BC18CE294C2D8ADFBA62ED6F6DE2524B87AD26C7748B5B9373FEF8278973EAF64C58BE356BDB78B323C6A25BDC1A218410420821841042C8EBA4E7A3DB5C0B4508392F3A3FA759DBE46AE5F86BDE0E426BF14EA2F3A3EBE9AA195F77453484B0DEB4520AE9EB1CA6F383F96A2D5F7569706E2D550CF47C64DBD192218490D75DE7E724C0B6ED359BC17B37D59C7173CA6D2F2F1CABF3534EF8F975B2A3B9405F45CB70F5754EA2F353CD3EF0E3A48BF9909ECF834B57FCF890EB53FC0E10427E799F38B763FDC55CC7F6A93505AC9D5BFA28221A35F85FB58154B7468E4916CD52241A68A7758B97809D5C8E45CDBD7E3F7E38F5CE15B3148D9A1FEB9EC9CFAE4AFC327C5AB75CB7BE509BE00F4763E641CF80591ABD69962E5E9058E699DFBC634A833153E81FE0778010F27AD8E299C52046CCDD3E0DAA4126DA927D1F9A7B3D11990F58C9954C211291F9D8A5E1BBF6F3A8C9F60F867CD9AE7E3A74619E43FB6C30145BACB6B790CE9BDDC40B5FFE9B9E8861BE324208218410420821E4FC409D1F4208F9E5E36A4FA2F3430821E4E571129D1F4208212F8F93E4A7238410F2926D71477E3A8E0921841042082184104208218410420821841042082184104208218410420821841042082184104208218410D28DFF073DA7A8B7 +MediumImageOriginalSize=177000 +MediumImageWidth=177 +MediumImageHeight=250 +MediumImage=78DAEDBDE7771B47BAFFF9FD43F7EDEED9DFBD73EFCE788EC71ECFD8B2C7F28C3D56CE12294631678208044044223752030D341AA1910136200224048B0A3EDAAA820889929C34962DD9F5E273586C545537BA0BD54FD5939E3C7982271C0E87C3E170381C0E87C3E170381C0E87C3E1BC26856A1389480429290EBF2022AB64E1B2DB214A1272B28846A38172B30D8FCBC58E47A41CE627C760B7BBD0E91E4055244425057E7F00A2E0879492D0DCD3E0F20BE4788A7D1E20E566BD0CA55841C81BC0E1E1218AAA0AADD9C4DD4E07FB7B8DEFBC3E89F4AD6412B0BBFCC8C83264314A8EA550A9A8DFDB8EF3FBE16F1F7F8A0FFFFB0F589F9BC1D2CC0E3BE6B57BF1E78F4E637B6D16E1580C7AB3138B63B7E0379B60DAF160E4DA5598D67558DF3223E0B6E3DAC432424E3DE4701C06AB133AC27B7F780FD7C666B0BCA1C3ECF41864AF1DB68080B0C70F359F47399B81838CFB43F21B894712ECBC76218553A74EE1DACD6B302C8FB3632E723EFDCA26EB3B1C8EC0B263C3E68A1E95B0386CC7E1148B25F6B7A575D0E93F444D55869F1DF67AEC6FAD56C37E7B7F78FCF93285B6EB77347882511CB69BAFFCECB82FCA37FD3EFB7BF4F8091EF60FBF771EA6EF083A0F177205641211C49FCEC3DFD78EF3FBA5D3EDA1DFEBF27BC1796790C404B2B92C79BF13B933AF221A9720A749392DA15AAB229F49A15EABA35AA9B0FA54F60D7AECACAC969B701974F0F82270DA0308EDBA58399B14B1A2B791F7FE2E9E3C3EE2F799F346515229ECB5F651AF9450AAD4512E14C9BA4E41329944A15040369D405E2DE36EABF9D218568A0DC8413F76AC2EACCE6C62676B9395C3642C4FCE6DA2466493C747FC7DCFE170381C0E87C3E170386F8A4024068FDD053993607ABA5AADCEF4710B1B06D8B7B7901013646D9783E077C1E3F1A0DFE9B03D5DAAA7AB359B4C0F979052D80D4B589BBA39ECB7D16CBD742EADD3475C08229290D839E85EB22C67D81A31CAF68125761EB6FFBCD7603A42A550E3EB42CEF7726B7219A7FEFBFFC1FADC1CCE5E9D80E8B6C2B2B68EB1C9199CFEF7D798BA740E976FDDC05F3EFA145F9FB98E27DF5486BABC5532CE6727C77075641AA7FE7A1A5F9FFE07FBEC0119E3BE4068B0FFD6EA33DD5B4AB0436AF6F1F5DF3F84D9B2CD747E8BE3731063515CBF7E032B1B7ACCAF6FE3F47B7F24EDFA787250607AB85AF7218A52883F2BCE4FA2A569AF3C1E8E66F1E4E1012BFB3CBEEFEDE3E8E8FBF7855FD4F3BDF4F9D379983F0F0E87C3E170381C0EE73F94EF735D545CEAF7D6E9B58FA0DA55F4CA1D7ECF7E232CAFD851CE45B1B1BA363C168945D1BADB6536E8D94C1AE55281D90A45E23292490915F23FB5B1500B254899C2CB3671FD87B0DBED080A41F6971EABEEF561D95C442C1A1FD673C64BE4781B7FFDF0436C6C18E0DD59C5EDF94DDCBC318EA612C0A6C188B46760EB2CE914145C05E4CD1934B26D942C0588B3125A611599B514A273225AB1DAC0D66355417C5142C19842643681BCA78CCC4606E1D100EAC260BFE57EFF311A4E15D2620A197D0699ED12229311E41D45A449DD9ABF848ABF0265338D60B2886E2DCBC7CB5BCAD68693FC3DC0077FFD140FFB9DE118EE1CDC43BD5C82922B604FD398AD502A9D8528269157D2482B39EC3535F2BFF8D42F44667BC9D4A6F855635855F7B1343972620CFBC5023C0E3BF42633262637200926787C41E837B761DE9885C1ECC2D17E7D704DF349C85BE41C1F999076AB885C0A223923A253EE21391DC3CAFF9AF04D66B0BFB1FD6500B18918E43509E29A8CD88682CC4A1291511F8AF6FC600F3BD781744B40F4760CD17911EE0B5198FE6242C6A820B996417C2484C0393F3C9723E8937BD16E96F978E170386F94E77D2F8E756DD46FEE75FA6AB63BD0AA9593FBC83FE0C7F14AD9B5C7F5769C77C79F2E1E96D168D6D19005BCFFFE27581EBFC9FDE8382F118F274EF8D3A5A3C233BB87A7BAB26C4679C99FEEF9F990B66B9555589D5E323EE597D672F4B3E7F56ECFFBD37D9F7FB22F944047ABC164726147BF864828CCF5771CEE4FC7E1FE74DC9F8EF3164165D3837BF7D1696BD0C89AABD7D947AD5E47B650627BBDB56A19957AF33BFDE9CAA9047CFE083C4E1F19C34E56CE26E358DBB2717F3A0E87C3790EC1EDE1F781C3C73087C3E1705E8B8774FF211A676B2CBAD71A8F479FEDFFEEED4356B24CF746FDE2B49A8A5068B03FFCE8DB272C3EE5936F1FB1FF452174C2BF8DDAFF346BCFF46EB22841CE95996D443A9D19F6A1AA451CF57BE81F0EF8A13D610EE7556378746494F9BF6D6CACE2D4E75FB3F1CCFC8B6231C46B1A64BB83F9C5F9AC265C3E7B71D896EAD3C6970D181F1F47C4EF44ADDB1FFAB751FB1FAD52C2C4A20166AB1B3BEBF3906309448271F87CCF7C95682C217ABEF989694CDD1A1DFC8EB8AE8DF313A13664C7F66727EC21684CCAA323169792FEFF981EEB1EBCA44F3BDE4B7EBE2D9D631FDC7FF6F91EF5732E37877DBDD8C7F3F3308F59C9F929F43B7DA66BE8FF801F2687F3B6F288CC7BE5DD5D74F7BA78A00DE45051B783C0D9AF60FAE3DF60FDE20B383EF913C4C505347C83FD8B34F9BC603621313F8F6E4E44667309AEAFFE8DEC8E1D8A6E0D91B9A567F668720E2D712063270D76A4E76F23B6A2C78356090F1E3E81E9C38F91DFD623B3B1C4DAB57305D8FE71FAA9FFC42154BB1D657F0865A77560171FCF23B334F5F43AADD8FDF403F84767D029C8EC3A76AF4D20635C677D7CDBDB1BD49B1B47CEE68778F332BE25F2FA01915D68DDD8E20AA4150B1C5F8FC0F5EF7FC1FEF13F905A3320ADDF40D96D3FF13D386FB91D44A38DA356037B0969B096934A482FCD21BE644235E8417C620259870FF5A077308E622932860D2838ACC86D6E223CB540C6C90A42B76F2367B6233C31855632FAD279EE13D9A4E4B641F50AB85F19D8954BEB7AD4FDBB4891DF48646E15955D3B52060B7937F470FFF0888D612D29A1FFD49EBC5DED418B0607D72196909A9F40CEE141F0C66D761D99B565F2B987F571AF3838472518454F6BA11913D93BA7A55659DDE4DC1D94A364EC1B76204D8E425C5D85B4AA43C1B241BE9B9B5D0F1F1F1C0E87C3E170381C0EE7EDD7D3A5F8BDE0BCD378DD3C7624E7DD9E874B5995DF0BCEEF9AFB478FDE7A3FBB8AD0FCC198543F266E15E7DDE2CAF91B5875C45008EA87C7683C9FA49847A55941249E40261587908C232244A04831E4F239046271140B2AAA6595D9628482A161DC89E3783E14451AE841B2F97DEC6C99108B2487E7F9E7575F626AD18C3FFCCF7FC16875E3F6EC16CE7DFE4F2C5AAD48A4223873E53624D740D7111A1560FA9311C2152F92EB79342B5D042E92EBBC29A0255760FEF316BEEDF57074F42D8BCB135F4E429A0B23301A81EB8217F2AAC8CA79CB20072AEDE3BE76C0E2F9782F7B119B1EC4F349E9334890BAE2740A7B911A8B192408613E56DE625C4E2712643C2C8F9E7F666796A53EA25552BE8F46B5CCFCED1AF53AF3B3ABD4F7904AA5502C164FF8D9BDE88BFFE218DE6BF599BF5D36FB2C8F6E3028B21CBAD1A0074B6B4604BC1E6465198A5A44349E66BF99270F07F642346E54FC4600796B1EE13B12F2FE328B8B963357C818AE23B31023F51EB3314CE3A3A97E15257B0169539EC5982A9833ACBC171DC4B8A27D34A31516574DD6A7119F9558BBA2AB84F8AA84C25616C939327EC713A854783C2A0E87F3E6306DEAF0D9A7A7B170FB32F45BBBF087257CF6F15F100E9277AB6317866D0F227E07B63637C8BC6A86DD1323F3A71326FD269C6E0F366646F0F5D509CC8EDE66F3A9D1E684C7E781CE62C50669B343EA7DF1EFABE8561526A32C2F6E60BFAD211D8FC362D9E1CF80F31F33B7A6C3EAF8189291104CEB1E74FB4F10706F438C8B18DBF4E1DC8519F24E77222F46B0B66180188BC1E334C368B6215B2822E62363D61F4198C8C476B38195E3A4EDDCCA2A5C3E015B0B3330597DE8B54A6C0C6F2DAF33FB613A86F93B9AC3E1FCAE62A16473FC3E70DE691D47CCEDE5F782C3E7610EE71D42516BCCC7FE75757AAFDA37E6705E9754B587F95B57603299B0B9AAC3F4F82C5CC110EC2BCB2C6F8BAAAA6CCFC06071C26634606D761E866D0BF4BA6D5696523276DD2EB6E746F32B1BD63670EDFA0DDC995F677B7257279671E3CA796CCC4C416D1FA1524E211E88212D4AD0B42AD2E41D502B57D1AB0FF621D49A36D481D078164CD762B543B765C326395F28266266720CDB662BB6F596613BCEEF588E283759DEF0F5D57516DB81EAE652641C95A31196F79BEAC2A86E4E94731085082421C0CAC5ACC4CAC188889C2C428A06D9F893E3094CCE2FB39811E59C0C4951995FFE8E6E0DADFE63D40B19542A55948A751C3D3A623ABD6F8E8EF0B0D7FACE31BC43C7F0BA653086A371D81D0E6C19CCD82163F8B81D87C3E1BCABF4FA47CC0EA1A969E4DDDE442E578075C78D2A992F73391599540AF56A058D661B47BD97E3A8640B35A4E2027C3613CFC9C6F9D5D06A3594AB0D144A6564E434823E22176433E8EE95118DC5592C6D6AA3F6EDA341DCF653679EE575F1FA23D831AE21E034A1FFF021CFC9C6E170381C0E87C3E17038DC2794C3E1BEF91C1E2385C3E170DF7CCEAFCEC6DA16220905153972C2AFB9A056D16E3751C8E5987E2F95CF231911A09132F5CD2F96CB68B7DACC37FFC79C67BFFF18E978E8845FB3CD61835A69333FBD64A6008BDD85B5E515449209345B1A1C2E0F6AEA409F22EB64647569D4850A8A8106F62B5DA45615A826052DB989DCB6826F8F8E985FB362505015CAD09275F2B78ABCB78EBABFC4CA9A3CB0BDA07D50DF7CC590473D5844DE5162ED6A9106ABAB584BE8D50F51B4E5B8DFDF5BCEB67E1B66B1819C5F7722BE8456EBE09B47F790963328970A105329A46485D901B5F6BB0844A24865B2CCC6F2C5F8126AAB8F53A74E318E757DA9440321BF7822BEC4C52B23985FD6E1EF1FBE8FD1C9052CAF18615EDB80C11B80D962C1ADB159EC170676CFE5780DEECF1D9057D2505D55ECF78EA00534EC79691CF87B885CF7E1C9C3FBACAE3029A044C6ABA29791B116E03EEB41C15D60E5B2A738B846D2C711ED234CFA1D0943D948B2768A85FC5649DD4E584395CCD72AE99FFBFDBDDDB4C8BC4A7D34831ED7F0D861AF47E6DB368BD7F02ADB0BAD517DAD73D55405BDDEAB73C9749FCB63F34ADB3BBB0A2DDE80263550F4D7D04C34D1513434C41699875B680407E38CCEC3ACAED24637D74239D8C03DAD372C1FB57B837998F441DBABAE0A7AE50E9AF23E6BF74DFB1E9A3132170B640E0FD5D8313E4EDE6E027E01A1688CD955D2F9B45CA9309BC84DBD036A3A042523B35825748EA5C7A9FD308D7B62F704999D3CB5C9A4769A594561BEF9342739B5F3A439942244F650522269E76139ED1A8D06EC2E3FF3CDA7F9E98E73D87138FF09B3D363F8E00FEF617EF42AE47005A962175F7FF627EC6C9B7165DE82EBA346A8B908FC3E3FD6363660B6FAB06558C6FAE20C5C6E3BEE5CF9373EFEE212AE9FBBCA7CF35736F4D8365BF0C5D5EB985924F5571771EACBEB68C841960B4F0EC7D979697EBAE773D87138AF0B8D2BD57ABA2E130227F3CF159A87882732D8D72AE8775E2F2F5836F36C0D47E761DFAE8FE709E5BC16D4CF82DF070EF7CDE7707E45BFD0689CDF070E87C3F995A8751FC2B7A387CF1784DBB9CB7473BE6008811D33B64D26743A1DA69BA331FE7CBB4E6C6FEA3031B78EAD9565562E95AACC375FA7DB647B6B768B15816010E1F0604FCEE98BC06034C2B2B9CAFC9A0B850CDC563B0A39159AD6603ABDBD3DED7BFD938D1637F3C5B793EBA131BBA9FFDFF33A3DCEEF9B482C8B1D971B37AF5C40299BC2D6860E71EA636F77406F32E350DB63BA393A86FD5633420E1B76033104BD4E56B6B9BC6C1F98C6C3A47EF5518F1F5FDF9884241758BCCC784A81101270E7E6B5417C899C08399546369DC7D1A36F204A29F40E0FBF37BEC4C4F43A84481CCB6B0616ABC2B6B18218977F381CCE6F84C3A3C7F078BC880B4124523299FF5C90C8DC48756F5F5D9D84C7B80E399360FAB65CA140EA7A067ADBC74FE02273A59448B0CF4364AEA5FAE747DF92B9542DA2D3EDA24D648586D68694CAA0DD28A375B78BFDFDBBD09A4DB45B2DDCBF77F0CAEBA13ABD9020A27B74845A96EBEB38DF8F712781996B3730B3340EA35E8FFF7AFF53E875CB4C96387BE90A3EFCBFFF2FACCFCDE1CF1F9DC6C8A50BF8FACCF5615BCBDA3A69B7818599395C3E7B118F8FBA435FFF5CA14464D7249264FC6E5B9C488B31223B97D039BC07873F80702C81567390FFC22EA470EDCCA981DE23DBC6E6D228762309548438D7D7715E8BFE4342477BE56705B576C22668387F3E6797A369AF6E4BE7E1C34EFB7BCF4DE777291A8124CAE4FF87FC7970389CDFBE3CDCEE438B87D048ABC35C59A92D070297CF22AD334198BA83ECE60AB2DB5B90B78C500C06F86E8DA0BCE34084C810D2C20C22636350744B285A1C707E7511919B377054559EDAE206A0DA9C68B80CC3734A3A230A82828A770799353D39C722E277C620AD9950708490D9D860751EF73BFC19717E9C6D4FA38DA356037B0989FDFF80C812F18909A8BB7E8446A7905E5F84707B0219AB0759A309613266E5E579E48D9B684825249697915A586063553619111999C44169609F7EA075D056643463229E3C1EC4BA8ACCAD42329951B56E435A5D47647691F591DBD643323BC938B6223C31054DE1F6B91C0E87C3E170381C0E87F37DB88212CC1B2B907365A42489F9BA053D76B63F4BFDE2A8FF5BC4EB627A3ABA674CFD2DBCBE300E0FBB28AA2ADB23A63AB9C8EE33BF51EA1747757DFBED3D04A3127ABD415E03EA4F47F325D03EB8BF1CE7E742670E616C7A16392984C3238DF9BA8D5EBCC6F2C550BFB80B5F9FC7E2D82DE617D72A2499DF9BC72B40556494B31988928C4C2A7DA24FEA17B7A977C2383901FDF60E266F4D23198A211E9687FE7281B882C77D9E4B83F3F341F563C77A316AFBE0F70ADFE9F7765CFEA6DF7F655F7A8315019F1B416F107677006BABEB08EEBAB1B46E84180D9CE883C37993D8CCE69F5FA7D2EB9D8C49D13B64BA6D7EBF39AF8B2718C7F92FAFE3CAB54BD85A9EC3D4AD09DC5958C7D5339FC260B6E3DCA533B87DE91A96E6B761B3FA31BF38876B97AE2091533039B3882DFD26CE5E3887BFFDF17F61319B30B1B886C599492CDFB909FDE616F3C1FFF893AF3173F31C12E51E1EB6B3F8E0EF9760B1B810DEDD65B17DA84F1FCF45C3F94F6C2F57A6693EB912CBFD49F319D2DC7234EE4E462EE0F6F5EB585F31C24364022A6F783D0164D269220F4BCC46B2D93E44561CC449A1659A2389E6B54B658BC318295EA79DD5A17E1CFBB53C8CAB0EF8FC116493F1A13F06CF45C3E1707EAF941B6D6CAE6E221E23F3A292C087A7AFC04DE48380C30AB32B845D87136E3B91231C21C493698841172C4E1F2A15F5843F9DC76E676BC2909466FE72AD560B15358F6AB50AA5B68FBE561CC65DF179FD705A9D28AA292253B861DAD0212A44D89CDC25B271C0C16349727E3C52B6843BD767A0D664F2AEEF6069630D569D11E55402A323B7E0F20B302E4FB1585562228E918B93D0194C44968843F4BAA1339A21C4457CF9C907CCA6C7191020454516F3B2A335C8B84FA1513B1947F0CAED19D65F765F836B5B8F91B367E0D9710DE35EF258929C9FECDB5CA3F12D1F0EF7D6A8DCFB62FC294952581C40AA07A131FEE8B1FDF6FE77EE3B509FA407F75FDE7BA3F3703C1A4730E0673277441011F0FBA148D277C6BDE4707ED09FCEE522EFF11C0A3985F9D38989045BAF2DDC991EEE09D3B897FDFE2159BB8586FBBBDCD78DF3B6ECADDD3A378ADB33E3F05BF54CC7667008589ABC8A3B0B7AA4430EA69BF30725C88902227E27D3B3D1B6DCD78DF3B690CD54C8DFC17B5F08045FFA9CC5A42463BD7BD02572AB91EBD9386F77CC94A834F4B7781DEE1F3D62EBB9177D4CF9BDE5BC693D5D3CE6813FEEC7D591495897D660989FC1F4A20E77EE2C329DDDD2BC0D3B7627AEFEFB9FB83632874A45C1ECAD51048302B6765C4C4FF7E4710FBBB128822E3FB4AA8A8C1843229984922D0FFDA4A9FC3D7A6B0A776E5DC4A6D98CD3FF3A839830C859230861FE4C38AFADA7932B39264F042202DC81385A6A86C550A3FB5C74FFC06515E0F287B136AF432A19627A3A490820181107FAB8A7396344294DDA54D1EADEC3BD4E0BE56A03FD5EF7C4F94C9B9B3059DD985D33C3A15F82D968E67B6A1C0EE777CBAA3984C5895116B33225C5B1EBF3C3B8B280804F80D96A83D3E964312B699C402A0FD01898D61D37B46683C59FAC562A686AADA10D3CB5DF31995CC8E6F22C66209DD3137296C5FF0B4592A816B2D06D3B8776123CBF1BE73F25912A903167845C2892F77C07732BABB874F63CAE5FBC0AA3D9068FC3C562567AFC111C755B2C06662A9DC55DADC174C96AB98AFA733240E9E0210C2BCB5818198161691957AEDFC182C981CDF5792C2D6D616A6215A3576F22E6B571F981C3E1709E0CE2FC3C22F3EB7EE1D97CD89473E8968A50ED76646DBB48CF8EA2952BA34BE4067AAC1A12D06F9651F5D859FDC75467E7F7A229CA684A12DAD91C6AA1107A6515D5A8C4DAD4FC2E7EBF396F8CBCDD81A3A3C7E866067E71B5988CC8AD1B08DF5E476A7D06A5581E359F15598F80F8ED7194AC3BA8ECEE9071FA4C1F222E6FA01E8BC373F63344C61691D4EF22BB39836AC08566B181CCDA22BFD79C37CA83C31E8396BBCD369B378B7E011D4562736A2BA3A0114FB139B55328408B8548D9C3E65AA6CB2373F0BD560B2D31CA3EAFC6D3ACAE96927058ABB132BFCF1C0E87C3E170381C0E87F3F342F56A6E9B03622A8B6C4A84CD611B7EA614CA48285996AB8EEAEF0A52046B3AF3D04F83EAE99E7CFB68604B6C3321982C0E7DEC69DE02AA03A1F611D4DE82D5098A282AE9A16E8EF6A1C80A8EFA3DB4EA4D06F52129E707F5EBAD0E0A8A82825A45BBDD4486E6A6B9BB8F6E5B83108CA3B537D0B3F89DEE57DBE025326894B2DC3FEF773086474746E1F404E0F13871F1CA08F3CD676380EAE46A1ACAD108A6173610130298BE7EF5995D7159C5F8B201E3E3E308384DE83F7C38F4B1EF1CDC63FE74CB1B2694B383185566A707956CFA846E4ECDE7D9F9E627A631756B94C5633BF6AB2B5534A4C81857F355D4BB643C27C350AB1A6A850CB3D53F3E072D1FF777EACC35A484C11E48420823E40F735D2087C37927F574658F8BE9DBE8BE2EDD03A67905EE93B9F0583747F31D94E967ED7DB415096D298AB65A23FD0CDA34E231A6EBE3F798F36BE8E9EA892CD3AB517D5B686A83E9DB6AB981FF91B86E1AE69E09DD9C84B23481AA202070F92A6A520325EB32D3EF1569CE995B37F8FDE5FC22D0F14B73CA1C560771205A852614139163BD1E48261B64DD2654971B05871DB578045A30C4EAC93A1D54A783D41348D90065DB81826913D2C222A9EB41D162E4F797C3E170381C0E87F34E43E3FBF85DDCE68CF3F69253F77167720C89848894244067B14237BB8C90D785D97533FA8D816DA5C71FC5E153FD45462EA1DAA8428C26214912944C8A1DA73963824FF7DEA47401A15D172C3BBBFF51BC0A0EE787A0317EA4640C72451BFAD3E9D75698BFFD7B7F3F87FEDE60BF6D556718C60ACC2A653C787C9FCCCF41D4EB0554EB7B2F8DE13099BF77B636990EEEB81D87C3E1707E7979787FBFC3EF23E78DE27548306CCE43AD69C3FC7437BF3C8780DB8ED1591D0E8A12AB37716711DDDA40364EA63250551551BF13929C45A53C9093A9FDCFB533A7867D47A3719E878EF3CBE9EA9ECB4F771CCBDA64F5E1615F3B71EC651DDFABD76B51318B6880FB32737E3B7B6B7BCDE62BE58B1F536E36F7F8B3E0FCAC7B6B515126F243092951C4DE9E86725985CF496DE71F6367DB0AA3D9859A56831CF4B39CCF29298A6222068F8FE6F312118F8B27CAD5BD3EDB873B2E5B36174F946389221A9AC66DD939AF84E6E228150B4FF7D67A70B95CF0F9BC6C6F6D7EDD867EAB30B05FB7B9867B64A97481C5B2DCAB5550A93759BCE16AB1CCC6B0E0F1616543CFF6D4685E1A3A861532865344363ECE49C77C3A9E2BEFB5E818760ECBDB1B0B27CAF1E860FF99DBB273389CDFAA0DFCA19A4123AD0E8F55A222CA4E3314A70FAAD5897B351505978056A58DAC498FBC6E119A34D8AF3820F36D3DE046CE606076C5D48EB3217891376E92B60654A309A4682E3052AEC4151CE41228FBC3C8DADDAC1E7F069C9F8306910DA8FD70757730A614571A8EBFFC1F48645C5ACE4CC3FBD91FE13A7B19A9F94998FFF83E1CFFBC0071E4D2C0D658ADC277FD36B2C62D689141ECAA9D2F2E439C5982F7CC972839AD486EAEB27225ADA0625881BCAAC3D67F7F88D4F232BFFF1C0EE777055D57F1FBC079977DF0E9FE16BF179C7799E7F50C1C0EE785FD8DA7799A5F4553DBC7B78F4EEAA4796E66CE4FA5D93EC4F8E51B3873E53602DBABB87E6D8C1D2F961BF0B88288077721A71444C5349AD50A94441CD1700C77BBF758EC9E72B34DFA38C28D2B1EFCED732FB69645BCFFA70DE80D0AC66F882C265030571E9EC31510E0B5CC0DF639CA1AD2620C49310F4D2B23108B0F63F970383F169AAF3E2BC5111122A834F7B03633C8277EF4E85B4834DF80AAE0E0E000B22CA3D56AB11850794561F1D28EC770E7F01102FE0AA49486C3768FB4AB92E37DECE8F22C5F9254D486E7B0EC262147067616BDC31ED3E5958A7572BE23148BC5615E240EE74DA3BAFCA8FC80CD4FA7DC64B17D1E1D725B61CE9BD5C73DE877D0083FDB9BC839BDC898ED285A2CD82F9079B82243D69951F2ECA2EA75B2D82887C5C17C49F56A59C72EEAE13054D30AD3D351DD5CD9EF4333163BA1B3A3754BBBBBA84412500C7A6477ECA43F17CB6FB02F4BC8DADCFC99705E8B826B175AAE815E75105FB5994C417107E0B93287C3B4079DA81B7531CEF272D4C504C4A54D949DCEA76D43B85BCBC07FF626A4C525A45797D1AD6411BEB988F8D86D56E79BFD7D14437154FD640C47E3B07D7619B9CD4544A696500C6651F3ACB37E7376077F1E9CD7E2C1E111B3733FCE1D436303D2D87E7522BFD27995CA0C956014F77B3D56A63965EE3DF5DDA0759B89C4301EE05D596479643AA5E2306FD7BD4E9F7D5E0904D14AC9B8DFEDA2E872A111F40CF3D2B4E40CCBF7C59F07E77564099A47AEFB5C7CCB3219AF346F51231221B2848A03325E69AE233A46B568908DC7074FF3DDD3F14C8F1F8F599AEBA8110C0C73D9D13AF7C96FA4118FB2FE680E3B5A8FCACAF4D87E46463D26B2BC761541444B14595BFE6C383F850A91494B2189ACBD06E3722F9D42C2EC26F2C16D3C6A67F0A821A1168BA2576FA0295159620325E7603D577087502FA4B0FBF97964D617915C9C23633E8FC4CCC230BE25958DEFB53448EB2622379859EC4C7A4C6B6848CE8FA34EE65F9AD7AE4CCE219236E94D137F2E9C9F361757F7982C711CDFB21C4AA04064D3BCD38392C38AF4FC0C0AA44C65893C598B295627F653031B0BBA3EAB048350F406E4C91AB019F2216B71A1E2090DE35BD279386D3042B56EA260B1B2D89977E52419ABABA806FC6890B55FD941C6703882D4EC345A558D3F17CE8FA6DF19C81247ED7D7E3F38EF248F1E3F413B2D9279D63FF45F16D736B13B3A8BEDFFFA33F6D34174D32E8446A790DD3621B3B104D3871FA3EA18CCB169DD0EE21B26383FFC80DF4FCEAF67F393C8E0C1C3876C8F96EDF93A7C646C6E21A9B321AF5F86347613B27E9BC912A9C50522D7EA51F7EFB2BAD5580AAA7B17B1A5557E2F391C0EE735F7D60E1A45A876E7F058D66A46F8CE26763E3E859A37809644D65A641E8E2CADA3E132A0E070A3191BF817D5D279D42505B6BFBE8F9C4B4037E543646C0ACAC62ABCA73F81EBF3CFF1A0DF1DEE2773386F82D26E08875A97C81203DD70784607E1CA0528DB6614637996DBA89194A1FA0424E7D691B5D8D15533833D0CAF807AD0879CCD8F9A5AC2A1E8474588A1198FA064B390E36E3CEE77D029F25C481C0E87C3E170381C0E87C3E1705EF0C7E81F4227AF60595CC28E2AC096D984A5B00B7F258035711E4245C042D208535A87CF764E632172F9447B43D689A9C0046C59239C793BB29A884DD24EED56E0527428768A70E5DD7017B86D30E7CDA0DDEFC39D5D81A7E841BDD78650F542BE5B464A4B432CBB513BA8A1D92DC356F2C3AFBA51BE2BB3769E520CEEBC01622B077D6C03D1860BE6820BED5E19A2EA80D269A0AC25585D971A80DA967031B8C2EF3987C3E170381C0E87C3E1BC617F3A0EE75DF7A7E370DE5DDF7C9E039CC3FDE9389CB7C19F4E3204D18E9859597145905C9A82FFEA1874FFEF1FE0F9FA2CB6DEFB18C6FFFD1F56A66DEAD9360C7FFAFFB0FBF969D43DDBF07CF54F486B66A497E758F9FE4197F5254CCE439A5E62C763F3EBD8FAE09FB0BFFF1E22B3CB508DDC9789F3F3F9D3D1FCB6BD5C7EE057DF7F88035541435290B7DA21CDCEB372B75261E5E3715FF404D12964D156B268C452E8359B680A7E563E6A0F6274B7D51AEEB55AEC78A7A6216FD862651A8F8DDAD9F367C1E1707EAF7B6B2FC6BDAC7A03489B1C286C9BD04C485077067285BA1B44C56383F7E23996738EF9317976A17A23AC6E7A7D9DF9DED1E3C3589706033AC5122A6E3B946D3B9A290565A715C5401C658F07AD880B5A461DB67B91FD4408399B17AD741A05F32664A395CCF539D66F359244DEE161FD3CEE0DE6FA822F827BCD068B7DA51535F42A85411CACB8328CAF45DF339D5486C5E7ECD46AA8F83DECFB77F7F6D108FA58BF259FC07CA8523A33F6730A3B4EFBD85712106717B197E47978DE265E8C7B199DDD84FBABAF209B0C2858EC90D706B63A79222F6496D791DFF5A0B4637FDA3684FC9689D50D5DBF898ADDC28E1FC7BA2C077CEC7F1AD792D22C3411BF7911B2CD8FBC7103B19169A4D69786B2048DB5D6120765BAD6AC067761FEE81314AD4644C61710999840470AB27ECB8128941D1784D1597CBB3FF0392DBABD2891DF20B335BA7C0B8DC0C05EAEA43CDB37A463B8E1F523437E77FBED878890DFA4962BA01C8C216F32A2128E408B87D87D69AB1552CFC28E97943AEEE70516074971C7F0B899E0E3E7ADDB5B1BC4BDEC140A4C5E3D9E6B0FCA15F6B7577F39F70C1D73FDA739C79FFFFC38D6258D714973845299BAF51DB1008FBE23070793C5C9B97BE5977DA269BFAF6AD36DB687F237ABF7743DF998FDFFF0B9F687B8DF197C568B449EDE871E8BF349FBA0B111E97DB9DFEFB3589EF438EDE3016943EFCD37CDBD13FD71DE2E3DDDF19866E3993CAF8E22B1789534B65A3D1064B12EE933A5655A8F8ED13219AF079A866F8F0E592CD7A1FEC4656772454AB789E88D11C4E70D6827FC68E5CAB89BCDB2F9979E83FBEE737E4E3D5DCA1187E6D91CF8DE8B05F2AE9F43707C198E4F3E86FFC2D7309FFA376C7FFF1B2B1FF7514F3C930FB3A61DDCCB0EC6B1F5932F9137AC216336C073E13C5C9F7D8CC8B55BC8594C48AD6E2072E53A91A397999CCD9F05E7B5E7E217E25ED279F99BFADE4BF55A643DD64A159EFBBF309CAF6BA1676BB2AC2B48D658AD1F7FFE469D3F07CE2FCA717C770EE76DD5D3456F2FC1F0FE2710E7C6111B99447864100B3B30B184D4D404A46D3B0E73039FA4C0E824849BD3ACAEF1FFFC0125AB71B8B796D95C427C7A8AEDADC96B0B88CC2C4071F81038F3398253AB888F8F42BC791959B365B8B7F6FCBE04DB0B591D657AC1D4FC2CD3F9ED9C3ACDF6B968BFD2CA1684997508E3F378D41059FDD88A9EBC1304B6CEB45F1C475BD819CCF50FC9DAF1A887D8F86DF48F8E70578CA3BCBB8B725482B4BA8CC8F43AF63331762F22733A24D7D62093E3698F4CBED3066257CFA01CC9E2DBDE1E1F37EF809E4E5A5D87A4331039F9386EF6163BDE888B6C0DBF5FC8B1F518DB33F60883BDD3609494BD6C0DCFE40CB58AF0D402AA6181ADF96ABE5D14C8F8A57B0D74CD4FD77174DFB51923BF1FB7FB957ABA7BA42E8D91955E9CC33DADC9747E9A2CB3F51FED97FE4E5AE4FFB2CB35DC4351BD64BD190F0FF482E51A5A6971D85F4791C935B8A0E54A2818F5E834DAA47D01F2D202F9ED64D0CB24D9BD68974B283B2CECB8566BB2E3E9E525340B64CDDAABF231C3E170DEB89EAEB7D7C393C74F7324658A64FE1590D15B915824EFD69555A637CB5B6DAC4CE50F9AAB80EAD0AA1109AD04D5D9E9D12ED45071DBD8715A569D36325787A14931326FEEB0BA54C756F5F19C749CFF9C17E35E16634406D4AD0CF50C6D290EC5E545E0D25504CE5F42C1E327F2B38B95E918A632756AD580F4E6069A91106CA72FA2E830B3B897F4B8BAEB62651A2FB353CA4121C7EAA2C0EA563D66FE0C381C0ED7D37D9F9EAEDC646B289687CEEF1AE4E112443C3A3AC47DADC5F611684E3A9A3FF1D8A686EA98A9BE9ADA551649F9C9E32336576B5206DD4A99ADFBA88D265D1B323D0A590F1ED0BC7664BD588F4487E7A3F69B74FDC7DE07E49A54879DE9FAFAFB6DD62FD5F5D19C8DB44CF73EA84E9AE691A67D1FEF6DF4DA87AC4CEB52BD33BDCE8ADF8FEED37D15CE6FD3E6470948A85BD6066B7BED90C8B406D8BEBC08C7C71F2174FD22B33F0B8D2E42DE5847687C12D2FC02C2AB7ADCCF0F7473CE7F7CC9E4E9633B9FE3F3A4360CD80BEC42D95C61B9C22A9E81DD10CDAD5BF20490DAB4A01870B1DCBAD41E87C935F667B286EBABCB884EDF8162B2C3FCD147A844E3839C60011FBBCE4E4A60E556658FC92B6C7FE469B94CE4EE9C75975DA7F75F5F203136CA9FFD6FD8E6E7D8FEE5A7F441E7C9E37998D9F10CED7C7E78BEA37339CB912B49CC8E92DA58DCEFF407EBC54EF787CFFDD4FEA76CF7301B9DE37DB61F739D1C0E87F336C8C32FE69469970FF0E4686FE84F97A1F9BDE675F05DBA86F8D43476FE711E810BE75899CE959DF61172C64DE44DDBC8DB9C90CC3B90C7AF42989865796994D539F22E7720BBE346391443F4FA797EEF396F9D3F1DCD79DFCE6699EC5074B9583EF13A916DA99FDD3DB2366B4488BCAB3793F77E07D5A7723087C3E1707EDBFE7439B30BF7AAEA331F3A725C9E9F459D7CA7FD6C1A876A86F9D0D5686E3252B71E4BBCD287AE25C5C93D71622F99E26386FBD3FDA2FE74FB95264A0EFB700CDFDF2B92EBB4233E3D4DBED736D4406CE843B74F64A37B99F877FAD0D13DBE72B6C37DE8381CCE2FA2A76B89222A91186A7E2FF38FDCCF0CDEA10D5166F3A5343BFECC0749CCA0DF6A315D592D1422EF5BB2B6CBC8CCA7AE11F4B0F51BEDE3D8F7EEA5FD5AADC6E65EAA37A33A367A8E637D1BB5B7D42491E9F78EFDED9A643D49F57E54DF47F58574BD39B4AD2CD5A0DA5D6CFF579352EC3B1DFB77B23DE85C118FBAAD613B7A8DC3CFE93A95FAB33CE631E77E13FE749B4E78CF5D456C611EA9D939C4264606FB6C0E2FA223E388AC6EA1B4AD1F8CE1A88456324CE4521B2C67A620CF5C80EBE3CF510E4B102E7C09FF95DB88CDCE0F7DEFE898A13A8CA11C635844F0F6342257CF42B8B38ED0D814328B63ACBFFDD201C449D27E6681C8ACBB0359C12FA0ECF2B03295A31B826FD897E60F40F510F9C26241F0D2E9E177A2BE7E9A36F8FDE4ED8E61BB63BF3FFA39EDF720936036D37C4CBCFBFE7465F21C8BD43FEEE9BA8DFAD131F9325778A9EDDD72035A2C7CC257BE2C04D18E892FF8E2155E9A87A98DFB7EB1824E4A7CA55FFEABF46DF5A482C3527668E3DE0C3D1BC3DD52155591CCBF64BDD64CA507E7CD97C97B258E7DF2DB39F6C1AE4723AC1DF5FBEBB7F7D8E7B4DF07BD160E8A3C0EF3BBC64F897B497D2F68EC90EFAB43C7C88B75EAB28A5EE1E75BD3D3F15D765ADEC8FD38EA9DD4B11FC7A7E0BC5BFE7419BD1DFA0FBF60B12C13376E40B55AE1F8F21AC4E94924A726987F5B413FD8AB10266711BC3986ED3FFF1931F219F5BDD3C81C48EDDD92CB4B707FF831DAD53DA6ABA37D349219643696983F9DE7DA28949505482BEBEC1CF185153C6A48439981CAC5F4F7159D5E41D1E664FE74918971944332FCFF3E878C4722F2C006F3A74B2D111984407DF68E63A424371D08DC1A1DC4D69CDF20B27B0C3B7FF91019870F9DA88DF900C6C766A16CCD0FEF4791CCCDED5A079AE046DEA4E33E74EFA89EAE1A4BA160D9623AB60747476CBDD522EB23BAB6A27695544F773C4E4A1E01AACD8A328D7B59AB31DFBBC2B661603B9F8EA3E470A14B8ED3759E964A31FD1E3D4EE774BAAE2ABB02386836D939DAA50A915F3B2F5D5F8EC8E165B2BEA4FE74D55894C918748C778A45F25B29327F3A2ACBD0FEA8CFDEF16FB1119350152283389B4446E8E6B2CCCEB39D5570AF51643E80C73AC4E1BD48A6D0696828DB76905E5AE13E741C0EE757D1D35582647DEF0EB2B8900D322FDD25B246D6E646531451F5BAC89ADECBF463540F47F571FC3E72DE363D1DD5BD658D1B4CAFD6AEF650F13890B33BA05877510C66115BDA4681C80FC9A9B91FB4D7E5707E0D1B784DCE414B44A0121997CAA75A2CC4ECD2A80E98EA31A82CDA4C886CAF8DEA28F83DE4BC6D7A3A0EE75DD7D37138EFAE9E8EEF837238DFA9E32332774E16DF48BFCA3B9053492D37D16E7279ED97D2D3896B9B705DBA05D3479FA2EED0A115B2C0F1D539D83FFE14C1B39FC1F9D57918FFF81E7CA73FC2EEB50954424EC4A746D83E1BB521A77DACCC2D43BFB985A5D1DB0806056C1379E5FA9757D16DE6D9B3F47904EC1F1DA1D72C626261036EA71397AF8C62626E0911B713C55211EB7A073EFBD7194CDD1A85CDEAC7FCE21CCE9EBB0497CB83C999452C6E3960589EC7EAC21C8CDB6638AD465CBC3D83C0B6839DE3CEE81D5CBF7411CBCB73F8E0F3EBD8B498210B412CAE6FA15454314BFA95952CC6C666F0DFFFF5476C596D98B9798E5C9B1FC9629795FFF6F979FCE5A37FB1EF72656C112BEBAB589C99C4B54BE7A1D51456D721357167760A7FFDE40B788C462CCFCC638A5C47AD5CC13C39C721F99E46BB80B1D149E8162771E3CC57B835710747877C5FF24DE9E9B20E1F8B2921DC5E462B97813476931D2BEF0AC8AC6DA040C650E0CA2412CBCB4C47A7063D888F8C91B11C1CEE53B8DC014829097E9B01C188082114823F1024CFF3311B5FFD874F50CBA791CDA491CB66118A4A6CDCD2B93A9B1DC44E29946B90A22178DC1E66C3EEF5041008C551ABD51025E74CA60B087B03C8C8320A05156AB18842AE301C1B214144269785A24808917AF4BCF47CAB4617DCA6554842006A4D43399540201845B37D88AC1841B1DC42AFA7B1B2A4A8649E97D875C934264BB9000FA99BC996A0927E695D7F2285F5F5756C19CCD85A5CC5C8F802764C1668FD87109D839C36CD7A1342248272B38D1DDD1ACE5D9F424D55F9F8E37038AFD4D37138EF1ACFE25E4AFC7E70381CCE5BA0A7A37AE5463CC672CEDD3FECB1F894D4E692E54C6C37507405D8E734B7CCF3363F34B624F5B7A33A699A5FFC38F7CC63E63737F0633BAE4B8F250231289904DB77EA90B560549471E1F2385B7BD1F55DB55A676BB956A3CED682AD46056A55C361AFC7CA747DD43AE8E2FCE75F90755D8EF425C31B12C8FAAEC2FAB07B82482444B6F7B66A7223158931DB0E3FB98EAC22C3457D009B4DB63E74F905B63694C8F5D8ED1E7449BF52348820B917A29864D74CFBD01B8DB879FE1AEBA39C93D975D27521FD1EF4FA1585AC213329D2871D6DB2F6BCBFC7ED367F0D3D5D2D1645AFDE40534AA0ECF7E15E4B43F8F63A64C32CA2D3B32890672CCE2F22B3B678C267A82EC4A0BA7611236BF37C38834E74308695DD348491AB6808028ECA03DFF67B0F9F60E7FA0ACC3A0326EE2C22168DE2F2B55B387FE11A9C663D1B1BC5660F8F8FF6E1F7F860738671E9F2555CB97009E7BF38CFCAB41F7F58C2850B5771676E0626A30D0BAB3457ADC03E5B5F9CC1D51B0B10ECCB985FD123EEB042207DC9619AF7B40DBFD9841D9B0FF31B06BCF787F748DB5598367438F5E575CC8C4D627EF42AA6968DB06F2DA2914BB03ECEDE1AC3E8B92B48EDB8591F6C2F92F4B7BE6A60D73F333E892FAFDE26E718E4EB53DDDC3FEF57B1F9515466E37E6CF3C3624E91798ACEC3D4969DFA68540201F6FFF3366B34A66443F090E31E6829E9A518BF749E3EDE3F667278E58775DBDD6E87EDC33DECFF3C7BA9B43F89FA4693EFBBFF23FCAF9E6FF7FCFFC77DB0DF7CEDE5EF214903DFAB1F13B793F3EEEB589A42E8173D27F5E5A03979DF44DF54B6BAFB06F4919CEF97875F8C7B99739079345F4366630379AB01AAD38D8C4E4FE46419398309CA9605C2ED5124EF8C9D9087D3262B91339CC82CAE603F4BE45C9B11A9C5457489CC5930EB87CF981E0F4FADC1F23F7F64B131934B2BA87AED2C9EA6387E0B073515DB9F9EC7615A40C5B589947E9B5C8303A9A55956A7EE1EC4CE52885C9E5F1FF8C2153CE4BD6073B2BAE11BD758BFD2BA1EB96D1B8BCF99F3C5D9BB25BEB88692D7839634D84B6C24B3E43B6DB07E8FE3732636AD888D4E42B5989031D987B12D723EF26E49F958BFE1DB63A813793F3EBF86865C40E4EA1956A6EF19EAD377FC5E4AAF2C90B54366706DE4FA8FEF95EFC618BC57AFA1E132B098A2C1915B4893F3D373D45244A6365A90DF984723E8E7E3F435F474AA4F80F7E61D1488FC2893E7A25A8C481BAD884C4C435AD5A1E809419C5D637ABAFBFB7B4379E258BF97D4D990D72FB3FC74341FDC717E3A264F3CCD5BD78C0E720A5039A51A4F3D8DA1ADA053C8B25C04B4FC4D5B43513FCBFCECA83F1CF5A76B2412435FBE4EAD4BE495817CDD904AECF746EBD23829AC5F31C5FCEC687C4EEAEBF7E8A80F716E918C5F61985FEF60AFC7748F8DC433DF3AFA3BA36BD3633F3C7A3D4CC6AAB559AE3ADAAFEA0BB36BA67E86D44F8FC65939F639A4F2169DE7E93B66F7E208DAA938E94366D77F7CEDF45E55FC21969F8F7ED7D4F21AFBEED4CFF041BFCF7C04697E079E7381C3F97DEAE91AB9228BDF9335E951B01A598E012A3F34623116FF51B6BAA0E8B6D022F3CBF3B2443353404749B33852C77E79B44C63FB54BD5E7EBF39BF983F5D2D1046C6E145ECD604910582C8AC2E23BBE3623224F5B1ABECFAE1BF710BD189C513FE74CFC79C6C642A707DFEC1306ECAF3B961381C0E87F3D3FCE9581C608F67182392EEFFD2BDE117F57434B6248D3142E349F6F634B62EA2BABEEED33C7354AEA0F9E21AB128C237C6212D6EA29DE0EB6ECE2FE34F179C37E2D15E8EE9EEA81E2F6B71BFA4A74B196C2C46A6F3CC08548713D9D59B2CA624D3E13DFD5B4B1710BF3D0DFFCD2BD0FFFD6B44AEDDE2CF80F333FAD37DB76E3FEFF4226B30226FD0B3FC88AD5C098AC984274727755D34466657CDE19BA32778B45F472D1461F2308D2DC9EF35E74DF053E25E7238EF8A3F1D87F3EEEAE932FC7E70381C0E87C3E170381C0E87C3E17038AFE0FF07AA368A58 +SmallImageOriginalSize=63600 +SmallImageWidth=106 +SmallImageHeight=150 +SmallImage=78DAED5DF9571ADB96FEFEFCEEB57AADEEF57AF57DAFDFCD1C13A3A2820A32292A088A223243311473310FC53C687A9FA3108DC9BD79B763A2F1FCF02DA8AA5345728EBBF6DEDF1ECEC78F1FF15140404040404040E01E91559A78F9CFDF60DD3F80F7CC8BC5954504CEDC701E9F42BFB282B5F52D9C389DD8B3ED615DB741D77C301AF478FBE60D3674EB383F76C2797482442C012919472212E5CFDDD9DDE1184D2E60D46E62C76CC386D688D363078AF98298FBBF805EAF87C9C547B4DB6D3ABEC098E6763499A0DF51F9F5D168341FDB68B6D16AD4E7C7FD7E9FC64F309D4EE9F81293C9F8D6B3D93A959502F2852272B93C6AD50A2E3E1B23F0E798D0FC2613492412099C7ABC909309C45332E2B138A6E311F61C2E4C875D48E1087C1EDF1CA79E73749B1531873F08D38B4B8C06FDF9B1DAE962341C5CCBC7A771B56A0D25A53847ADAC88F91310107894C8292D2CBC7C06DD860106D3365E7D58C6FB37AFF0FAC50BFCFE8FDF31E9B7E0231B6F6B6B0B6F17D7F0FCB7BF61309EA254C843CE2964E78560739C6053B38E83833D6C1BB661B1DA60D0AD422995E81D59829C4E8BB9FE9E36C5C5476EEF7DB2ED3AF8783146AD56BF35EEE2F2232E2F6EEBAFD1687CEB5E86C160C021E65640E0C7A321377131BE2DA7C3CE189DA22AE6E7339C9E9EC3E170E2E3E504B97C8EEB97445CE2FE95E73C847C268D949C423C1A23BF35C77DDE502CC1B907252723104D224FE7D9B32C562B5EBC7C457ACF8C558D160BEF57707E6C473DDD84B41941743381DC710185A32CFCCB615C92FF2B999290B6A3F41947783D0AE5248DF1708AC2A98288368C9317E7C8DA9348EDCA48D05839957A92EB341C0EC987EA61D8EF729E811DDFBCDEED76FFF0FE764BBDC3498CC7E3CF6464846EA58326C94F536EA05BEDA19569F26BAD6C1B1D452574A012068D1EC683291FDB29B4D1CEABE896BB840E6A12E9CD8B8B27C3EFBD7DF93BE7F77C9CDF5B42C47FC6F93DE3FA3AC9C302E7F71C7607E7F7C2FE2076484E66FC5EC0E3C6BEDD35E7F7D2F1C42D7E6F3CBD247BD00D9BC584738F0715B201C57BEBAFA1D56A715BAFC9F9BD2906C311E7F73ACDE69CDF9BC948B55A47B5F48947EDA81D6ED3CDF8BDCFED3BB64E957219C14018D54A99731D62CE05BF27F83DC1EFFD68A4E349310F8F00DD4E47CCC323C0E1C919AC463D76F71CFCF824188549BB0993D54E3ABF04857CA6A3D333B8EC4790D357FE49219F472814A17387E44F45B91FD5E9F591CB6460B73A908C87C4DC7E6754ABD5DB3CDC6882C968487ECE954E9AE9A636D981733D767D8ED973B3F38CE7BBA0F3C3FE90ECC19198DBEF884B6613908FC3D0EF8DC8C7DF80EFED3BF8DEBF452D1A452914436AEF0029DB1E32870E2448A67287FBB8A47568E7F2FC1931930939871D35B980AC7D0F89433772761B5A721C65BA3FBD67231BB18F0CF95C1764EF87575791241F2B4D7E587C7393EED9473D9941DC68412B9DA0DF8CA078E6A1E7DA70F6F225A29B26A4F7AD50FCBE27BD5617E309C7947C1BB550402B9B41877C9C7EBD8A516F806EB54CE70AA8D35AAA45058D6492C67F9297E9788C21F95AE3C188EE2BA199A6FB1505C366E3D6EF749432E7D0DBF4CE54E97B83EC7D3597418F6CC79BE3FACD36FD460AC35693D64F465729402D55D0A9D4846C0908087C1724E322BEFA18D0E9741FC6BFA3DC239D34B8132B6EC4EB629D3E834A369FD16247352BF163252D2193CD71BEEFD0E142A95840241C463A9DE6E78BF91C2A8D360C0603CF8DA892AEF7923FC6EE75B88EB1B8B206DBAE15BAD5151E7F5AD76E739B2FB41641C19D45315C45C19543F63843F6610399E31C218FD4BE8CC4AE8CD48EC4638535A981A4354936608ACE910D69CFA022D51076C570391D3EC9B56A77FBA857AEF8BAD667365B9D6CB1CBE9F80EDF37CFA5ED0F502915EFE4D7DE92115AA792BF4CB65C1D95580D9D824AB65F1DA3CE10ADBCCAE3482C96DBA0EBEC3CBBA71CAAA014A8A09969F1185525584695E48CC9E0535CA352B589E7FFFB1C478E03ECEED861DED643BBAEC596560BA3D9069BC5088BC908C3961E8B4B1A984D3BD8D01BA12579D1AEE910F6BAE93E17E2319FC82BBA67B01CF12EE3144657EF930EC943BBD1FCA6FB3EC570051F21F872C1970B3CD0771CD952ABAB6BD8DED8847DDF01ABD541F69905876E0FAC2633DEAFADC3B6B18143B2DD56973F20E20F627F7F0F9A650D165775B06EE9701E8820120A92BD2721992D6040B607CB39623660BB5181C5B88B98DF8F03BB0326BD89E72C89B9FF0B3945B456FD6E87C725D46BFB8EF3E0ED0EE7E36EE64334EA75C8B27C271F62C695B35C8A8F97B76DC1949C45564EF2787E92DEB12227F62F70B034BF2CBEC4FCA3E3E35344492E52A9141DA7C826AFC3EDF5739938390FC37370308F3F09FC1CFBEE533ED005D96B8D3BFE51A95C239F56D8D9020202BF0632725ECCC323C043B1BF045F2EF872C1970BBEFC67F1E5AF5EBCE67CF9C1BE134BEFDEC26234C268D8FE53BE7C7343CFF9F293633FE46444F0E5F7AD27D40EE7CB87BDEEF5DAD551FF86FA1776DF550E6689745E57CCA5E0CB055F2EF064F9F2136F04877B16EC58AC822BFF7F60446B351E0D385FDE21D962B5D0AC16B7DBEBCFF9F2B92DD86ED35C2BD739E68C0B6CF2B133BE7CF285DE5F2C7FBD566FF0FE6D13D11BECAFF9B8B4469A552DF424336F5F2F906DB783FFF9DB7FF1738BEF17100AA778CDBBC9E6C02A1D5F4E47E44315B93F1522F909FAC364D765110AF839BF3EEBC9128E2660B6EE2074E216F37C4FF5EDB77C1FF2A566E76675EA77C7DCB5ED588D7C83D7815C8879FD4EF51A0D3943BE63067DB58F886E0B19F29DE22603F9FC4E9C2F6A513875216EDC45DAB10779FF10E1A50F57F13FAB0D09B30553F25BCBC1008DB723B4B68538E9A59CFB04E9C3435ED721E6F9FB60CC7A505EC7A03AA4E79540087549422B93453516433D2EF1FA8D523084563A03C5E7C7C7E98D7A0DB64E645F546371D49349D424BA271147392C61D8117E948080C0C342BD3FC6CA9BB770398FF1FAF56B18C9DE5B5F5FC3F2871584BC27F0BA9D90E91D96A4F75D8EC0EE61BD232C7A13F61C0E844E7D482565B2EF64D13FE247F850E423B1DEC9F54AF91657F7A5DE11B96C1609298E88948044F6378B7188BE2AF7CC198D2EA15B5D854EA381C3EE86D9A4C7C29B57306E5BE1DCB743B3A2C101D9713A9D1E6F9FFD133BB603580C1BD8DCDCC22A5D336EE91149A6B1F161091E7F0439392BE4EA9EF38DAEFA955FC58B98FF33198DBEE93EC647B0F16AAB29E6F31EE5C9BCA983D3E9C6FFFEFD19DCE4F7E8D6757091AF6427D9595F5B83DB79C8F9BDC5D76FA028799C9E9CF2FE1151B2C32B952A8AC5268E1CFB38A131FA4D3D8E0F8F90CE159F6C9CF53EE34D330E8FE5B3B2FEFC2CFEA4E459DFC3C6AD7CD8592EC54D9DD526FF382DA79091D3888643500A4531AFF7204F7A9D8EEB2797EB0CFAAD4D386D669CF9C364EF79113C0F8AB8EC0392A759EEF8EC5CA55AE7F9CCCD7A55CCD12FA29F9A8311760C661C907DE8B21F08DDF440F55397D6A990CB231597A014451FBE87C247B85C2EF84E7D8849291C381C48925CF942125DCF0BDFE901F111D94C96F7210D84C2B4560924E2094831E94EDD93C0FDF60B3B213D155ED320B9778890661529DB2E26832E64C711826B7A789E3D476AD704D9B60749BF25E6F147D5AA7DD62F8CF5F06A1714DE1B4C65BDBDE81CEBDD3568A9E891BC0DDA2C7F35857EB5826656D4100808083C3EFCF5FEB0615CD077BFF7F4ABFD6153E91C5D93919665C4A251E4E40C8A746F4E4EF33A0FBFD7CD6B3C4E4FCE85CFF52728146FEF8BDAED0D782F965E7F7CCB57627DCAE73911ACB6FDDA976AD52BF35A2596C3A736D4797EF988FC3136F6668F59F6BDD56CDEAAF118F4444EEE37E71B91BD175E5E4778438F8AFF1455F25B7B4A1A79CF3932CE43C4B70DC81D1F236E3441325AC4FCFDA47C2366EF55A231542542248252308C7EBD06B55C418BDE6BE56004957098E71B351292983B01816FE1921A2DD4AB82FF79507CD1E402BBE65DCEEF2DAFEAB06BB4C2E7712091CA924D96E0B61ECB1FF79EF9F8FE28B3FD6A8EE853C4A57E0EBFC7ED38B2D964B29967F2C46DB58B4BB2E326B76B786FEC0D20F063E549B3A6837DF70061B2F5D2D92297A77CB184A824DDD9FF89EDCF25E4E9E7C8139325167F9262319495DB390E9F73E6377B8609FC7C79627C028B3F65B279440201E4D3328D75713E81ED37C86A7BD97E35F1700CC1600C4A2E0BDF991F857C11E1401871D273C9B82C64EF1EE4A95651E6F1DB2FF109A55269CE27B0DA5EB6971AE314D4667DFED96CAB9C632857EA0FA63FFA2FC347F447886C1820EFED73DE217B7880E8C626D46C1AB5640AA54008A3569373118C9B5048BE926613F779A37A0B2A01AF98D31FC44754A5386A5292F30E155A87722884714785AA5450A673D37E0F8D145B37194D7A0756437ED43379D4E91E5511B911DFB75F842CEA311F43EDF460F45DD689D5BB8B3A8DFB03AB5F5F59D6C26AB56244EFBA6830082912433C9E40A950205B4DE1BD04BCFE0C16DEFBA1D54661B3C671761CC591CB8D558D86DF3BA475924261B2F7520849090C9A621FADFBA8699FD7AF93ADC7F886CB6BBBAF45BE6DEF337E6F34B944C11FC1A0DBB975EFCCB7127D21BE3F9A3985D746737FD5E941727B13152946369E1B45B2E9323B6634F32548DB4644360D4893FD97B21D70BB8FC53C2AE407877566C43656913F72A31AF6D1F362626EEF43A6BA3DAEA3EA099920A11C0CA15B61FDEDF268A612747D805A9C6C3F5A937636476392DCEE6B660B640B8668AD0B28078268D158B61FA19A2B88797D40F2C4E2882C678FC574155AA784D98C94FD0829F3160A676131BF0F449EBA951AF9BB01EE6731FF89EDDD5A4BA6C9CF0A63705D8F28F0E3E489F9B5F2810BEDA2E8EFF590E569329A903C25C9969B88F9FA89F2C47AE0B0EF119D01FE853748EDED2166342362302367DF815A5591DCB141DAD2D17B2E08DFE232CE9EBF40A72878EF1F9D53CEE489E58E731FE82BFECF50ED088E494040E0D1431FB3C29D716033B205736207412500436C076F3D6F71289B319E8E11ADC9D0FA97A1096E20AA9C43AA44D01E34609176D019881C961F81F6A08DD18DFE798DFE559D7B6778C5DDB5061DB4FAE427A90A26B466B55E8D633626DBCC887914101078B47C84C063F09FC43C3C163E42F19EF3F86064630B27CFDE21B8A685FBEFBF217B684723ABC0FBEA35EFA92CDB6C88D0B571574572F70029AB05819575F8DFBD836C358979BD673EE2A65C8D7B7D8ED9F73FCD53EA0D0457F103F413ABD36471D984710B91752DD4460F71830E49A39E8F495A6DF0BD5B44B798E3F97BC5330FAF5FAB46428892FC313059CB1E3A301E8C78ACBEDB1A22B6A943684583D0EA1A32FB3B483B8F115BD7F0DFCE9F9C61DCEF42DEDFC3B0D39BC7818BE7515483E748EFDB793C25637741A1DFCB9F789173B9508D459075BAA0E6734F922F6771D9494FC5B0AD62329E623AE85F5F1FA0572E62749DCBCAE21C1DA5807EA3C9714BAE069F646FA0F6D0BD91C7379DDC96B7598E1FEB41C13E67CFEA365AF4BD817EBD0AB554413B9FC75055F9672B23F371ECFBA8D77B92F65E391098EBA7B3571F10DED8E4FA297FECE432D2CD275097B3BCBF47DCB287A4DD89A3FFF8379CFEE31FA4A3AC737912EFA9FB95A749FF532F002653C3EBBF73F6C9F263A7F4F7DB6F7748177DBD1EFDA63C09FC7AFA897356E93CD7516CCF875A4C42C6E946E1C403C51F4286F452E9EC94F49313AD6CF649CBD3CFD64FCCAE544B75DE2BA9576FA295CB61D46ED2B8321A729ADEB725D24BF4EFE8759F341FF147FA49AD7770BEF01EB18D0D5EA3117CFF1EE78B1A4457DF731FCABFB000C9A017EFA807E23FB15C8961F35FDF13BA5F6F88B9FE8E7C04FB647AE6E0DFFF86884E8BE8960171A31981C54594BC67908FCE9073EC937EF2F25E8871B389EFFDC43ED99EC5B26D17D1B55514E85905D261B5481095781A67CF9F23B0B482D48E1539FB1EE4BD0328BE739E77311C4E913059E9772C387DFE1215DF99589B6F94A72F730EFD799EC450FD727C90E558B43219748A794C47638E3BB51DE331FACDF617EDC66FE13E9E3A5FFE87FAA9D64244AB839F6CBEB357AFE0FAED77C40C46C816D257068398CB07E23F097FE969FB4F23F29FF2C757FB80561319242C36FEECAFF94F8CDB13FED3CFF19FDAF9C25C3735B3390C1AF5AFFA4FECF79E12AFF7AFC853A7DA46D17382F08705D25906D25F9B2413AB086C98306D57D0CE5DF5EF55CE7D086B961158D142DEB5704E3BBABE864632CE79C17626CD39EFCBC98064A2809CEB08A9FD3DD49369BE4725AB1F28052328B88F91F74551F21C43F178C47BEF1BE589C9018B21303BAD57AB91AD7665EBF13137FEB61B72EE8E5D37F79FAE79C14EB586E970C06587710B83768BD7D7CF6493C537D442116AA9846EA97CA79651F84F1F21994807BD7EC9FDA1E09A01E1352D249D068D741112F3A196964807EDA1EC3F417C9BFCA0D33344751B50CEDC5C3F315F28457E51CEBE3BD751B5788AEEDD21DF488FACDB8BFC911D71D3361FCF72D5B97DA9DFE572C8FCA788560BC5ED42D26CE672D82A3448F69228F903BC3782F09F2E4827D4E99D34F9824D37E29C1BAFCD253998D0318BB97F496EEEFA4A538CC8D7E2BAE962726B2C8B297DF99EDBCF1BB4BBE856CA73F97EEAFE13E31D58CD6DCEE944E6E41C79D20D29FABB667536FD9A78FF3C14FDD4486779EF57C627B077612395412512235B5CF4F917F97B02FF9A3C8979782CF294729C20B6A941291CE6FC817CE844687189D7B3339FA69508735BC045BACBB0B60687DD8167FF7CC6FBB564C9A64F928F64229B4D47365B34128187F4DB9B97EFE9D33DDF7BD7B5B78BEDAD2D582C16588C5634E96F44B3BC0E8D46836DC3163CE43739F75D88902DA821DF4BBF694022E88561CB48CF58C5E6868EBEEB39F6C9F70AC733B06C68E0F6FAE07578F9FED8F5BA8295151D36D774D8B7997FC9FADC4EB1C8ED868E52429DF413EB53CE72B3EA8938D4EC556D06DB0F8AF55CB9D97765403ED0A07FD71E1B71BEFC130FD16CFC711CAA4DFF9606F9688D3AE339A6F3677F6D7CA5DE422C18442C99E4BD186BD5DAFCBE8EDA47F917F1BF847E7ABAF9E5CD968ACBE9D77DAA66E3EE5ED56C0F9556E3DBF6B066F777D4D693E523B247C72887AFB869CFC20A64CB367CEF96A09C9D70FF490944497F6D204D7A6BD86C207BE243C268E4EFB532E90923E9923DDB1E169EBF86DFEF432C124546CEC0E7F341ABD373DDA5B6EA585DD5F13DE1997EAAABBD2B7D63D8A6EB66A4E209788E8FB94EFBFDF92B184D267C78FE92EB2603DD939153FC7EDDD22AE2A110A2D11CB46BCB30EAB7B0B4B0868214C5E52F5AE338E323FAF53A3A8C572B97514FCAE89515B4F205744BCA351731403B97438BE9A9EBFD077BD5AB3D7587930BBEAFCD1D2E633CE2F8E6BF9BF97EA35FCE559F3D8BF51CEE773BE8F398D9D5D876BB731D3FBEF8A5EDBD9CFB9464EA88736B31A30D8AD783E8A61E259F97CB5395FED653BBFB48EFDB78FF29C671B339611C86E7E53B785E3C47647589BEBF86B46580B46D41627B1D318399E72AA9E924D20E277F2732EE2366DA41E0FD5BA40E8E90306F935CFBE15D5A474B4EA09129C0FF6199F74F62FC7C54A743CA6CE17C158B7B4936271DEB11D31BE15F5E43787D03A513072A520A797A2F84343A3E968D8BAE6BE85883E48E05C5F37384B55B28B8EC8FD7DE4BE750A33960FB0DB29E45AD34D97B61096AE12A2ED72957D1CCA4698DA27C6D67B1A76A5CC6747037A76E3A25591DF53FE3EA3A5C1619F7713919CDF93C9E734B9FB3F81593DDDEF57EA377729718AF4E72F425BE6F4272D62B7D8A7975940AFFBF0DDB5DFEF9475CE46391A78237C07B27B3BE5F19C721F21E3F921623C98DC4E56916432A866264A327F9796187FD7879524B3554E8DDC3E489717C4C3795C927E95CEFB1368B2131EE7BCC74C337DA6702F7E33FB19850D6798C0ABD03A3FAEDB97ECA91BCC5C836637910F9A343AE9F587E7862E70087FFF9DFF0BD7C26E6F407C8D32D3F3F22912ECAA0497A64A69F784E4351E13AE44BB91102828F1010F5EE02020202020F03FF079DBB0221 + diff --git a/Dht11/__Previews/dht11.hPreview b/Dht11/__Previews/dht11.hPreview new file mode 100644 index 0000000..6f56cae --- /dev/null +++ b/Dht11/__Previews/dht11.hPreview @@ -0,0 +1,14 @@ +[Preview] +LargeImageOriginalSize=708000 +LargeImageWidth=354 +LargeImageHeight=500 +LargeImage=78DAEDDDCF6F1B679A20E0EF8FD9BF6017D89383461F1AD943A0B10F3303A57DE886A7D76834341B108867331E371374C759C41D4D8420462B11621B8C246415020AD16203E6682801A1D4102D983AD01098830408BC100A74517CF04553DF471743CA727E3B76ECE7F080A562F1AB2269BCFC5CF5D6FB1E1D1D852300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C834ABDBE9F130B3F66F577C26008F41FBFAE5F4D8DDBB3B5806E0479C1397B7C3C166F98165007EC4587CF5A3EC717F68D9670200000000F0ACE7AD354AD5502F160776CAD361677B3FF43ADB83BF8FBFA655DD4CCFC571EBC5E9D09E2E3E98A751DF1EAC8FB91A71FB8D4CBBBE36D8D7F0BEEFED6DFACE8067326FEDB3BDA3706FAB126ED5B642F5A5D7C2D1DE72F8E4EA07E160B9929637B278DA2DBD3BD83EC6DED69B57D363AF7C3D6CCD2C6763EF85A3FDED91710FD33EBF5C7F67EB6E1A2FFD3EDCB8110EEEC67DEF0FF6DDABCCF8BE8067326F2DC6CBC5F14BA1F57631C5E4E68D77C26759DCED5696B3583C3F889B23F3E16BFDBF9BA5EBA1B1BC1716FF693CDBF6C1383ABC3E8E9D2FDFBA31F3C0BE7D57C0B395B7B63F782ECE9317C67F99CE0D5C7FF1C5B0F8F3E7C2CEA7EBA176FE9761716C3C2C65EB77DFBBF2C039879B85425A5FFB7033DC3C37965EDF7AFDE5C13671BE3BBC7E69BA9CC6FBAC56CFF6371EBAD5D2C8BE374A55DF1500000000C08F98B706C0A3B572F9FAE0BADCF032003F8EDEFE51685D7DFD8165007EC458BCB9379807F7977D26000000C0A3B59FD9EC6EF92C001E93A9CE66189B3B1D3ABDCD50A8BE1E8AF562D8DE2987B3B50FC376672A9C59B814AE34AB69FD0BEF8F658F17C3F8ECB930599F0847F7F6D26B4B8DA2CF12E03B2AEF6C87D373A7C2FA6E3D14962E86C2CD62D8DBADA4383CB138167EFFC9D9411CFED5CC9950EFFD2D14B2387C74D449AF8F7178BA5E94EB06F03D7C7CEB956FB45D61712AC5DFE5CEE620EE5E6C7C9462F4DD03B581010000806F9F2F7157BF2180C76A7DA6921E7F77715A4C06780CAE14DE4ED7DDEADBFB61B35AF299003CA6F9F0F6FE51A896267D2600CE0F03000000FCE0EA8D56A82DDCF8CA6DE279EABDCDBACF0BE004A5EA6678FE67E361B23811AAB7B7C2EDEA5478EE1785B0BF5D0EEF543AA178E15C28CD9707DBB77B8761F6FD1BA15EAF874E7335F40E8F42F5E3857074EF201CDC3B0A8B37EBA1DB5AED6FBBD3CB62F45C3A67FD8BE7FE3E1CDD558F1EE02493C5985FD1099FC7B96BEDDDF0FABFCD647FEF853767D6C3D1E7EB23DBF6328DC56A5A6EACAE86AD663B8BBF87A1B3D50CBB5F0CCD935BDD505F5A082B8B733E6380AF3AAFB0BD1FA68BC541BE71B9BA1CEAE5E9B077379BC38E15D27C78F89C428CC32BD5669A0F1F1C7443A3BE117A0707A1D5A8875A6B27ADBF97AD4FFDA26B2BE14EF3567ADD74B92E8F030000000040DE1A008F386F6D2DE64BD497C2EA5255DE1AC063C85B4BCFB73A61ADB6E43306780C796B3BDD83F4B8BA5A97B706F0352AE57A38A93FF3A79B7B0F9C4B88F1F5A0BBF38DCF1DF776DA3E6300009EEA7C89F6865C0880EF932F512C16C364A61EF325EAE5509C2C85FDED7AD8DCBB9B9E1B3E3FBCD33B0C8DC6C6E03C705C57FBE4932FE372B6FEE8B0175A9D6E3FA7A2D5086BFB47E1BDC2799F37C037C89738DA5B0E172766D2DF79BE44BC7E377C9DAE555B1DE44BDCE91C84D69D5638ECB653BE44CC5DEB76DAE93CF26AF566B6DD617F1FD365796B000FC997F8D5CFC653DCAD66CB975F7F25BC91CD5DF7EEDE7D68BEC4DCCCC769AEDB6AAE8685B9C5942F515D981BC99748DB1E1E85DDF6867C0980EF982F7152FE703B9BE7EE36374E1C27CE85F3E566BB97EEE368AED67CC6000000C023CB5B53E707E0FBE5AD3D8A3A3F315F626176316CD497D4F901F816796B3F649D9F3BCDDDECB1E73306F89ABCB54752E7279B37DF59B93588C3F2D600BE7DDEDAF7A9F313FB846ED43706F771000000009C942FF128EAFCC4DC897ABD11BA9D963A3F00DF225FE287AAF373A7DD0B47F7BAE156B3D5DF873A3F000FCD977814757EF29CB5B5C61DF91200DF315FE2FBD4F9E91EDC0B37ABD5D05CD1271400000000E05932B7504BBDE91EE53ED471039EC5BCB5687DAD99AEC9AD6EB4C3E2EC6CCA918879C2B76E3543F3D6ADF4588B791287BDB0D13908733357D3368D7A3F66C66DF2EB7AD5EA4A5858AA872F769BA1DB6A8676A79B6AB7B5D6D643E7E05EBA26D8BCD30B475FEC86CF0E8E46F6271F0E7826F3D60EB3B9EE5C3F16F67ADD505DAA856AAC75B9DB0E33D717C3C2FC4258A92EA4F9F0527529E54CAC355AA947D25AAD9AEA53CCBC3F97FE8E717A258BE5D52C0E77BB9DB0B4309BE6D0A94650A3161A594C8E717876B111AA8B73E1E0A037D8DF41B63FF970C0B398B79672D2BADD47721C87BDAEEF03000000783CE7AAEBF570D8DBF15900CF94EF526F6D238B973BDD6E686FD443A3D5098D463D6C6CC41A6C1BD9633BB43A9DECB139C891E8F67A6979A3D1C89EEB7E993B71EF205DB7CB6BB4359ABBE1B0DBCF83F8DDC569D7DF8067326FEDEBFAD3452BD56AE8DE3B0ABBCD56B8D3BC956AFFEC36EF84FF58698695D5D594B716B7CB6BFDACAEF6F388AB8B8D91F57139DF365DFF6B374373AB93E2B3EF057896F2D6BE4D7FBA144FABAB690EBBB3BB1B7A3BED34C7ED7677525DE256169BF3DCB38D942F7C986AFEC4ED9BD59591F5C33970B1D75DCC09DE68EFA4BE4BF11E8D6A69D277043CD3796B27F6A7CBE2688CBDDF64DCCFE23D1943FDE9E2398B93D6030000003C6A9BB7B7BEF56B62DDF9C5D985412FBC8789E7B3F365F57F809F5ADEDAF33F1B0F93C589508D796BD5A9F0DC2F0A617FBB1CDEA974D275BAD27C7924DE8D8DD7B2F58B61EBF64E28145642B1580FDBF57678E3834E189FA887EAD462B872AD93D6BF706AB67F0EBA7337ECAFCD3FB0BFF3BFF85FE1BD4FB7C2E5F153E1EC6F7F1FCE9D9F0877F73EFDB29E4566F6FDF2FD6B79BDD47B7461762E5DD35BA8B542AFD348B52CE2B6FBB72BFDC7CC2F9EFB7BF57F80A7366F6DB2D20BDBD54658DE3B0AE33F7B3F9CBB500F95D7ABA1B6752FC5E1CFD79BE1CA5BFD1CB5C2F9FEE34C16D3F3B186F7777EFCA5B0FEF97E589E7C2DCCBCF9F603FB8A71B8B1584DCBF7EEE716C75CB9F8D8B8D34BF9C6EB6BFDF5EB3315DF27F054E54B3C2C0E7F1B791C8EF3E8DA47D7BE727F27C5E1E362ADCCDE4EE7E4F312E6BF000000F058C5DA10EA32003C3E6FCD54526D9E188B274BD53039590CE5E9E930395FCED64FA77B85876BFB94CA95C1723CBF1A97A3A3FDED54E7C7BDC500DF763EDCCF1978FBAD2B61FE9DE950CB62E9FACC747F7D165BA76BFD6B5995780DEEA833B2BC957270F77D8E00DFC399B397D27CF6C22BAF844A36179ECAE6BE791C9E284C840B85C248EC8DB57D0A63E7D272CCBB2D5E28849F9F3E1F8E3A15F361801FF27E8D99D26079B8C65AFC7BB9BA691E0C000000FC205E2BFC3FE719001EE77DCA43E78201F871C59C87DB956B3E0B00F3618067D67CA9EAFC3000000000C033E67A793BD5972895A6B3C7C9303E76266C564BE18D0F6A69FDE93363A15CEF6FF376A1902DAF0D9687CF29F70E8F42B57A335497EA6161F6FD509D9D0BED6E371CF676C2CA5A3B2CDEAC876E6B35D41BADD42FAEB7D30E3BDD83C1B2EF027856BDF5F67CEA11542FCF8FE44ED4B6EE66F17622BCF1F2D930BFB69FFA7F1E5F1E1EA7D5BD170E3A1B61A77718EE346A61A55A0DDD7BFDE76EDD6A8E6C9BF78B3BBE0CF02C8A3138D612DE5CAB8CC4E1D84B3ECE7BB7EBE5B44D9C2B572627B3E5FDC1F2F11C8B46AB13DA1BF5145BABD5D5D43339CE93E7E666D372EC65BFB3BB3B88BD29668BC30003C5E9728ABBDF678C185B3736361E7AAEA1BDD31B3C7718CF6738270100000000000000000000003C23623F8ECDEE96CF02E03199EA6C86B1B9D3E176773314AA174261A9182E2D9C0A575B9F8662BD18A633F5EE5EDAA6D4288652B6FDF8ECB930599F089BBD4ED8EE4C85330B97C256B79EBDFEF5F49AED9D2FEFC9DB3E3C4AAF8DEB2FFE47311466CF847216F7A716C743BDB71FCECD8E87A3C3ED70B1554DCBE3D9FECB6BAFA67D4C67FB385BFB30146F9E4BC776F7607330EEE6C1DDB4FEECC244D8EEAD87F18517B3DF93DB61A23A31584EC7B47425146E16C366FB6A2834AAA1DEBA142EAE7D18F6B2E7F2B1E2719CC9F65D6F4FF7EF2B6C94B2E39D08A7E7C6C27EAF1EC616A7C27CF38D346E7C1F332B2F8F8E5BBB9A96F7762B83B1E27BFA5EF79BDF3B0AFFEDCA7F4FFB1B7EDFC0D3E9A3AD3F84F9EEDDB0D7994E71A492C5DB7F5C9C4CB1E81FAE8FA56D666E5D1F6C5F69AE678F9DFE7CBA5B0AD36BF361F9E0288C5F3B15CE65F1A8B25218193F7FED9FD726B358F67298C862CB7AB31FF3D69BFDBA169DFBCB316EC7B893EF63F24E27C5DB89A5C203B16D2C8B8B47BDFEEBCFD7A652AC8E71335F9ED9FD3CDCEDF6EB175D5D7F27CC677FC7B1AEAD5E78E03328DD3F8E2F75C2F55B33E19F6B1F8499E65FC2D117EB69DCC9DA6FD3F3F9B82F65E3E6EFA1D22C3D64AC6F1E7B8BF5C9EC37AE188EEEEDA5DF9A3F2D4D04BD52E0E956DED90E2F2E3C9FE68793D99CB4BC514CF124C6C33817DBEC9406F3E13437CEE6C0F131C68634276D4C866A6B328D35DDAE0F62C8F1381CCF7FBC5BBB94C6CE636E9CB3E68F9DA1983C1CEB67B2381C63E09F1B9507E2D166F73FB3F9F8725A5FB9B314D60E8F527CCF976BD9F17DDABC92E2DB3BB57F09952C0EC7B1FE7D65FAD838B753EC8CEFE7CB58DF09BF599D095B9D4AF8BB1B97D2EBE2B871DBED6C3E9F8FFBCFD9B8C371783056F6F87DCF176DEFAC85F2EE7EF6BB54F36F159E725BBB9591FFA30F9F57188ED7F9FF91973B9BDF788E96C7F3A8BEBB96627839C6972CDEC7B89FD6B7A707CB310EC6B89F9F1319DE662476C6DF80FBDB6C1FEEA7E5F81BB07DB037584E73D3EC58F3DF86F83B91FFB60C8F95EF23DF7FFFBC44319D87C9DFFB7CAB34D8267E3EF9B8F5DDF5F458CE7E0FE2F60F3BDEEF221E6F7E0C000010E7A0F99CF4FBCC13F3F3B0DF771C00796B004FC71C737CE1F9F0C19D4F53BE443C9F1BF3257E5D9D1C39CFFAB07C8978FD2A5E978AF912E766C74E3CFF9ABFF6DDB5A991EB7427E54B547A47E1F3DD9907AED35D6CDD1EE4280C5FA7DBDC5D4BE77E4FCA97387E9DEE61F9127F6ACCA731E2B9F17EAE4629BDA7785D2FDFC7DAC15E1A2B6E5FFDAC9672F05E5D2B874E6F336CEFD4D2EF59A5F1E770ADB99CC67AA97A2D74B2F7B1D7DDCEDE7FE93B7F3F790E06F074E74B9C9E3B15963BF514BB62FE6D8CC3575B9B296FED6AADF040BE4461F65C8A91F15AD9C4E258F8FD276753AC2B2C5D1CE4D17ED7BCB5E3B13ECF5B9BAA151E38F6E1BCB598CB10E3EE566B7AB07C3C6F2DCF97786BF5ED9171DECD9E1BFE3B1EE3CB0BE3296EE7FB88797DF1F721DFE6EC5FDF0AAF669F578CB9317F38BFC697E7ACFDEF6A29BCF5D789706DE5B56F1C878FE7AD89C3F0ECF8F8D62B23F9129513CE995E6C7CF49DF325620C8FB177B2F6C7741FC77B3B6BE93E8EB3D537D2BD1B312737BF8F23CF97387E1FC7E5A5D1FED0F97D1CF13761FBB093EEB138BF540CCBEDD26039CE518FDFC7115F73A57A6EE418AF75B6B3F585F0C24221946FBD998EF1CC6C218C2F5E18EC633FFB4DC8C77AE393BFCBDED3992CAEDF0E97B2FF034CC4F795AD9FA9FD26DDD352CBFE3FF03FDECF9E5F399F7E0FCEBFF7DC77CA019E58B97EE27701000000FC74F3D6009E249D741DEDC6E0BEB2782DAED49C1CB95F2DBFBF2DAFF393E751A43A3F3BE574FF59CC53C8EF253B5EE7278F9DE53BE5FBE36DA5FBE9E2B9E8FCFAD6F03D6DD576E581FBE94E8ABBF19A56CCCDC88FB57F9DACF493FFAD399E6F02A8F3F355796B8FABCE4FCC8548C7D2CB8EFBB399706AFEB7E16AEDC24FFEBB88F91127D5D200D4F979D2EAFCC43C84B89F579B9F86BBBD4ACA0D7BB5597D2067EEA7E683B5ABD9EFD5B47F9BF08CF929D6F939E9BC448CE7F96FC44FF5BB88EFFDA4CF1F0000000000000000000000E049A9C9A0FE0FF053A53F1DC0E33595CD2563ED88DBDDCDD417A9B0540C97164E85ABAD4F47EAADC56DF27A6BB157C6647DA25F6FAD33957A506C75635FA5D74FACB7165F1BD7C79E6EB1D745398BFBB11F47BC87FAA41E1CB11E5BBE9CF7E918CF8E2BF6258AB5DDC6B331E65BA57EAF8CEC98E3BDD6C3EF697E773F4C555F48F73BC7DE1C71DF332B2FA77E1CF5D6A57071EDC3F0DC7B67D3FADBED6B23FBDE3FDA4F7D375E5D2A84E7E77E97BD97F7C26FE65E0D837E7C27B8B4F651EAC7B1DFEDDF1F1EEFC5CE7FE3C6672F85BD6E79B03E1EEBF0FED4F301A227A1DEDAF171F3E5E375D8FACFF5EB429E54872DBAD6FC28C5E2B81C7B86C6BE4BFDF8FC659FD0D80B2E1EC776FBFAC8FEF29E76B18EDB4BEF9F0ED7DB7F091FD5FEF8957138AF5DB4DCB83EB2FE67591C8FF176BF573EE135EB5F3926F06C7912FAD395B3FD16DEFFC7149B869787FBD6A5D87B6C3E7CBC6FDD1BEDCDF05E752CBD8FC9ECF7209F0FC7F734DC9FAE9CCD49F39E720F9B0F9FBAFEEBD0E99646E6B4B9D37317C2C4CABF87BDCF26C3EB713E1CFBE11D8BB7F1BDFF66E6C507E2EDF0FB8BBF7FEFDE3C13FEE9C60BFE2D020000000000000000000000003C42EAFC003C5E799D9F4E6F73A44ECFD9DA87831A3E579AD5B4FE85F7C7B2C78B833A3F47F7BEACFFE3B304F8EE629D9FE3757A26EF7406357CAEACBE9DB62B2C4E85581361B846CD70FD1F00BEBDF2CE767871E1F9B0D7AD87E9763D9BE716D33C77A695CD811B93A1DA9A4CF523E37CF87AF58D50EFFD2DD5C2CC6BEBC4F9F0F0DF007C7B5BBB956FB4DDF44639C5DBE17A6B318EE775D87C96000000C0D39CB716CF839C5F2A86BDDD92EF0F78EAF2D68AF5C9D4EB62B3531AC95BBBDEDE4E3D92523FE4D6FC48DE5AEC6FF1F399D3616DB73EE86FF7EBB953831CB893AEDFC53E6D3137EE6273395C6CAD85BDCF66B2E3D80E130B6361BF574F3DF0C6E6CE84F246314C6DD5FABDEDAA1361EF8BBD34EED96C3F0B6BD3836D628FA3738B17530FBB17B331623F8EF39F14C387B5DFA56B8CF15A63DCEFF8E254EA3717DFD37B1BD3CE69034F54DE5ABE9CF77E1BCE5B7BAB319F626E8C8FB13FD1686FB54E28352B23FDED5EAA16073970F175F9D83126C6581D7333E2DF1F6FCD873FDEBA12B65A95B0FEC5511687CFA6E7E33E621C8D31FCAD9599F4F866EB76A87CF697D069CFA4BE42B1BF5DBE4D1CEB62E3C3148797EECC845AE3D5F0FAEA5BA1736766F43A6376DCB177517C4FF1EF0BB5AB83180DF024E4AD1537CA835ECBC3796B71BE19E7CA33D91C72380EC798BB776F3F941A9383796E9C9FC6583EC8813BB6BF3C16C7FD7C70EB83F418B78F7138C6CDE9DDFD506D5EE9F79F8BF7941C1EA5C77A7B7AB08FE96C1FE5EC58F26DE231C5FDC5FCB9F2CE5A98CC8EA7948D797CBE1B8FBBB871398D15DFB7180C3C69796B31DE6EEFD4BE72DB187BBF2A5F383E9FC7F2AF3B2F5DAC7F190FF3FCB718C71FD5FBCCF3EE7CE7000000F064E8A41A113706E75EF33A3FF19A5C5C9E4CE75CFBE70C86EF71762F33C00F23C6DBF185E7C35F7637C3B9D9B1146363DE5A7E5D2B5E8FCBAF95BD5D2D845F572F0EE2F3702E0400DF3D5FE2F4DCA9B01EF37F972E86C2CD788F4465240E57BAFBA178B310FEB070365C6DD5522EF1D55AC1E707F003F9F8D62B27E63D1466CF0DE5090300000000F034795C757ED676CAE1CC6C21D4BB7BE1FCC22F43A95D19D4ED19EE8737D3EE0CF6B115EFBDBE7F8CF11EEBFCF8E2FA89FB791CB5ADA9416D9FFE39EE6CCCEE56985A1C772F33F0C47A5C757E4ADDFD30B67821ECEFF66B47E4757B86FBE1E5FB8AFB387E8CF9F1C5DE7AB75B6FA67BA56756DE1A796F97AB2F87AD7B4761BDD9AFED13E3FE85AA5C0FE0C9CA5B7B5C757EE2DF3756FFCF203EE6757B36BBB707FDF0624D88E17DE4C798EE27B97F7CA97644BB3EA8F933BCBF42F5DF07EBE37B8D3158BD4BE049F338EAFCE4BF01F93D2327E9D7E5195DF74D8EF1BB1C0B000000F0E37BD2FAD33DCA6389E734F67BDFEFDCF0666FFF275757E38778DFC0A393D7F9C9AF5DE5B908E95ADDADEB0F6C9FE732FCA9560ACB079D919A3F33BB9F87A3DE83790D33B74AA9AEDBEBB5CA482DA13856AC215469F4AFE7CD7C96C5B783E530D55A4BDB5CAE4E84F96CCC98B7766DF5C2C831BDB63695F67963AD3238571DF717F753A94F860F9A95503BD80A9F36AFA438F44EED5FFAEFF77EDEC4481E5DB6DFD7160BA1907D0E71ACB37FBD34583EBE6D5E9BEEDCE2E5748C6B77DE0BE76B53E9DA63ECAD977F06F1F82A6B37D2BE979BD746EA754CD62BD9FBEE84FF7BE337E1B59557D2FB78B5F969B83BF4D90DEAE4AFBD9ACE73C77D3DAC4E7EFE3957DA9D941BB2D59A4FCB47F7B606EFF7A4F70D3C39F912B1CE4F9E2F91C7C498BF10F38AA78FE53CE4B9BDBF9A3993C598CE48CD9FB1EA7BA1B8349EAE8DE563C5BC865333FD1CB6FF6CCD8CD4128A634D64B1F6781C4EB1ABFDFFB3F8F251A8C4B8F6C57A78EB7EFCCFE3F04B6B9323B16D380EFF6AE15FC376FB7A1613FF16EE76FBF1E7EAFA3B0F8D47FBE9B51F0DFEBED6BEFDD0CF2B8FC37F692D67DB2DF7F347EE2C6531FF6E16FFA60771381EDF7AB3321A2787E2F0E5957FCDFE5E0AEFACBFD47FAE7737F54B1DB9CE783FC7EE42EDE2378BC3D9F8F1FD2F37AE0FF6F5E746FF774A1C86275B5EE7E7782EC2C5C647F7EFC578F03531B7F7780DA0188B8A4B8541AEDB37C96B8873BD3C0EC7D7D4B6AEA5DF86FFF9FEE9343F2C34AA693E7CA57A2ECD9DE36FC344EADF7C31D4B239F5F8ECA5EC37248BFB8D52BABFE37263325C9C7B2E8DB195AD2F2C5D49717FB37D7530FE49C7319CB3F7557916D7B66A69FE3AB6F876F8A0FA423AA6F18517C3F9A5F8DB520AE7E3F166BF45F1F80AB3E3A1DC590E9716CEA4981AEF7F99CE7EB74E65C7DCE9F68FFD8F2B97532DBB57B3CF6DF87C47FC6DA8B6BE3E764EAC5C1F7C7E2927303B8ED80B352EC7187E7D65E22BDF37000000000000000000000000004F86587F3EBFA737EFE301F034E90CD54C88FD34623D895273B2DFEF225B8E7FC77B72536FBA4631D505CA6BFB6CF63AFD5A128D52AA71135F1F9F3B7E4F703E6EEC9FD11F6F6B502721EF9591EF237F3E5F3E7E0F74FE7C7D474C069E0E79BDB50FEE7C9AFACBE5F5CF7E5D9DFCB296DAD168EDB591FE745FACA7DE71B147DC702DB57CDBBC6F5D3E6E5E8B27D6C059FFA25F5362B3537960DCD11E784743FBFEF2F5BE3FE06930DC9F6EB8BF5C8C9B794C1DAEBD56CFE6C0795FA4937AC4E535308FCF87F37187FBC55D6AF57BCAC59A9BA9DECFCA8D90F7BDCB978F1FEFF0EB7D7FC0D322EF4F97FFDFFFA45A63315EE7317339F66D7E487FBA8749E71462AFFB87D4318BF5C5A6EBD369DCE1E5E363E8370700807C0980A7C793D69F0EE05933D5D94CD7E03ABDCD34F78C3D2D86AFCDC55CB5B3B50FC376672A9C59B8145EF9EB8534377DE1FDB1B0BE5B1ECA2FDB1FF4451A9EB7C6EB7DB1775BEC13313E7B2A14B2F1CB59DC9F5A1C4FB912B15FD266EBCA48BF8A9897962F1F3F3F9CBFBED498F6FD014F8D8FB6FE309217962FE7B96A93773A61BF5B0AD36BF3833EA1B12F52BF4FE844F887EB6327F6091DCE5BCBFB1F5DAEBE9C7A59AE37E753DEDA684EDAD7E7AD0DBFDE77073C6D796B233DDA8672D566E2FD19F7F3D3F2FB3BAE57DF487172385F78B84FA8BC35000000000000000000000000000000000000000000000000000000000000000000000000F869F92F84F31ABC +MediumImageOriginalSize=177000 +MediumImageWidth=177 +MediumImageHeight=250 +MediumImage=78DAEDDDEB571B479A06F0E73FDD8FFB61F6ECD9333359CF9E9DCDCCCE6CD649261BCF19DBB1333876B8D91830188440A01B48E87E432D5A6A75EB7E414212124610C42587AD2E0672ECC9249B33BEC0FAF9F03B6AA4AE6E2815A5B7EBED2A9D9D9DE18C88888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888E88AD8EB1CE045A384A27B8DF541D756793D82BDD62EBA9ACAFA20227ACB0E7A0738158F834E97F541D756D5EF4139A2E264AF257F2E7823884C2C409D1D4671611E8555AF7CBE1E8EA118CD233CB18493ED9C7C2EBF1692DB4D3585FA4602FDAD06925F3DC2517B8B754B6FEFBAAEB62D1E8FC563EDBC4DC753C82C2EA2BAB68AECE20A6AA28D9BCFEF8B3EDBB02E8A76EB4775D5219FAB25D3725B5B5E1371B54FF4E74DE8629F17CD0EEB968888636BF49ED84E6571747C8CAE96657D1011BD65C5833D38F376D873AB886EA5102E79E1A944319F9EC7B26681D22EA0B95B645DD195D53A3CC0F3CD07B0192E24B654AC6426651B1E8B0D23527461AD5985D798615D1111BD21C742B7584426C3EB39BABE36BD11040201D6055DDB7EF874B0C7BAA0F74E6FB78F6EABF1D273DD6E8F75435746B3B387FBB7EEE0C1D008A61E3FC193690B9ADBE7F704853D3EA4532A8AB934F45C11CDC636D61D3644E39B383B1DB0FEE86AF4B307C750C27E14AA55349B758C8C3CC160EFBC9F35D23A3AED36BA9D368C4209272703186A1AF5568F710911D16B8C251666E71058F7211C08603D94B88C25B47406A57215C6661C8D66072D114B14733AECCE75C61274A5628990DB05CBB21BA1801FB76F7F79194B24431B501249944B06E2C9140EF6F7914CC4184BD095D36EB52EB777775F5C6E9F0C0EFF3A67DD6CB2CEE8CAC5121EB71B6A2A053DAB41D17297FD70A954C14EA7836AC190636CFD7E1FF56A89B93EBA72B1847DF639C6A7E6B06CB5CA58E2221E8EF922F07983C8AA09C43652E8B55BA8140B0825759C1EB4597F74256389B2B886BBD83EDCFB2EAE180C06D8DB3F126DD8609D11F37444EF284FB7DB6943894499A7A36B9BA7EB7F73804631CFB13522A2D71C4B3C7E348A058B15CB0B8BB0DAD72E6389CD84827AA58EA2A1A25CD942ABD182915198A7A32B174BACAF2CC11FDE809E4DBF92A78BA160E4D0D8AA41CDE8D81131442A1E662C4144F4AEE28E561707FDDD9F5486E370F42EF374815004EBEB7E6CC442B0D9D76177AC211E4FC26E5B42259745281442D628221E0D4109F95136B2D0B43C429118A271058A28C79C1EBDCB3C9D999BFBBF1EE3F488D77874BD755EC9E5115D85B135DDC84109C7A0282984632AB239036945415637A06732727B5BEC5BAB14A12A4984374BD8ADF37E0ABA3A79BA8CAAE245AF834E6F57B4D32A76BA5D6CD7C57EED1DD48B79B95DDD6AA2DD36B5F1A27F884EB3C27A25227A4DF3E9E62D3A36361A501335AC05B6B011A9607E4643FBE0148D4AFEB25C20E0C1AC6505A7835DF40627F03ADCB25FAE8ABEBA56ABA1DCE8E2B8DF667E8FDEFA7CBAD1C79B187A94C4C48310C6660D2463458CDD4B2255E9E3B8635C965B5E5AC2E8BDBBA2CC295E8836AC2614EC88F8A227AEF3929B6934EA3574748DF93D227AAF79C22AF4A41FFE4814F14412D16008C1A882483822E7D3D59B4D147515A57289F5455792652582E1E1AFF174467CEEDF1DC7C3D1C7D06255114B34115CB1C1E90A2011F6B30DD3F5B88EDB3A9F5FAFAA3ACCEFABEBF2BB43E99A281A39D6035D5BE6FAC3A5D406EB82AEB5B4B896633D1011BD1B8DD60182411FACF34BD8DCCCC062994738A1221E89C16BB7CB6BBBA3D333E87A01192581AD5A1546B186A678AC950AA8541A383ADC675DD23B6394B7E15E5984164BA2D63DC5BDCFFE0323D34B987B3E87CF3FBC21DB707FF02D742D8DA0DB8D72A180683422E76DB4EA7554F25C2B90AE06554DFFE0EB8747A72FDD0BBC7F7824FBDF5EEF05EB8F88888888E815C1BA8260C9FD83FB683B951FDD87E8C7540FF630B4318EE1E843DC74FC1EFFBEF4CF985417906C28781C7980E9D4241E266DF899E55F50699C7F1FEE9FA343F895F5033C08FE11D36927D4DD2AEEF94730157A886C3B8C1BB67FC2E9601B7B27A7F8D475038F37A7F138F100BF5DFD0C566D095675125F4487E13616E5F1CC63F4F6EB18898DE3B6FF4F184B8CE317B60F60D16C9812FB4E26E6A0D637309D9CF8C1FF07A3A3E1378E8F707AC2FB3CDE27ADC303788D67709583D01A2928F52066740F2CE9A7A2DD8490EE94D0E95710AA2570F6EDF95C8B11E50926425FC29D77E2D1C60C9C950092450F1C4658B4E104ACA931392667B6E1D9C443782A5E380D17869569D13FA7B02ADAEEBCEE407A2B2E8F671E43D90A89FF97392C6A164C249FE3517C18BEA21F4FD459AC6A76D17E2731147FFAA379F3E76907DB303196A0EB75CF9A8825567276D87427D60B6ED1F7B945BF1995B1C4B2E813A3D53082D538ECB9551C1CFE653E9D78DE2E246A6178AB4914442C3193B6624DB7897E3805BBE8674F4FF6643F6CF6AB51D1B7C7459F1B12C7DAD85290A8AE235A8B22D3D2E4F10235D1DEAB21042A4158F54571EEA8389F07EE52002111435833F3288ACF039761139F1511649B89BFF9F75845FF7E70C875B0DEB758624679203EB32D70A5E7453B5EC2486A49C61291A20B6BA23D6BAD346C2216181C9EAF2D7557C4C3BF5EF857DCF77F8E3BA131D8442C11CEDA30AF7A653CFCD1F2CF2E63895BCE0F60CBAF605AC4117F080DC35108C87878429CCF9777FC251E5E8233EFC207F6DFE317CE8FB1965FC642EAA988312C988A7D855F3AFE1B63A121CC29CB781CBE8DD5ACE57BFBF4CA8E26CA3DE7FB4A44D7CA81B0B5D7109FF35118DD928C25124D4DC6121EB19D6DA9D0DB1A3CE2F58B58C22D9E4F8A3842177143A2A5A3226209F3B9684D7CCE8B7DCD18F7221E56EA1128ED1C9ABDC29B9D832262A2BD03DEBBF1BEC612A3C94758D266301E9BC2C7AE1B726C4D15F18352F1C22AE2604F398A7FB37F887677539609D513F8DCF5B18809CCD8238AD2A08F6C4543BA6CDE73D1C170F80ECE4E77A1F60788B61B988E7F015776E98DFE1DA96A0C914A8CEFE97BAA2FE2DCDED1F1653F6BB6EB5C5B41F7E0FBC7A8CC3E576D24916E2565FFAC3453E29A4B95FDB7D90F276ABECB7D2FFAE1ACD8C78C91DFD87A1883C1E5EF4F4444444474DD727644EF324FD713D77E0EF1B34F9433F37466CE4E6F26E0CE392E737666B9583D86D0560AFEA243E6E99E65DC48D502A25C12A59E9947F120505A85D67C794E89BD18C2F1A02DF62921D92C603068C96DB35CBD97E6FBC8B1B5BF7B6CADD2EF42AB0410CCAB726CCD1C6733DBAD564F5E8EB30DBE3D83AB1083BF1246B4ECC1626E0D13492B9CFA82D8AF0AB5BF85462B8A4F976F205D5E95E7E99E9C21D74EC3518EA15A3B1F37FBE5C24D1C1F95CFFB7771BEEE4907D1FC0ADF4B22222222227A2F99731FF6067DD6055DEBF974A39B1372BEDC57D127988E7E8171650EB73CFF23E7D3AD547534778BAC2BBAF2F3E9CCF9725B7B75446B7E798F8E535F91F3E9E29DBA787D86754544F406F374CEBC5DCE990FD7920897BC088847737E9B99A74BB734AC15BC328FB7909E85DA085F9635EFB354C5EBB94E0EE99A07F66200551177B8722B58AD6CE0CEFA67701916245B054C67E6B19A9D87D1CAC879D266FE6F25EFBBCCE111FD3DB1C4B236024FDE8DF07615B31B5FC25EF02151F5CB3C9B528BC39E8FC93CDE47CE9B9888DD95E5BC750D91820DF7C3D3582F6FE28EEF1EE63686116F2631AF59E12FAD61467982D1C428D6AB71DC0DDFC703DF2DF4777559FE99F25CFC6FF8614B4FF37DA0D7720FFCABF7BB9BF7C4D77BFA4B3FBF7A8FB939A6916EA9D0DA59842B3FED9E9EFA8B3AEB9E5EEB7C3A733E4661A720E7D0851BEAF93D3545F71B9D7B41F45AE6A1ED6CE393F5FFC2CFAD3F97F7F498F1C388BA84DF2DFFA7BCFFE7626D1FA22B1D13EFE52FE305E307D61F2122A23793A75BD0263012F91ACFF4A0CCD34DA90B98CB58649ECE9B5FC39DC88C5C17F31FA7FF0143FE9BB25CA2A923560BE276F0219C99A7B81FBC25F37B13D12FC5F61F916A2A781A1F95C79B4FCF616EF3898CB19F25A7614D2F20585390EB187C0FE8B5E5E97C251FB6FA1D99A733D77D4AB732F21E7873FCA0B95B91EB62068B5EB91E9459CE5C874A116D7832E392F3E243D5A09CA36FE6F7CABD02B4DD168AED8C3C5E7DBF27E7EE9BE53CC590DC36DB30C78689885ECED3557A65D8F5F3F5F82A7B1D1103CC23568FCA716273BD60738E5DA8E8C07A2588E5CC92CCD99973EF0AAD38D26D0351B1ED2E0611AF07447FEB45BCEAC57ACE86E26E134BC68AE8C77DC874B272DD4BA3FDDDD8B3ABBA09BDE1C3C3D4C2E573BAF82C483454F8AA09B95EA6531CD7A5CFC1965B179F0B35397F2F500960B528CE69D8E4F889395E9D6B675FFEFBC4B9A32537E2CD2CB6FBDB08146C2F9D9BFE7FC4124BEA03D17697654CF0AB950F2FDBF01DCF7DA8ED086A5D03BF5BBF07477E1995661C4FD41944CA3E6C6E45641BD62AA28DD413185616506CA5311EBA89E7593BBE880FCBB52AB5561843B1AF717FCD5C077E52AE7BB951FFEEFB75037555E64F9CF9EFD6078A6FA551DDEFC297B7C9F53267D425114B3FC2B288B9ED692B2644ACFEA9E7363E767E8AE9F42206FB45D9865774379C05D765CE45EF35A08938C7697810D63D988A0F897347F9DE1311111111117D0F732D6B736DD7C180DF89416F6F6C6D2C35055BC682E1D8183E71FF068BC6AA1C479B5526B09A77C1A2FBF06BE76FB1BD939265CC7D1FF9FE006F6115BE4A02958E8179B1AFC3F0A1DE3B1F6FF0E4BD08563758C7F4D6F2743FE5FBE9CC7DC7C30F65BE6DA5E041F39B2E94E22A9C7A48BCFEE2A57C1CEB98184B10FDF43C9DB926E5BCE6F8AB3CDD45BB34E7D6CD2B2372DDCB64D390B1C4C5BA9717EB5046AB09A45ACC87D1DB9D4F67E6E9BE8E0E617CF339269333180B8D634A9B463067C59F45AC7C3117C99C5B77CFFD097C0537469393E87CF3F2BA97E63E4E7D55BECE3A2622222222222222222222222222222222227A7FFD2FB82030CD +SmallImageOriginalSize=63600 +SmallImageWidth=106 +SmallImageHeight=150 +SmallImage=78DAEDDC6973DA581606E0F7FFFF88A9CEF4D45467DA9DD8387849DAE0DD0EC60B20406231420810FB2290901078AEE4762624DD339954B99167DE0F4F219050AA8E727CCED5BDE8E1E1010F444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444F44D06B5260C29CB58BC000B77CE38BC807CEA150BC1B612DD45397E08EDE21CD38105237D87E64D12C3E6003D2583FAE5098A7B31D80383B15B83D9642A5E17E89655F4E4ACB86E252CFD6BA856D1CDE7E0D82E7A05055D5981D96A61363619B735E613BD847C621CC22CAAFC8AD7A9BF633BFF0E6FB39BB8D5AF70A29E30362133B2479FB6CD9909C773D0325B8C4DC8948B1A2AEA3D631172B66DFFDBFD8E185BCD5D87B10A116FF980D8E119F62211C4E3C7E80D4C1495028A850274BD8ED4CD35E31496DE6F360B5E5DD71579B47A9F62E1F1BE45D8F2E9E4F41C83D10439290745CEA3D96C22934A314E21CBA7E9740A67F658973CCF83E3B8709D196314F27CD2751D0539C738853C9F6662DB75D8F7853D9F3AED96E8FBF28C53D8F349D427FF9E3A6314EEF153ADAA229D4A334E211F3F79DE82E3A790D627DBF5904967C4B8E916C7271748266F502A16202B2594949CD82EA35C2A429224545495315C537D5A88EBB65C78BF7F4D3D8FF10A493E8DC71694BC844C268B5C5E46A9ECE7918CAAA643CE66712FDE336E61E8F7FED5E3F9B9E52D1698D91673296CF9349DE3AF7F4B613B2223B295C3E55901C9AB6BECC74F11F9F935969E23DE2751D7457E2945184D037A9575EACFCEA72FF7753A93209FBEDCFF945FFF692E8BBEDFC69B287EF9E9676C6E6E239B9690F87885E35F0FC435E9303EA19ACF75821A645B3646A3111CDEC30B25BD52651C5E503E3116E176759DC6E5F11122A2C78BBE8B624F70BC2552D7B75045EF56532BE8B6DB18F5FB8CD79AF57BBDAF3E33C7A618332D82FECFEFEDB8E688E87968A3066C77B25AE73C17DAA0C2F83CE3FAF22D29820D69034795135C543F625BDEC17676030DCBC287FC06128D146EAAD74868178857CF319C1888DD9F04EBD0E3E503F19D0B1CDD1F07E72B76CAD85776B123BFC7A97A8C73F50237B55B38736BE5DFAD8D6AB86BDCF11AFC17EBCBCDD9630CFD75E5FEFAF2A77D635193949604A55746AE954773DC40B95F41A57F8FAC2189D792508136D420778A28F4EE5116C7CA6D0945B15D1DA8287615648C1C86D6D735501FD5790DD6904FA6E8136FEA1944726F7126F69DD7AEB05F788F3BFD1A3BB91D3446FA4A3E15DA32AFC1B78E9F5C1B96FB784FAF37EDADE4933577829CA889F8AA832ADA93366A2277B4612DC813C36C084DF4AD7EF01AD42EB14F15DF694F5AE2D81A1A22079B631D9D691796B37ACF70EAF07757DFEAADF87FFE26BD19E4D34139BE924FDAD44224F5038EB4044E8B22D744BEED578ED113B91053938848FF80E77D5FBF7E29EA16E3FFBCF9F4B09C0739D434DB987BB3EFAC8B43C69FE8F3DFB8895CFBDEBF7BF43CFD5E558C8BB2CD2424D163DFE9496CC9BB587A36E4968298A86B1F44BF77297ABC84F6113BCA1EB48E02578C7DD5BE26FE766A48D4EE30B21A418F3775268CFD338D9FFC715177DA1235C910FD5B0B858E0C6FB910E3A4124A5D391847F9AAA28EC9AD4C50EB86B619D437DB3131B0FCDF017BE21C5D6803CEA510D17AC74F4FCF8FD8C86C04CF8F88DFC7199B108E9F3E8D975C2BA84F7E6D616CC2D7EF25AAA7413EBD2F1D406A6644BF76801FAF7FC459E53D3AD638B87710173D5D548EE258F474AF521BF8E5F61536F311FC90FC0B26B311F6448F976FF1397ECFD9EF7DDEE3F57FBBAFED3F9BE5E933FF1E5D45F4D6E66CF087E719FBCF729973FDDE73E6935F9FF2868437F968306E625CC2994F9FE711BDDCFA74AE9E63A728EA9312C5AEB28BA3C23EB67211EC8BE3A7B31EF6456DCAB515C673CDF5A939E9C3768670FCDF6BB89395E39F8EB5599BFE947CF2E76627DE12D1DC5650A3768B317C281E06B5EB5D7E0B997A0271913F87F73124B473C494180A6D091FE4DD603ED7183F3E33F654E45E4ABF7CDCAE5E89DC8C8A739F059FA76B4971BC3FC775F8B876B09E0EB61DCF13DF4923554F216564785DFE60FCF4F998C91F43FDEE5C94F8BC33E9C030DB689A4DE8231DFA5043735C0FE6A2E69EFBD5B907F63898E7357E3BDE5F47D112E7E84E569FEFB7F0CFEF4C8339A9DEB4CBEB42FFD76BF768BDF34FC664809F6E5EE1A07408B99D0DE69FFC79F60BFD0E26FF3E8566FEC9678C1B41ED311D3B987FF2F3A96BF239F3EBECF75E4BEF3EF57BFE7BE653F8C64F4FCF587E1A373DBDFF329FBE1C5B111111111111FD2FFB27ED49BB22 + diff --git a/Dht11/dht11.cpp b/Dht11/dht11.cpp new file mode 100644 index 0000000..3a949e7 --- /dev/null +++ b/Dht11/dht11.cpp @@ -0,0 +1,101 @@ +// +// FILE: dht11.cpp +// VERSION: 0.4.1 +// PURPOSE: DHT11 Temperature & Humidity Sensor library for Arduino +// LICENSE: GPL v3 (http://www.gnu.org/licenses/gpl.html) +// +// DATASHEET: http://www.micro4you.com/files/sensor/DHT11.pdf +// +// HISTORY: +// George Hadjikyriacou - Original version (??) +// Mod by SimKard - Version 0.2 (24/11/2010) +// Mod by Rob Tillaart - Version 0.3 (28/03/2011) +// + added comments +// + removed all non DHT11 specific code +// + added references +// Mod by Rob Tillaart - Version 0.4 (17/03/2012) +// + added 1.0 support +// Mod by Rob Tillaart - Version 0.4.1 (19/05/2012) +// + added error codes +// + +#include "dht11.h" + +// Return values: +// DHTLIB_OK +// DHTLIB_ERROR_CHECKSUM +// DHTLIB_ERROR_TIMEOUT +int dht11::read(int pin) +{ + // BUFFER TO RECEIVE + uint8_t bits[5]={0,0,0,0,0}; + uint8_t cnt = 7; + uint8_t idx = 0; + + // EMPTY BUFFER + for (int i=0; i< 5; i++) bits[i] = 0; + + // REQUEST SAMPLE + pinMode(pin, OUTPUT); + digitalWrite(pin, LOW); + delay(20); + digitalWrite(pin, HIGH); + delayMicroseconds(40); + pinMode(pin, INPUT); + + // ACKNOWLEDGE or TIMEOUT + unsigned int loopCnt = 80; + while(digitalRead(pin) == LOW) + { + delayMicroseconds(1); + if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; + } + + loopCnt = 80; + while(digitalRead(pin) == HIGH) + { + delayMicroseconds(1); + if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; + } + + // READ OUTPUT - 40 BITS => 5 BYTES or TIMEOUT + for (int i=0; i<40; i++) + { + loopCnt = 10000; + while(digitalRead(pin) == LOW) + if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; + + unsigned long t = micros(); + + loopCnt = 10000; + while(digitalRead(pin) == HIGH) + if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; + + if ((micros() - t) > 40) bits[idx] |= (1 << cnt); + if (cnt == 0) // next byte? + { + cnt = 7; // restart at MSB + idx++; // next byte! + } + else cnt--; + } + + // WRITE TO RIGHT VARS + // as bits[1] and bits[3] are allways zero they are omitted in formulas. + humidity = bits[0]; + temperature = bits[2]; + + byt0=bits[0]; + byt1=bits[1]; + byt2=bits[2]; + byt3=bits[3]; + byt4=bits[4]; + + uint8_t sum = bits[0] + bits[1]+bits[2]+bits[3]; + + if (bits[4] != sum) return DHTLIB_ERROR_CHECKSUM; + return DHTLIB_OK; +} +// +// END OF FILE +// diff --git a/Dht11/dht11.h b/Dht11/dht11.h new file mode 100644 index 0000000..ed899a9 --- /dev/null +++ b/Dht11/dht11.h @@ -0,0 +1,33 @@ + + +#ifndef dht11_h +#define dht11_h + +#if defined(ARDUINO) && (ARDUINO >= 100) +#include +#else +#include +#endif + +#define DHT11LIB_VERSION "0.4.1" + +#define DHTLIB_OK 0 +#define DHTLIB_ERROR_CHECKSUM -1 +#define DHTLIB_ERROR_TIMEOUT -2 + +class dht11 +{ +public: + int read(int pin); + int humidity; + int temperature; + int byt0; + int byt1; + int byt2; + int byt3; + int byt4; +}; +#endif +// +// END OF FILE +// diff --git a/Dht11/examples/dht11/dht11.ino b/Dht11/examples/dht11/dht11.ino new file mode 100644 index 0000000..9202308 --- /dev/null +++ b/Dht11/examples/dht11/dht11.ino @@ -0,0 +1,94 @@ +double Fahrenheit(double celsius) +{ + return 1.8 * celsius + 32; +} //摄氏温度度转化为华氏温度 + +double Kelvin(double celsius) +{ + return celsius + 273.15; +} //摄氏温度转化为开氏温度 + +// 露点(点在此温度时,空气饱和并产生露珠) +// 参考: http://wahiduddin.net/calc/density_algorithms.htm +double dewPoint(double celsius, double humidity) +{ + double A0= 373.15/(273.15 + celsius); + double SUM = -7.90298 * (A0-1); + SUM += 5.02808 * log10(A0); + SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ; + SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ; + SUM += log10(1013.246); + double VP = pow(10, SUM-3) * humidity; + double T = log(VP/0.61078); // temp var + return (241.88 * T) / (17.558-T); +} + +// 快速计算露点,速度是5倍dewPoint() +// 参考: http://en.wikipedia.org/wiki/Dew_point +double dewPointFast(double celsius, double humidity) +{ + double a = 17.271; + double b = 237.7; + double temp = (a * celsius) / (b + celsius) + log(humidity/100); + double Td = (b * temp) / (a - temp); + return Td; +} + +#include + +dht11 DHT11; + +#define DHT11PIN 2 + +void setup() +{ + Serial.begin(9600); + Serial.println("DHT11 TEST PROGRAM "); + Serial.print("LIBRARY VERSION: "); + Serial.println(DHT11LIB_VERSION); + Serial.println(); +} + +void loop() +{ + Serial.println("\n"); + + int chk = DHT11.read(DHT11PIN); + + Serial.print("Read sensor: "); + switch (chk) + { + case DHTLIB_OK: + Serial.println("OK"); + break; + case DHTLIB_ERROR_CHECKSUM: + Serial.println("Checksum error"); + break; + case DHTLIB_ERROR_TIMEOUT: + Serial.println("Time out error"); + break; + default: + Serial.println("Unknown error"); + break; + } + + Serial.print("Humidity (%): "); + Serial.println((float)DHT11.humidity, 2); + + Serial.print("Temperature (oC): "); + Serial.println((float)DHT11.temperature, 2); + + Serial.print("Temperature (oF): "); + Serial.println(Fahrenheit(DHT11.temperature), 2); + + Serial.print("Temperature (K): "); + Serial.println(Kelvin(DHT11.temperature), 2); + + Serial.print("Dew Point (oC): "); + Serial.println(dewPoint(DHT11.temperature, DHT11.humidity)); + + Serial.print("Dew PointFast (oC): "); + Serial.println(dewPointFast(DHT11.temperature, DHT11.humidity)); + + delay(2000); +} diff --git a/SimpleDHT/CONTRIBUTING.md b/SimpleDHT/CONTRIBUTING.md deleted file mode 100644 index 998600a..0000000 --- a/SimpleDHT/CONTRIBUTING.md +++ /dev/null @@ -1,13 +0,0 @@ -# Contribution Guidelines - -This library is the culmination of the expertise of many members of the open source community who have dedicated their time and hard work. The best way to ask for help or propose a new idea is to [create a new issue](https://github.com/winlinvip/SimpleDHT/issues/new) while creating a Pull Request with your code changes allows you to share your own innovations with the rest of the community. - -The following are some guidelines to observe when creating issues or PRs: - -- Be friendly; it is important that we can all enjoy a safe space as we are all working on the same project and it is okay for people to have different ideas - -- [Use code blocks](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet#code); it helps us help you when we can read your code! On that note also refrain from pasting more than 30 lines of code in a post, instead [create a gist](https://gist.github.com/) if you need to share large snippets - -- Use reasonable titles; refrain from using overly long or capitalized titles as they are usually annoying and do little to encourage others to help :smile: - -- Be detailed; refrain from mentioning code problems without sharing your source code and always give information regarding your board and version of the library. diff --git a/SimpleDHT/LICENSE b/SimpleDHT/LICENSE deleted file mode 100644 index 00dec4c..0000000 --- a/SimpleDHT/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016-2017 winlin - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/SimpleDHT/README.md b/SimpleDHT/README.md deleted file mode 100644 index 4b61043..0000000 --- a/SimpleDHT/README.md +++ /dev/null @@ -1,182 +0,0 @@ -# SimpleDHT - -## Description - -An Arduino library for the DHT series of low-cost temperature/humidity sensors. - -You can find DHT11 and DHT22 tutorials [here](https://learn.adafruit.com/dht). - -## Installation - -### First Method - -![image](https://user-images.githubusercontent.com/36513474/68069796-09e62200-fd87-11e9-81e0-dc75e38efed0.png) - -1. In the Arduino IDE, navigate to Sketch > Include Library > Manage Libraries -1. Then the Library Manager will open and you will find a list of libraries that are already installed or ready for installation. -1. Then search for SimpleDHT using the search bar. -1. Click on the text area and then select the specific version and install it. - -### Second Method - -1. Navigate to the [Releases page](https://github.com/winlinvip/SimpleDHT/releases). -1. Download the latest release. -1. Extract the zip file -1. In the Arduino IDE, navigate to Sketch > Include Library > Add .ZIP Library - -## Usage - -To use this library: - -1. Open example: Arduino => File => Examples => SimpleDHT => DHT11Default -1. Connect the DHT11 and upload the program to Arduino. -1. Open the Serial Window of Arduino IDE, we got the result as follows. - -```Cpp -================================= -Sample DHT11... -Sample OK: 19 *C, 31 H -================================= -Sample DHT11... -Sample OK: 19 *C, 31 H -================================= -``` - -> Remark: For DHT11, no more than 1 Hz sampling rate (once every second). -> Remark: For DHT22, no more than 0.5 Hz sampling rate (once every 2 seconds). - -## Features - -- ### Simple - - Simple C++ code with lots of comments. - -- ### Stable - - Strictly follow the standard DHT protocol. - -- ### Fast - - Support 0.5HZ(DHT22) or 1HZ(DHT11) sampling rate. - -- ### Compatible - - SimpleDHT sensor library is compatible with multiple low-cost temperatures and humidity sensors like DHT11 and DHT22. A few examples are implemented just to demonstrate how to modify the code for different sensors. - -- ### MIT License - - DHT sensor library is open-source and uses one of the most permissive licenses so you can use it on any project. - - - Commercial use - - Modification - - Distribution - - Private use - -## Functions - -- read() -- setPinInputMode() -- setPin() -- getBitmask() -- getPort() -- levelTime() -- bits2byte() -- parse() -- read2() -- sample() - -## Sensors - -- [x] DHT11, The [product](https://www.adafruit.com/product/386), [datasheet](https://akizukidenshi.com/download/ds/aosong/DHT11.pdf) and [example](https://github.com/winlinvip/SimpleDHT/tree/master/examples/DHT11Default), 1HZ sampling rate. -- [x] DHT22, The [product](https://www.adafruit.com/product/385), [datasheet](http://akizukidenshi.com/download/ds/aosong/AM2302.pdf) and [example](https://github.com/winlinvip/SimpleDHT/tree/master/examples/DHT22Default), 0.5Hz sampling rate. - -## Examples - -This library including the following examples: - -1. [DHT11Default](https://github.com/winlinvip/SimpleDHT/tree/master/examples/DHT11Default): Use DHT11 to sample. -1. [DHT11WithRawBits](https://github.com/winlinvip/SimpleDHT/tree/master/examples/DHT11WithRawBits): Use DHT11 to sample and get the 40bits RAW data. -1. [DHT11ErrCount](https://github.com/winlinvip/SimpleDHT/tree/master/examples/DHT11ErrCount): Use DHT11 to sample and stat the success rate. -1. [DHT22Default](https://github.com/winlinvip/SimpleDHT/tree/master/examples/DHT22Default): Use DHT22 to sample. -1. [DHT22WithRawBits](https://github.com/winlinvip/SimpleDHT/tree/master/examples/DHT22WithRawBits): Use DHT22 to sample and get the 40bits RAW data. -1. [DHT22Integer](https://github.com/winlinvip/SimpleDHT/tree/master/examples/DHT22Integer): Use DHT22 to sample and ignore the fractional data. -1. [DHT22ErrCount](https://github.com/winlinvip/SimpleDHT/tree/master/examples/DHT22ErrCount): Use DHT22 to sample and stat the success rate. -1. [TwoSensorsDefault](https://github.com/winlinvip/SimpleDHT/tree/master/examples/TwoSensorsDefault): Use two DHT11 to sample. - -One of the SimpleDHT examples is the following: - -- ### DHT22Integer - -```Cpp -#include - -int pinDHT22 = 2; -SimpleDHT22 dht22(pinDHT22); - -void setup() { - Serial.begin(115200); -} - -void loop() { - - Serial.println("================================="); - Serial.println("Sample DHT22..."); - - byte temperature = 0; - byte humidity = 0; - int err = SimpleDHTErrSuccess; - if ((err = dht22.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) { - Serial.print("Read DHT22 failed, err="); Serial.print(SimpleDHTErrCode(err)); - Serial.print(","); Serial.println(SimpleDHTErrDuration(err)); delay(2000); - return; - } - - Serial.print("Sample OK: "); - Serial.print((int)temperature); Serial.print(" *C, "); - Serial.print((int)humidity); Serial.println(" RH%"); - - delay(2500); -} -``` - -## Links - -1. [adafruit/DHT-sensor-library](https://github.com/adafruit/DHT-sensor-library) -1. [Arduino #4469: Add SimpleDHT library.](https://github.com/arduino/Arduino/issues/4469) -1. [DHT11 datasheet and protocol.](https://akizukidenshi.com/download/ds/aosong/DHT11.pdf) -1. [DHT22 datasheet and protoocl.](http://akizukidenshi.com/download/ds/aosong/AM2302.pdf) - -Winlin 2016.1 - -## Contributing - -If you want to contribute to this project: - -- Report bugs and errors -- Ask for enhancements -- Create issues and pull requests -- Tell others about this library -- Contribute new protocols - -Please read [CONTRIBUTING.md](https://github.com/winlinvip/SimpleDHT/blob/master/CONTRIBUTING.md) for details on our code of conduct, and the process for submitting pull requests to us. - -## Credits - -The author and maintainer of this library is Winlin . - -Based on previous work by: - -- t-w -- O. Santos -- P. H. Dabrowski -- per1234 -- P. Rinn -- G. M. Vacondio -- D. Faust -- C. Stroie -- Samlof -- Agha Saad Fraz - -## License - -This library is licensed under [MIT](https://github.com/winlinvip/SimpleDHT/blob/master/LICENSE). diff --git a/SimpleDHT/SimpleDHT.cpp b/SimpleDHT/SimpleDHT.cpp deleted file mode 100644 index 6fa990a..0000000 --- a/SimpleDHT/SimpleDHT.cpp +++ /dev/null @@ -1,364 +0,0 @@ -/* -The MIT License (MIT) - -Copyright (c) 2016-2017 winlin - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -*/ - -#include "SimpleDHT.h" - -SimpleDHT::SimpleDHT() { -} - -SimpleDHT::SimpleDHT(int pin) { - setPin(pin); -} - -void SimpleDHT::setPin(int pin) { - this->pin = pin; -#ifdef __AVR - // (only AVR) - set low level properties for configured pin - bitmask = digitalPinToBitMask(pin); - port = digitalPinToPort(pin); -#endif -} - -int SimpleDHT::setPinInputMode(uint8_t mode) { - if (mode != INPUT && mode != INPUT_PULLUP) { - return SimpleDHTErrPinMode; - } - this->pinInputMode = mode; - return SimpleDHTErrSuccess; -} - -int SimpleDHT::read(byte* ptemperature, byte* phumidity, byte pdata[40]) { - int ret = SimpleDHTErrSuccess; - - if (pin == -1) { - return SimpleDHTErrNoPin; - } - - float temperature = 0; - float humidity = 0; - if ((ret = read2(&temperature, &humidity, pdata)) != SimpleDHTErrSuccess) { - return ret; - } - - if (ptemperature) { - *ptemperature = (byte)(int)temperature; - } - - if (phumidity) { - *phumidity = (byte)(int)humidity; - } - - return ret; -} - -int SimpleDHT::read(int pin, byte* ptemperature, byte* phumidity, byte pdata[40]) { - setPin(pin); - return read(ptemperature, phumidity, pdata); -} - -#ifdef __AVR -int SimpleDHT::getBitmask() { - return bitmask; -} - -int SimpleDHT::getPort() { - return port; -} -#endif - -long SimpleDHT::levelTime(byte level, int firstWait, int interval) { - unsigned long time_start = micros(); - long time = 0; - -#ifdef __AVR - uint8_t portState = level ? bitmask : 0; -#endif - - bool loop = true; - for (int i = 0 ; loop; i++) { - if (time < 0 || time > levelTimeout) { - return -1; - } - - if (i == 0) { - if (firstWait > 0) { - delayMicroseconds(firstWait); - } - } else if (interval > 0) { - delayMicroseconds(interval); - } - - // for an unsigned int type, the difference have a correct value - // even if overflow, explanation here: - // https://arduino.stackexchange.com/questions/33572/arduino-countdown-without-using-delay - time = micros() - time_start; - -#ifdef __AVR - loop = ((*portInputRegister(port) & bitmask) == portState); -#else - loop = (digitalRead(pin) == level); -#endif - } - - return time; -} - -byte SimpleDHT::bits2byte(byte data[8]) { - byte v = 0; - for (int i = 0; i < 8; i++) { - v += data[i] << (7 - i); - } - return v; -} - -int SimpleDHT::parse(byte data[40], short* ptemperature, short* phumidity) { - short humidity = bits2byte(data); - short humidity2 = bits2byte(data + 8); - short temperature = bits2byte(data + 16); - short temperature2 = bits2byte(data + 24); - byte check = bits2byte(data + 32); - byte expect = (byte)humidity + (byte)humidity2 + (byte)temperature + (byte)temperature2; - if (check != expect) { - return SimpleDHTErrDataChecksum; - } - - *ptemperature = temperature<<8 | temperature2; - *phumidity = humidity<<8 | humidity2; - - return SimpleDHTErrSuccess; -} - -SimpleDHT11::SimpleDHT11() { -} - -SimpleDHT11::SimpleDHT11(int pin) : SimpleDHT (pin) { -} - -int SimpleDHT11::read2(float* ptemperature, float* phumidity, byte pdata[40]) { - int ret = SimpleDHTErrSuccess; - - if (pin == -1) { - return SimpleDHTErrNoPin; - } - - byte data[40] = {0}; - if ((ret = sample(data)) != SimpleDHTErrSuccess) { - return ret; - } - - short temperature = 0; - short humidity = 0; - if ((ret = parse(data, &temperature, &humidity)) != SimpleDHTErrSuccess) { - return ret; - } - - if (pdata) { - memcpy(pdata, data, 40); - } - if (ptemperature) { - *ptemperature = (int)(temperature>>8); - } - if (phumidity) { - *phumidity = (int)(humidity>>8); - } - - // For example, when remove the data line, it will be success with zero data. - if (temperature == 0 && humidity == 0) { - return SimpleDHTErrZeroSamples; - } - - return ret; -} - -int SimpleDHT11::read2(int pin, float* ptemperature, float* phumidity, byte pdata[40]) { - setPin(pin); - return read2(ptemperature, phumidity, pdata); -} - -int SimpleDHT11::sample(byte data[40]) { - // empty output data. - memset(data, 0, 40); - - // According to protocol: [1] https://akizukidenshi.com/download/ds/aosong/DHT11.pdf - // notify DHT11 to start: - // 1. PULL LOW 20ms. - // 2. PULL HIGH 20-40us. - // 3. SET TO INPUT or INPUT_PULLUP. - // Changes in timing done according to: - // [2] https://www.mouser.com/ds/2/758/DHT11-Technical-Data-Sheet-Translated-Version-1143054.pdf - // - original values specified in code - // - since they were not working (MCU-dependent timing?), replace in code with - // _working_ values based on measurements done with levelTimePrecise() - pinMode(pin, OUTPUT); - digitalWrite(pin, LOW); // 1. - delay(20); // specs [2]: 18us - - // Pull high and set to input, before wait 40us. - // @see https://github.com/winlinvip/SimpleDHT/issues/4 - // @see https://github.com/winlinvip/SimpleDHT/pull/5 - digitalWrite(pin, HIGH); // 2. - pinMode(pin, this->pinInputMode); - delayMicroseconds(25); // specs [2]: 20-40us - - // DHT11 starting: - // 1. PULL LOW 80us - // 2. PULL HIGH 80us - long t = levelTime(LOW); // 1. - if (t < 30) { // specs [2]: 80us - return simpleDHTCombileError(t, SimpleDHTErrStartLow); - } - - t = levelTime(HIGH); // 2. - if (t < 50) { // specs [2]: 80us - return simpleDHTCombileError(t, SimpleDHTErrStartHigh); - } - - // DHT11 data transmite: - // 1. 1bit start, PULL LOW 50us - // 2. PULL HIGH: - // - 26-28us, bit(0) - // - 70us, bit(1) - for (int j = 0; j < 40; j++) { - t = levelTime(LOW); // 1. - if (t < 24) { // specs says: 50us - return simpleDHTCombileError(t, SimpleDHTErrDataLow); - } - - // read a bit - t = levelTime(HIGH); // 2. - if (t < 11) { // specs say: 20us - return simpleDHTCombileError(t, SimpleDHTErrDataRead); - } - data[ j ] = (t > 40 ? 1 : 0); // specs: 26-28us -> 0, 70us -> 1 - } - - // DHT11 EOF: - // 1. PULL LOW 50us. - t = levelTime(LOW); // 1. - if (t < 24) { // specs say: 50us - return simpleDHTCombileError(t, SimpleDHTErrDataEOF); - } - - return SimpleDHTErrSuccess; -} - -SimpleDHT22::SimpleDHT22() { -} - -SimpleDHT22::SimpleDHT22(int pin) : SimpleDHT (pin) { -} - -int SimpleDHT22::read2(float* ptemperature, float* phumidity, byte pdata[40]) { - int ret = SimpleDHTErrSuccess; - - if (pin == -1) { - return SimpleDHTErrNoPin; - } - - byte data[40] = {0}; - if ((ret = sample(data)) != SimpleDHTErrSuccess) { - return ret; - } - - short temperature = 0; - short humidity = 0; - if ((ret = parse(data, &temperature, &humidity)) != SimpleDHTErrSuccess) { - return ret; - } - - if (pdata) { - memcpy(pdata, data, 40); - } - if (ptemperature) { - *ptemperature = (float)((temperature & 0x8000 ? -1 : 1) * (temperature & 0x7FFF)) / 10.0; - } - if (phumidity) { - *phumidity = (float)humidity / 10.0; - } - - return ret; -} - -int SimpleDHT22::read2(int pin, float* ptemperature, float* phumidity, byte pdata[40]) { - setPin(pin); - return read2(ptemperature, phumidity, pdata); -} - -int SimpleDHT22::sample(byte data[40]) { - // empty output data. - memset(data, 0, 40); - - // According to protocol: http://akizukidenshi.com/download/ds/aosong/AM2302.pdf - // notify DHT22 to start: - // 1. T(be), PULL LOW 1ms(0.8-20ms). - // 2. T(go), PULL HIGH 30us(20-200us), use 40us. - // 3. SET TO INPUT or INPUT_PULLUP. - pinMode(pin, OUTPUT); - digitalWrite(pin, LOW); - delayMicroseconds(1000); - // Pull high and set to input, before wait 40us. - // @see https://github.com/winlinvip/SimpleDHT/issues/4 - // @see https://github.com/winlinvip/SimpleDHT/pull/5 - digitalWrite(pin, HIGH); - pinMode(pin, this->pinInputMode); - delayMicroseconds(40); - - // DHT22 starting: - // 1. T(rel), PULL LOW 80us(75-85us). - // 2. T(reh), PULL HIGH 80us(75-85us). - long t = 0; - if ((t = levelTime(LOW)) < 30) { - return simpleDHTCombileError(t, SimpleDHTErrStartLow); - } - if ((t = levelTime(HIGH)) < 50) { - return simpleDHTCombileError(t, SimpleDHTErrStartHigh); - } - - // DHT22 data transmite: - // 1. T(LOW), 1bit start, PULL LOW 50us(48-55us). - // 2. T(H0), PULL HIGH 26us(22-30us), bit(0) - // 3. T(H1), PULL HIGH 70us(68-75us), bit(1) - for (int j = 0; j < 40; j++) { - t = levelTime(LOW); // 1. - if (t < 24) { // specs says: 50us - return simpleDHTCombileError(t, SimpleDHTErrDataLow); - } - - // read a bit - t = levelTime(HIGH); // 2. - if (t < 11) { // specs say: 26us - return simpleDHTCombileError(t, SimpleDHTErrDataRead); - } - data[ j ] = (t > 40 ? 1 : 0); // specs: 22-30us -> 0, 70us -> 1 - } - - // DHT22 EOF: - // 1. T(en), PULL LOW 50us(45-55us). - t = levelTime(LOW); - if (t < 24) { - return simpleDHTCombileError(t, SimpleDHTErrDataEOF); - } - - return SimpleDHTErrSuccess; -} diff --git a/SimpleDHT/SimpleDHT.h b/SimpleDHT/SimpleDHT.h deleted file mode 100644 index f931d87..0000000 --- a/SimpleDHT/SimpleDHT.h +++ /dev/null @@ -1,189 +0,0 @@ -/* - The MIT License (MIT) - - Copyright (c) 2016-2017 winlin - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - */ - -#ifndef __SIMPLE_DHT_H -#define __SIMPLE_DHT_H - -#include - -// High 8bits are time duration. -// Low 8bits are error code. -// For example, 0x0310 means t=0x03 and code=0x10, -// which is start low signal(0x10) error. -// @see https://github.com/winlinvip/SimpleDHT/issues/25 -#define simpleDHTCombileError(t, err) ((t << 8) & 0xff00) | (err & 0x00ff) - -// Get the time duration from error. -#define SimpleDHTErrDuration(err) ((err&0xff00)>>8) -// Get the error code defined bellow. -#define SimpleDHTErrCode(err) (err&0x00ff) - -// Success. -#define SimpleDHTErrSuccess 0 -// Error to wait for start low signal. -#define SimpleDHTErrStartLow 16 -// Error to wait for start high signal. -#define SimpleDHTErrStartHigh 17 -// Error to wait for data start low signal. -#define SimpleDHTErrDataLow 18 -// Error to wait for data read signal. -#define SimpleDHTErrDataRead 19 -// Error to wait for data EOF signal. -#define SimpleDHTErrDataEOF 20 -// Error to validate the checksum. -#define SimpleDHTErrDataChecksum 21 -// Error when temperature and humidity are zero, it shouldn't happen. -#define SimpleDHTErrZeroSamples 22 -// Error when pin is not initialized. -#define SimpleDHTErrNoPin 23 -// Error when pin mode is invalid. -#define SimpleDHTErrPinMode 24 - -class SimpleDHT { -protected: - long levelTimeout = 500000; // 500ms - int pin = -1; - uint8_t pinInputMode = INPUT; -#ifdef __AVR - // For direct GPIO access (8-bit AVRs only), store port and bitmask - // of the digital pin connected to the DHT. - // (other platforms use digitalRead(), do not need this) - uint8_t bitmask = 0xFF; - uint8_t port = 0xFF; -#endif -public: - SimpleDHT(); - SimpleDHT(int pin); -public: - // To (eventually) change the pin configuration for existing instance - // @param pin The DHT11 or DHT22 pin. - virtual void setPin(int pin); - // Set the input mode of the pin from INPUT and INPUT_PULLUP - // to permit the use of the internal pullup resistor for - // for bare modules - // @param mode the pin input mode. - // @return SimpleDHTErrSuccess is success; otherwise, failed. - virtual int setPinInputMode(uint8_t mode); -public: - // Read from dht11 or dht22. - // @param pin The DHT11 pin. - // @param ptemperature output, NULL to igore. In Celsius. - // @param phumidity output, NULL to ignore. - // For DHT11, in H, such as 35H. - // For DHT22, in RH%, such as 53%RH. - // @param pdata output 40bits sample, NULL to ignore. - // @remark the min delay for this method is 1s(DHT11) or 2s(DHT22). - // @return SimpleDHTErrSuccess is success; otherwise, failed. - virtual int read(byte* ptemperature, byte* phumidity, byte pdata[40]); - virtual int read(int pin, byte* ptemperature, byte* phumidity, byte pdata[40]); - // To get a more accurate data. - // @remark it's available for dht22. for dht11, it's the same of read(). - virtual int read2(float* ptemperature, float* phumidity, byte pdata[40]) = 0; - virtual int read2(int pin, float* ptemperature, float* phumidity, byte pdata[40]) = 0; -protected: - // For only AVR - methods returning low level conf. of the pin -#ifdef __AVR - // @return Bitmask to access pin state from port input register - virtual int getBitmask(); - // @return Bitmask to access pin state from port input register - virtual int getPort(); -#endif -protected: - // Measure and return time (in microseconds) - // with precision defined by interval between checking the state - // while pin is in specified state (HIGH or LOW) - // @param level state which time is measured. - // @param interval time interval between consecutive state checks. - // @return measured time (microseconds). -1 if timeout. - virtual long levelTime(byte level, int firstWait = 10, int interval = 6); - // @data the bits of a byte. - // @remark please use simple_dht11_read(). - virtual byte bits2byte(byte data[8]); - // read temperature and humidity from dht11. - // @param data a byte[40] to read bits to 5bytes. - // @return 0 success; otherwise, error. - // @remark please use simple_dht11_read(). - virtual int sample(byte data[40]) = 0; - // parse the 40bits data to temperature and humidity. - // @remark please use simple_dht11_read(). - virtual int parse(byte data[40], short* ptemperature, short* phumidity); -}; - -/* - Simple DHT11 - - Simple, Stable and Fast DHT11 library. - - The circuit: - * VCC: 5V or 3V - * GND: GND - * DATA: Digital ping, for instance 2. - - 23 Jan 2016 By winlin - - https://github.com/winlinvip/SimpleDHT#usage - https://akizukidenshi.com/download/ds/aosong/DHT11.pdf - https://cdn-shop.adafruit.com/datasheets/DHT11-chinese.pdf - -*/ -class SimpleDHT11 : public SimpleDHT { -public: - SimpleDHT11(); - SimpleDHT11(int pin); -public: - virtual int read2(float* ptemperature, float* phumidity, byte pdata[40]); - virtual int read2(int pin, float* ptemperature, float* phumidity, byte pdata[40]); -protected: - virtual int sample(byte data[40]); -}; - -/* - Simple DHT22 - - Simple, Stable and Fast DHT22 library. - - The circuit: - * VCC: 5V or 3V - * GND: GND - * DATA: Digital ping, for instance 2. - - 3 Jun 2017 By winlin - - https://github.com/winlinvip/SimpleDHT#usage - http://akizukidenshi.com/download/ds/aosong/AM2302.pdf - https://cdn-shop.adafruit.com/datasheets/DHT22.pdf - -*/ -class SimpleDHT22 : public SimpleDHT { -public: - SimpleDHT22(); - SimpleDHT22(int pin); -public: - virtual int read2(float* ptemperature, float* phumidity, byte pdata[40]); - virtual int read2(int pin, float* ptemperature, float* phumidity, byte pdata[40]); -protected: - virtual int sample(byte data[40]); -}; - -#endif diff --git a/SimpleDHT/examples/DHT11Default/DHT11Default.ino b/SimpleDHT/examples/DHT11Default/DHT11Default.ino deleted file mode 100644 index a0aca08..0000000 --- a/SimpleDHT/examples/DHT11Default/DHT11Default.ino +++ /dev/null @@ -1,35 +0,0 @@ -#include - -// for DHT11, -// VCC: 5V or 3V -// GND: GND -// DATA: 2 -int pinDHT11 = 2; -SimpleDHT11 dht11(pinDHT11); - -void setup() { - Serial.begin(115200); -} - -void loop() { - // start working... - Serial.println("================================="); - Serial.println("Sample DHT11..."); - - // read without samples. - byte temperature = 0; - byte humidity = 0; - int err = SimpleDHTErrSuccess; - if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) { - Serial.print("Read DHT11 failed, err="); Serial.print(SimpleDHTErrCode(err)); - Serial.print(","); Serial.println(SimpleDHTErrDuration(err)); delay(1000); - return; - } - - Serial.print("Sample OK: "); - Serial.print((int)temperature); Serial.print(" *C, "); - Serial.print((int)humidity); Serial.println(" H"); - - // DHT11 sampling rate is 1HZ. - delay(1500); -} diff --git a/SimpleDHT/examples/DHT11ErrCount/DHT11ErrCount.ino b/SimpleDHT/examples/DHT11ErrCount/DHT11ErrCount.ino deleted file mode 100644 index b95c308..0000000 --- a/SimpleDHT/examples/DHT11ErrCount/DHT11ErrCount.ino +++ /dev/null @@ -1,42 +0,0 @@ -#include - -// for DHT11, -// VCC: 5V or 3V -// GND: GND -// DATA: 2 -int pinDHT11 = 2; -SimpleDHT11 dht11(pinDHT11); - -void setup() { - Serial.begin(115200); -} - -void loop() { - // start working... - Serial.println("================================="); - Serial.println("Sample DHT11 with error count"); - - int cnt = 0; - int err_cnt = 0; - for (;;) { - cnt++; - - byte temperature = 0; - byte humidity = 0; - int err = SimpleDHTErrSuccess; - if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) { - Serial.print("Read DHT11 failed, err="); Serial.print(SimpleDHTErrCode(err)); - Serial.print(","); Serial.print(SimpleDHTErrDuration(err)); - err_cnt++; - } else { - Serial.print("DHT11, "); - Serial.print((int)temperature); Serial.print(" *C, "); - Serial.print((int)humidity); Serial.print(" H"); - } - Serial.print(", total: "); Serial.print(cnt); - Serial.print(", err: "); Serial.print(err_cnt); - Serial.print(", success rate: "); Serial.print((cnt - err_cnt) * 100.0 / (float)cnt); Serial.println("%"); - - delay(1500); - } -} diff --git a/SimpleDHT/examples/DHT11WithRawBits/DHT11WithRawBits.ino b/SimpleDHT/examples/DHT11WithRawBits/DHT11WithRawBits.ino deleted file mode 100644 index a2408d1..0000000 --- a/SimpleDHT/examples/DHT11WithRawBits/DHT11WithRawBits.ino +++ /dev/null @@ -1,45 +0,0 @@ -#include - -// for DHT11, -// VCC: 5V or 3V -// GND: GND -// DATA: 2 -int pinDHT11 = 2; -SimpleDHT11 dht11(pinDHT11); - -void setup() { - Serial.begin(115200); -} - -void loop() { - // start working... - Serial.println("================================="); - Serial.println("Sample DHT11 with RAW bits..."); - - // read with raw sample data. - byte temperature = 0; - byte humidity = 0; - byte data[40] = {0}; - int err = SimpleDHTErrSuccess; - if ((err = dht11.read(&temperature, &humidity, data)) != SimpleDHTErrSuccess) { - Serial.print("Read DHT11 failed, err="); Serial.print(SimpleDHTErrCode(err)); - Serial.print(","); Serial.println(SimpleDHTErrDuration(err)); delay(1000); - return; - } - - Serial.print("Sample RAW Bits: "); - for (int i = 0; i < 40; i++) { - Serial.print((int)data[i]); - if (i > 0 && ((i + 1) % 4) == 0) { - Serial.print(' '); - } - } - Serial.println(""); - - Serial.print("Sample OK: "); - Serial.print((int)temperature); Serial.print(" *C, "); - Serial.print((int)humidity); Serial.println(" H"); - - // DHT11 sampling rate is 1HZ. - delay(1500); -} diff --git a/SimpleDHT/examples/DHT22Default/DHT22Default.ino b/SimpleDHT/examples/DHT22Default/DHT22Default.ino deleted file mode 100644 index eabdba5..0000000 --- a/SimpleDHT/examples/DHT22Default/DHT22Default.ino +++ /dev/null @@ -1,37 +0,0 @@ -#include - -// for DHT22, -// VCC: 5V or 3V -// GND: GND -// DATA: 2 -int pinDHT22 = 2; -SimpleDHT22 dht22(pinDHT22); - -void setup() { - Serial.begin(115200); -} - -void loop() { - // start working... - Serial.println("================================="); - Serial.println("Sample DHT22..."); - - // read without samples. - // @remark We use read2 to get a float data, such as 10.1*C - // if user doesn't care about the accurate data, use read to get a byte data, such as 10*C. - float temperature = 0; - float humidity = 0; - int err = SimpleDHTErrSuccess; - if ((err = dht22.read2(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) { - Serial.print("Read DHT22 failed, err="); Serial.print(SimpleDHTErrCode(err)); - Serial.print(","); Serial.println(SimpleDHTErrDuration(err)); delay(2000); - return; - } - - Serial.print("Sample OK: "); - Serial.print((float)temperature); Serial.print(" *C, "); - Serial.print((float)humidity); Serial.println(" RH%"); - - // DHT22 sampling rate is 0.5HZ. - delay(2500); -} diff --git a/SimpleDHT/examples/DHT22ErrCount/DHT22ErrCount.ino b/SimpleDHT/examples/DHT22ErrCount/DHT22ErrCount.ino deleted file mode 100644 index 4c3e771..0000000 --- a/SimpleDHT/examples/DHT22ErrCount/DHT22ErrCount.ino +++ /dev/null @@ -1,42 +0,0 @@ -#include - -// for DHT22, -// VCC: 5V or 3V -// GND: GND -// DATA: 2 -int pinDHT22 = 2; -SimpleDHT22 dht22(pinDHT22); - -void setup() { - Serial.begin(115200); -} - -void loop() { - // start working... - Serial.println("================================="); - Serial.println("Sample DHT22 with error count"); - - int cnt = 0; - int err_cnt = 0; - for (;;) { - cnt++; - - float temperature = 0; - float humidity = 0; - int err = SimpleDHTErrSuccess; - if ((err = dht22.read2(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) { - Serial.print("Read DHT22 failed, err="); Serial.print(SimpleDHTErrCode(err)); - Serial.print(","); Serial.print(SimpleDHTErrDuration(err)); - err_cnt++; - } else { - Serial.print("DHT22, "); - Serial.print((float)temperature); Serial.print(" *C, "); - Serial.print((float)humidity); Serial.print(" RH%"); - } - Serial.print(", total: "); Serial.print(cnt); - Serial.print(", err: "); Serial.print(err_cnt); - Serial.print(", success rate: "); Serial.print((cnt - err_cnt) * 100.0 / (float)cnt); Serial.println("%"); - - delay(2500); - } -} diff --git a/SimpleDHT/examples/DHT22Integer/DHT22Integer.ino b/SimpleDHT/examples/DHT22Integer/DHT22Integer.ino deleted file mode 100644 index 1f3ed47..0000000 --- a/SimpleDHT/examples/DHT22Integer/DHT22Integer.ino +++ /dev/null @@ -1,35 +0,0 @@ -#include - -// for DHT22, -// VCC: 5V or 3V -// GND: GND -// DATA: 2 -int pinDHT22 = 2; -SimpleDHT22 dht22(pinDHT22); - -void setup() { - Serial.begin(115200); -} - -void loop() { - // start working... - Serial.println("================================="); - Serial.println("Sample DHT22..."); - - // read without samples. - byte temperature = 0; - byte humidity = 0; - int err = SimpleDHTErrSuccess; - if ((err = dht22.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) { - Serial.print("Read DHT22 failed, err="); Serial.print(SimpleDHTErrCode(err)); - Serial.print(","); Serial.println(SimpleDHTErrDuration(err)); delay(2000); - return; - } - - Serial.print("Sample OK: "); - Serial.print((int)temperature); Serial.print(" *C, "); - Serial.print((int)humidity); Serial.println(" RH%"); - - // DHT22 sampling rate is 0.5HZ. - delay(2500); -} diff --git a/SimpleDHT/examples/DHT22WithRawBits/DHT22WithRawBits.ino b/SimpleDHT/examples/DHT22WithRawBits/DHT22WithRawBits.ino deleted file mode 100644 index d1d5b24..0000000 --- a/SimpleDHT/examples/DHT22WithRawBits/DHT22WithRawBits.ino +++ /dev/null @@ -1,47 +0,0 @@ -#include - -// for DHT22, -// VCC: 5V or 3V -// GND: GND -// DATA: 2 -int pinDHT22 = 2; -SimpleDHT22 dht22(pinDHT22); - -void setup() { - Serial.begin(115200); -} - -void loop() { - // start working... - Serial.println("================================="); - Serial.println("Sample DHT22 with RAW bits..."); - - // read with raw sample data. - // @remark We use read2 to get a float data, such as 10.1*C - // if user doesn't care about the accurate data, use read to get a byte data, such as 10*C. - float temperature = 0; - float humidity = 0; - byte data[40] = {0}; - int err = SimpleDHTErrSuccess; - if ((err = dht22.read2(&temperature, &humidity, data)) != SimpleDHTErrSuccess) { - Serial.print("Read DHT22 failed, err="); Serial.print(SimpleDHTErrCode(err)); - Serial.print(","); Serial.println(SimpleDHTErrDuration(err)); delay(2000); - return; - } - - Serial.print("Sample RAW Bits: "); - for (int i = 0; i < 40; i++) { - Serial.print((int)data[i]); - if (i > 0 && ((i + 1) % 4) == 0) { - Serial.print(' '); - } - } - Serial.println(""); - - Serial.print("Sample OK: "); - Serial.print((float)temperature); Serial.print(" *C, "); - Serial.print((float)humidity); Serial.println(" RH%"); - - // DHT22 sampling rate is 0.5HZ. - delay(2500); -} diff --git a/SimpleDHT/examples/TwoSensorsDefault/TwoSensorsDefault.ino b/SimpleDHT/examples/TwoSensorsDefault/TwoSensorsDefault.ino deleted file mode 100644 index 3397282..0000000 --- a/SimpleDHT/examples/TwoSensorsDefault/TwoSensorsDefault.ino +++ /dev/null @@ -1,66 +0,0 @@ -#include - -// Created by santosomar Ωr using SimpleDHT library to read data from two DHT11 sensors -// for DHT11, -// VCC: 5V or 3V -// GND: GND -// SENSOR 1 is in Digital Data pin: 2 -// SENSOR 2 is in Digital Data pin: 4 - -int dataPinSensor1 = 2; -int dataPinSensor2 = 4; -SimpleDHT11 dht1(dataPinSensor1); -SimpleDHT11 dht2(dataPinSensor2); - -void setup() { - Serial.begin(115200); -} - -void loop() { - // Reading data from sensor 1... - Serial.println("================================="); - - // Reading data from sensor 1... - Serial.println("Getting data from sensor 1..."); - - // read without samples. - byte temperature = 0; - byte humidity = 0; - int err = SimpleDHTErrSuccess; - if ((err = dht1.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) { - Serial.print("Read Sensor 1 failed, err="); Serial.print(SimpleDHTErrCode(err)); - Serial.print(","); Serial.println(SimpleDHTErrDuration(err)); delay(1000); - return; - } - - // converting Celsius to Fahrenheit - byte f = temperature * 1.8 + 32; - Serial.print("Sample OK: "); - Serial.print((int)temperature); Serial.print(" *C, "); - Serial.print((int)f); Serial.print(" *F, "); - Serial.print((int)humidity); Serial.println(" H humidity"); - - - // Reading data from sensor 2... - // ============================ - Serial.println("Getting data from sensor 2..."); - - byte temperature2 = 0; - byte humidity2 = 0; - if ((err = dht2.read(&temperature2, &humidity2, NULL)) != SimpleDHTErrSuccess) { - Serial.print("Read Sensor 2 failed, err="); Serial.print(SimpleDHTErrCode(err)); - Serial.print(","); Serial.println(SimpleDHTErrDuration(err)); delay(1000); - return; - } - - // converting Celsius to Fahrenheit - byte fb = temperature2 * 1.8 + 32; - - Serial.print("Sample OK: "); - Serial.print((int)temperature2); Serial.print(" *C, "); - Serial.print((int)fb); Serial.print(" *F, "); - Serial.print((int)humidity2); Serial.println(" H humidity"); - - // DHT11 sampling rate is 1HZ. - delay(1500); -} diff --git a/SimpleDHT/keywords.txt b/SimpleDHT/keywords.txt deleted file mode 100644 index 85bd132..0000000 --- a/SimpleDHT/keywords.txt +++ /dev/null @@ -1,18 +0,0 @@ -########################################### -# Syntax Coloring Map For SimpleDHT -########################################### - -########################################### -# Datatypes (KEYWORD1) -########################################### -SimpleDHT11 KEYWORD1 -SimpleDHT22 KEYWORD1 - -########################################### -# Methods and Functions (KEYWORD2) -########################################### -read KEYWORD2 - -########################################### -# Constants (LITERAL1) -########################################### diff --git a/SimpleDHT/library.properties b/SimpleDHT/library.properties deleted file mode 100644 index b56786a..0000000 --- a/SimpleDHT/library.properties +++ /dev/null @@ -1,9 +0,0 @@ -name=SimpleDHT -version=1.0.15 -author=Winlin -maintainer=Winlin -sentence=Arduino Temp & Humidity Sensors for DHT11 and DHT22. -paragraph=Simple C++ code with lots of comments, strictly follow the standard DHT protocol, supports 0.5HZ(DHT22) or 1HZ(DHT11) sampling rate. -category=Sensors -url=https://github.com/winlinvip/SimpleDHT -architectures=*