Mihai Popa
Published © Apache-2.0

Christmas tree decoration

Christmas tree decoration

IntermediateFull instructions provided1 hour499
Christmas tree decoration

Things used in this project

Hardware components

USBasp programmer
×1
JDY-31 BT module
×1
Coin Cell Battery CR2032
Coin Cell Battery CR2032
×2
CR2032 battery holder
×2
6 pin female header
×1

Software apps and online services

Arduino IDE
Arduino IDE
EasyEDA
JLCPCB EasyEDA

Hand tools and fabrication machines

Soldering iron (generic)
Soldering iron (generic)
Multimeter generic
Tools used in electronics

Story

Read more

Schematics

Ornament schematic

Schematic

BOM

Gerber files

Code

SparkFun_LED_Array_8x7_Arduino library

C/C++
This is the original library, from Sparkfun
No preview (download only).

BadgerArray example

C/C++
No preview (download only).

ATMega328PB datasheet

Plain text
No preview (download only).

JDY-31 Bluetooth Module datasheet

Plain text
No preview (download only).

Modified Sparkfun LED_Array_8x7_Arduino_Library-master

C/C++
Modified library
No preview (download only).

Code for Christmas tree ornament

C/C++
Code for Christmas tree ornament
#include <EEPROM.h>
#include <SparkFun_LED_8x7.h>
#include <Chaplex.h>

//Define pins for switches
const int buttonPin1 = A1;  // PC1 - SW1
const int buttonPin2 = A2;  // PC2 - SW2

//Variables used for read and display temperature:
const int temperaturePin = A0;  //singnal pin from temp sensor is 
int sensor_value;               //value read from analog pin A0
float voltage;
float temperature;

//Variables used for displaying shapes on led matrix::
//byte i;
int x;
int y;
int state;
byte radius;

//Define the bitmap dimention used to display normal bitmap:
const int width = 8;
const int height = 7;

//Define the bitmap dimention used to display normal bitmap:
//const int matrix_height = 7;

//Define pind connected to the led matrix:
byte led_pins[] = {2, 3, 4, 5, 6, 7, 8, 9}; // Pins for LEDs

//Define eeprom address from where the message is saved:
const int eepromAddress = 0;  // Adresa de pornire n EEPROM

//Define the time/character (in miliseconds) used to dis[lay text on matrix:
const word ms_per_char = 700;  // Durata pentru defilarea unui singur caracter (n milisecunde)

//Define the maximum text length display:
#define MAX_TEXT_LENGTH 40  // Limita maxim de caractere pentru text

//Initiate a buffer for scrolling text:
char textBuffer[MAX_TEXT_LENGTH + 1];  // Buffer for received text + 1 character: '\0' (string termination)
String serialInput = "";               // Buffer for received text from Serial
const int textStartAddress = 0;        // EEPROM address from where the text is started

// Temporary buffer used for normal bitmap (7 lines x 8 columns)
byte temp_bitmap[width * height];

// Temporrary buffer used for large bitmap (14 lines x 8 columns)
//byte temp_bitmap_1[width * matrix_height];

// Large bitmap created with 21 lines i 8 columns:
byte globuri_21x8[21 * 8];
byte snow_21x8[21 * 8];

//*******************************************************************************
//**********Bitmaps used to show some animation:
//*******************************************************************************

const byte smiley_face[] =  { 0,1,1,0,0,1,1,0,
                              0,1,1,0,0,1,1,0,
                              0,0,0,0,0,0,0,0,
                              0,0,0,0,0,0,0,0,
                              1,0,0,0,0,0,0,1,
                              0,1,0,0,0,0,1,0,
                              0,0,1,1,1,1,0,0 };

const byte sled[] =  { 0,0,0,0,1,1,1,0,
                       0,0,0,1,1,1,0,0,
                       0,0,0,1,1,1,0,0,
                       1,1,1,1,1,1,1,1,
                       0,0,1,0,0,1,0,0,
                       1,0,1,0,0,1,0,0,
                       0,1,1,1,1,1,1,1 };                       

const byte snow_01[] = { 0,1,0,0,0,1,0,0,
                         0,0,1,0,0,1,0,0,
                         0,1,0,1,0,0,1,0,
                         0,0,0,0,1,0,1,0,
                         1,0,1,0,0,1,0,0,
                         0,0,0,1,0,0,0,1,
                         0,1,0,0,0,0,0,0 }; 

const byte decoration_01[] = { 0,1,0,0,1,0,0,0,
                               0,1,0,1,1,1,0,0,
                               0,1,0,0,1,0,0,1,
                               1,0,1,0,0,0,0,1,
                               0,1,0,0,0,0,0,1,
                               0,0,0,0,0,1,0,1,
                               0,0,0,0,0,0,1,0 }; 

const byte snow_14x8[] = { 0,1,0,0,0,1,0,0,
                           0,0,1,0,0,1,0,0,
                           0,1,0,1,0,0,1,0,
                           0,0,0,0,1,0,1,0,
                           1,0,1,0,0,1,0,0,
                           0,0,0,1,0,0,0,1,
                           0,1,0,0,0,0,0,0, 
                           0,0,1,0,0,1,0,0,
                           0,1,0,1,0,0,1,0,
                           0,0,0,0,1,0,1,0,
                           1,0,1,0,0,1,0,0,
                           0,0,0,1,0,0,0,1,
                           0,1,0,0,0,0,0,0, 
                           0,0,0,1,0,0,0,1 };
/*
// Bitmap pentru Pac-Man cu gura deschis
const byte pacman_open[] = { 0,0,0,1,1,1,0,0,
                             0,0,1,0,1,1,0,0,
                             0,1,1,1,1,0,0,0,
                             0,1,1,1,0,0,0,0,
                             0,1,1,1,1,0,0,0,
                             0,0,1,1,1,1,0,0,
                             0,0,0,1,1,1,0,0 };

// Bitmap pentru Pac-Man cu gura nchis
const byte pacman_closed[] = { 0,0,0,1,1,1,0,0,
                               0,0,1,0,1,1,1,0,
                               0,1,1,1,1,1,1,0,
                               0,1,1,1,1,1,1,0,
                               0,1,1,1,1,1,1,0,
                               0,0,1,1,1,1,1,0,
                               0,0,0,1,1,1,0,0 };

// Bitmap pentru sirul de "mncare" pe linia 4
byte food_line[] = { 0,0,0,0,0,0,0,0,
                     0,0,0,0,0,0,0,0,
                     0,0,0,0,0,0,0,0,
                     1,1,1,1,1,1,1,1, // Line 4 (food)
                     0,0,0,0,0,0,0,0,
                     0,0,0,0,0,0,0,0,
                     0,0,0,0,0,0,0,0 };
*/

/*
const byte globuri_14x8[] = { 0,0,0,0,0,1,0,0,
                              0,0,0,0,0,1,0,0,
                              0,0,1,0,0,1,0,0,
                              0,0,1,0,1,0,1,0,
                              0,0,1,0,0,1,0,0,
                              0,1,0,1,0,0,0,0,
                              0,0,1,0,0,0,0,0,
                              0,0,0,0,0,1,0,0,
                              0,1,0,0,0,1,0,0,
                              0,1,0,0,0,1,0,0,
                              0,1,0,0,1,0,1,0,
                              1,0,1,0,0,1,0,0,
                              0,1,0,0,0,0,0,0,
                              0,0,0,0,0,0,0, };
*/


//*******************************************************************************
//**********Setup function:
//*******************************************************************************

void setup() 
{
  // Initialize LED matrix:
  Plex.init(led_pins);
  Plex.clear();
  Plex.display();

  // Set the switch pins as inputs:
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);

  // Initiate serial communication:
  Serial.begin(9600);
  
  Serial.println("Hello. This is a fun Christmas decoration.");
  delay(500);
  Serial.println("Can display a text with maximum 40 characters.");
  delay(500);
  Serial.println("Text larger than 40 characters will be truncated.");
  delay(500);
  Serial.println("Can display also temperature and fun animations.");
  delay(500);
  Serial.println("Have fun with this fun decoration!");
  Serial.println("");
  delay(500);

  // Sets the ADC reference to the internal voltage of 1,1V
  analogReference(INTERNAL);  // for ATmega328 (1.1V)
  
  //verify of is some text saved in eeprom:
  verify_text_from_eeprom();
}

//*******************************************************************************
//**********Functions used for read and write EEPROM:
//*******************************************************************************

void verify_text_from_eeprom()
{
  //Read text from EEPROM:
  readTextFromEEPROM();

  // Display text from EEPROM, for debug only:
//  Serial.print("Text read from EEPROM: ");
//  Serial.println(textBuffer);

  // Read text from eeprom in textBuffer:
  for (int i = 0; i < sizeof(textBuffer) - 1; i++) {
    textBuffer[i] = EEPROM.read(textStartAddress + i);
  }
  textBuffer[sizeof(textBuffer) - 1] = '\0'; // Provides the string terminator

  // Verify if eeprom is empty or invalid (0xFF on all addresses):
  bool eepromIsEmpty = true;
  for (int i = 0; i < sizeof(textBuffer) - 1; i++) {
    if (textBuffer[i] != (char)0xFF) {
      eepromIsEmpty = false;
      break;
    }
  }

  // If eeprom is epmty use an default text:
  if (eepromIsEmpty || strlen(textBuffer) == 0) {
    Serial.println("No valid text found in EEPROM. Using default text.");
    strncpy(textBuffer, "No text saved in EEPROM.", sizeof(textBuffer) - 1);
    textBuffer[sizeof(textBuffer) - 1] = '\0'; // Provides the string terminator
  }

  // Display the text from eeprom on serial and led matrix:
  Serial.print("Text read from EEPROM: ");
  Serial.println(textBuffer);
//  Plex.scrollText(textBuffer, 1);  
}

void delete_message_from_eeprom()
{
  for (int i = 0; i < sizeof(textBuffer) - 1; i++) {
    EEPROM.write(textStartAddress + i, 0xFF);
  }
  EEPROM.write(textStartAddress + sizeof(textBuffer) - 1, '\0'); // Provides the string terminator
  Serial.println("EEPROM has been cleared.");  
}

void saveTextToEEPROM(const char* text)  // Function used to save text in eeprom
{
  int len = strlen(text);                // Calculate text length

  if (len > MAX_TEXT_LENGTH) 
  {
    len = MAX_TEXT_LENGTH;               // Make sure the text does not exceed the limit
  }

  // Salveaz fiecare caracter n EEPROM
  for (int i = 0; i < len; i++) 
  {
    EEPROM.write(eepromAddress + i, text[i]);
  }
  
  // Salveaz caracterul NULL la final
  EEPROM.write(eepromAddress + len, '\0');
  Serial.print("Text saved to EEPROM: ");
  Serial.println(text);
}

void readTextFromEEPROM()  // Function used to read text from eeprom
{
  int i = 0;
  char ch;
  
  while ((ch = EEPROM.read(eepromAddress + i)) != '\0' && i < MAX_TEXT_LENGTH) 
  {
    textBuffer[i] = ch;
    i++;
  }
  textBuffer[i] = '\0';    // Provides the string terminator
}

//*******************************************************************************
//**********Function used for read data from serial:
//*******************************************************************************

void serialEvent() // Special function called automatically when data arrives on the serial
{
  while (Serial.available()) 
  {
    char inChar = (char)Serial.read();

    // If the text is less than the maximum limit, add characters:
    if (serialInput.length() < MAX_TEXT_LENGTH) 
    {
      serialInput += inChar;
    }

    // Check if complete message has been sent (ended with '\n'):
    if (inChar == '\n') 
    {
      serialInput.trim();  // Remove any trailing blank spaces:
      Serial.println("Received new text: " + serialInput);

      // If the message is the delete command ("Delete_message"):
      if (serialInput == "Delete_message") {
        delete_message_from_eeprom();  // Delete EEPROM-ul
        strncpy(textBuffer, "No text saved in EEPROM.", sizeof(textBuffer) - 1);
        textBuffer[sizeof(textBuffer) - 1] = '\0'; // Provides the string terminator
        
        Serial.println("EEPROM cleared. No text saved in EEPROM.");
        Plex.scrollText("No text saved in EEPROM.", 1);
      } 
      else {
        // Truncate the text to the maximum length if it is too long
        if (serialInput.length() > MAX_TEXT_LENGTH) 
        {
          serialInput = serialInput.substring(0, MAX_TEXT_LENGTH);
        }

        // Save text in eeprom:
        saveTextToEEPROM(serialInput.c_str());

        // Updates the textBuffer with the new text:
        strncpy(textBuffer, serialInput.c_str(), sizeof(textBuffer) - 1);
        textBuffer[sizeof(textBuffer) - 1] = '\0';  // Provides the string terminator

        // Dynamically calculates the delay based on the length of the text:
        word delay_time = strlen(serialInput.c_str()) * ms_per_char;

        // Display new text on led matrix:
        Plex.scrollText(serialInput.c_str(), 1);  // Display received text on led matrix
        delay(delay_time);
      }

      // Flushes the serial buffer after the message has been processed
      serialInput = "";
    }
  }
}

//*******************************************************************************
//**********Functions used for displaying animation but not used due to RAM limit:
//*******************************************************************************
/*
// Pac-Man animation:
void pacman_animation() {
  byte temp_bitmap[8 * 7];  // Bitmap temporar pentru animaie

  // Animation of "eating" from left to right
  for (int step = -8; step <= 8; step++) {
    // Clears the temporary bitmap
    memset(temp_bitmap, 0, sizeof(temp_bitmap));

    // Draw the "food" line on line 4 of the matrix
    for (int col = max(0, step); col < 8; col++) {
      temp_bitmap[3 * 8 + col] = food_line[3 * 8 + col];
    }

    // Choose Pac-Man's shape (open or closed) by alternating each step
    const byte* pacman = (step % 2 == 0) ? pacman_open : pacman_closed;

    // Draw Pac-Man in his current position, from left to right
    for (int row = 0; row < 7; row++) {
      for (int col = 0; col < 8; col++) {
        int pacman_col = col + step; // We calculate the horizontal position of Pac-Man

        // We check if Pac-Man is visible in the matrix
        if (pacman_col >= 0 && pacman_col < 8) {
          temp_bitmap[row * 8 + pacman_col] = pacman[row * 8 + col];
        }
      }
    }

    // Eliminate the "food" that Pac-Man "eats"
    if (step >= 0 && step < 8) {
      food_line[3 * 8 + step] = 0;  // Delete the eaten food point
    }

    // Displays the temporary bitmap
    Plex.drawBitmap(temp_bitmap);
    Plex.display();
    delay(200);  // Animation speed
  }

  // Clears the matrix completely after Pac-Man exits
  Plex.clear();
  Plex.display();
}

void melting_snow_ball()
{
  // Draw a filled circle (x, y, radius)
  Plex.clear();
  Plex.circleFill(2, 2, 1);  //snow boll from left
  Plex.circleFill(6, 1, 1);  //snow boll from right  
  Plex.display();
  delay(1000);

  for( int b=0; b<2; b++) 
  {
  //start droping the "water" from snow ball:
  Plex.pixel(2, 4);    Plex.display();   delay(500);     //drop from left side
  Plex.pixel(6, 3);    Plex.display();   delay(500);     //drop from right side
  
  Plex.pixel(2, 4, 0); Plex.pixel(2, 5); Plex.display(); delay(500); //drop from left side
  Plex.pixel(6, 3, 0); Plex.pixel(6, 4); Plex.display(); delay(500); //drop from right side

  Plex.pixel(2, 5, 0); Plex.pixel(2, 6); Plex.display(); delay(500); //drop from left side
  Plex.pixel(6, 4, 0); Plex.pixel(6, 5); Plex.display(); delay(500); //drop from right side

  Plex.pixel(6, 5, 0); Plex.pixel(6, 6); Plex.display(); delay(900);  //drop from right side

  delay(2000);
  }

  //make snow ball small:
  Plex.pixel(2, 1, 0); Plex.display(); delay(250); Plex.pixel(3, 2, 0); Plex.display(); delay(250); 
  Plex.pixel(2, 3, 0); Plex.display(); delay(250); Plex.pixel(1, 2, 0); Plex.display(); delay(250);
  delay(1000);
  Plex.pixel(6, 0, 0); Plex.display(); delay(250); Plex.pixel(7, 1, 0); Plex.display(); delay(250); 
  Plex.pixel(6, 2, 0); Plex.display(); delay(250); Plex.pixel(5, 1, 0); Plex.display(); delay(250);  
  delay(1000);
  
  for( int c=0; c<2; c++) 
  {
    //start droping the "water" from snow ball:
    Plex.pixel(2, 3);    Plex.display();   delay(1000);    //drop from right side
    Plex.pixel(6, 2);    Plex.display();   delay(800);     //drop from right side

    Plex.pixel(2, 3, 0); Plex.pixel(2, 4); Plex.display(); delay(500); //drop from left side
    Plex.pixel(6, 2, 0); Plex.pixel(6, 3); Plex.display(); delay(500); //drop from right side
  
    Plex.pixel(2, 4, 0); Plex.pixel(2, 5); Plex.display(); delay(500); //drop from left side
    Plex.pixel(6, 3, 0); Plex.pixel(6, 4); Plex.display(); delay(500); //drop from right side

    Plex.pixel(2, 5, 0); Plex.pixel(2, 6); Plex.display(); delay(500); //drop from left side
    Plex.pixel(6, 4, 0); Plex.pixel(6, 5); Plex.display(); delay(500);  //drop from right side

    Plex.pixel(1, 6);    Plex.pixel(3, 6); Plex.display(); delay(500); //drop from left side
    Plex.pixel(6, 5, 0); Plex.pixel(6, 6); Plex.display(); delay(500);  //drop from right side

    Plex.pixel(5, 6);    Plex.pixel(7, 6); Plex.display(); //drop from right delay(1100);

    delay(2000);
  }

  //start droping the "water" from snow ball:
  Plex.pixel(2, 3); Plex.pixel(2, 2, 0); Plex.display(); delay(500); //drop from left side
  Plex.pixel(6, 2); Plex.pixel(6, 1, 0); Plex.display(); delay(500); //drop from right side

  Plex.pixel(2, 3, 0); Plex.pixel(2, 4); Plex.display(); delay(500); //drop from left side
  Plex.pixel(6, 2, 0); Plex.pixel(6, 3); Plex.display(); delay(500); //drop from right side
  
  Plex.pixel(2, 4, 0); Plex.pixel(2, 5); Plex.display(); delay(500); //drop from left side
  Plex.pixel(6, 3, 0); Plex.pixel(6, 4); Plex.display(); delay(500); //drop from right side

  Plex.pixel(2, 5, 0); Plex.pixel(2, 6); Plex.display(); delay(500); //drop from left side
  Plex.pixel(6, 4, 0); Plex.pixel(6, 5); Plex.display(); delay(500);  //drop from right side

  Plex.pixel(1, 6);    Plex.pixel(3, 6); Plex.display(); delay(500); //drop from left side
  Plex.pixel(6, 5, 0); Plex.pixel(6, 6); Plex.display(); delay(500);  //drop from right side

  Plex.pixel(5, 6);    Plex.pixel(7, 6); Plex.display(); //drop from right delay(1100);

  // Draw a line (x0, y0, y1, y1)
  Plex.line(0, 6, 7, 6);
  Plex.display();
  delay(2000);    
}
*/

//*******************************************************************************
//**********Functions used for displaying animation:
//*******************************************************************************

// Function for concatenating the bitmap with a block of zeros:
void concatenateWithZeros(const byte* original_bitmap, int original_height, int width, byte* result_bitmap, int total_height) {
  // Add the first 7 lines of zeros:
  for (int row = 0; row < total_height - original_height; row++) {
    for (int col = 0; col < width; col++) {
      result_bitmap[row * width + col] = 0;
    }
  }

  // Copies the original bitmap starting at line 8:
  for (int row = 0; row < original_height; row++) {
    for (int col = 0; col < width; col++) {
      result_bitmap[(row + (total_height - original_height)) * width + col] = original_bitmap[row * width + col];
    }
  }
}

//animation from up do down or scrolling up to down:
void animation_up_to_down(const byte* normal_bitmap)
{
  // "Descent" animation (the last line of the bitmap starts at the top and gradually descends):
  for (int step = 0; step < height; step++) {
    // Clears the temporary bitmap
    memset(temp_bitmap, 0, sizeof(temp_bitmap));

    // Display bitmap lines incrementally, starting with the last line in the bitmap on the first line of the matrix:
    for (int row = 0; row <= step; row++) {
      for (int col = 0; col < width; col++) {
        temp_bitmap[(step - row) * width + col] = normal_bitmap[(height - 1 - row) * width + col];
      }
    }

    // Displays the temporary bitmap:
    Plex.drawBitmap(temp_bitmap);
    Plex.display();
    delay(250);  // Animation speed
  }

  // Down "exit" animation (the bitmap descends and disappears completely):
  for (int step = 1; step < height; step++) {  // We start the descent directly
    // Cur bitmap-ul temporar
    memset(temp_bitmap, 0, sizeof(temp_bitmap));

    // Moves the bitmap down until it disappears completely:
    for (int row = 0; row < height - step; row++) {
      for (int col = 0; col < width; col++) {
        temp_bitmap[(row + step) * width + col] = normal_bitmap[row * width + col];
      }
    }

    // Displays the temporary bitmap:
    Plex.drawBitmap(temp_bitmap);
    Plex.display();
    delay(250);  // Animation speed
  } 
    // Clean the array completely after outputting the bitmap:p
    Plex.clear();
    Plex.display();
}

void animation_up_to_down_with_large_bitmap(const byte* large_bitmap, int full_height, int width) {
  const int display_height = 7;  // Effective height of the LED matrix (7 lines)
  byte temp_bitmap[display_height * width];  // Temporary bitmap for 7x8 window

  // Top-down "entry" animation:
  for (int step = 0; step < full_height; step++) {
    // Clears the temporary bitmap:
    memset(temp_bitmap, 0, sizeof(temp_bitmap));

    // Copies the relevant part of the large bitmap into temp_bitmap:
    for (int row = 0; row <= step && row < display_height; row++) {
      for (int col = 0; col < width; col++) {
        int src_row = full_height - 1 - (step - row);
        if (src_row >=0) {
        temp_bitmap[row * width + col] = large_bitmap[src_row * width + col];
        }
      }
    }

    // Displays the temporary bitmap on the array:
    Plex.drawBitmap(temp_bitmap);
    Plex.display();
    delay(250);  // Animation speed
  }

  // Clean the array completely after outputting the bitmap:
  Plex.clear();
  Plex.display();
}

void animation_right_to_left(const byte* bitmap, int width, int height)
{
  // Right to left "entry" animation:
  for (int step = 0; step < width; step++) {
    // Clears the temporary bitmap:
    memset(temp_bitmap, 0, sizeof(temp_bitmap));

    // Displays the bitmap incrementally, entering from the right:
    for (int col = 0; col <= step; col++) {
      for (int row = 0; row < height; row++) {
        // Copies the columns of the bitmap starting from the last position of the array:
        temp_bitmap[row * width + (width - 1 - step + col)] = bitmap[row * width + col];
      }
    }

    // Displays the temporary bitmap on the array:
    Plex.drawBitmap(temp_bitmap);
    Plex.display();
    delay(250);  // Animation speed
  }

  // Left "exit" animation:
  for (int step = 1; step < width; step++) {
    // Clears the temporary bitmap:
    memset(temp_bitmap, 0, sizeof(temp_bitmap));

    // Copies the original bitmap shifted to the right:
    for (int col = step; col < width; col++) {
      for (int row = 0; row < height; row++) {
        temp_bitmap[row * width + col - step] = bitmap[row * width + col];
      }
    }

    // Displays the temporary bitmap on the array:
    Plex.drawBitmap(temp_bitmap);
    Plex.display();
    delay(250);  // Animation speed
  }
    // Clean the array completely after outputting the bitmap:
    Plex.clear();
    Plex.display(); 
}

void animation_explosion()
{
  // Explosions!
  for (int i = 0; i < 15; i++ ) {
    x = random(0, 8);
    y = random(0, 7);
    for ( radius = 0; radius < 12; radius++ ) {
      Plex.clear();
      Plex.circle(x, y, radius);
      Plex.circle(x, y, radius + 1);
      Plex.display();
      delay(30);
    }
  }  
}

void random_pixels()
{
  for (int i=0; i<150; i++)
  {
    x     = random(0, 8);  // Choose a random number between 0 and 7 for x coordinate
    y     = random(0, 7);  // Choose a random number between 0 and 6 for y coordinate
    state = random(0, 2);  // Flip a coin for the state of the LED
  
    // Write to the LED display and wait before doing it again
    Plex.pixel(x, y, state);
    Plex.display();
    delay(50);
  }
    Plex.clear();  
}

//*******************************************************************************
//**********Function used for read and display temperature:
//*******************************************************************************

void read_temperature()
{
  Serial.println("Display temperature...");  
  sensor_value = analogRead(temperaturePin);  //read value from temp sensor
  voltage = sensor_value * 1.1 / 1024.0;      // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V)
  float tempC = (voltage - 0.5) / 0.01;       // Now we'll convert the voltage to degrees Celsius.
  char temperature[10];
  char str_tempC[6];

  //This converts the floating variable of temperature to a 
  //sting so that we can print that on the array:
  /* 4 is mininum width, 2 is precision; float value is copied onto str_temp*/

  dtostrf(tempC, 4, 1, str_tempC);               
  sprintf(temperature,"Temp: %s C", str_tempC); 

  //This prints the string we just made to the badger array:
  Plex.scrollText(temperature, 1);

  //wait for 7 secounds while scrolling temp:
  delay(7000); 

  // Stop scrolling the text
  Plex.stopScrolling();
  delay(2000);
}

//*******************************************************************************
//**********Function used to display all pictograms:
//*******************************************************************************

void display_all_pictograms()
{  
  //display snow:
  Serial.println("Display snowing...");
  concatenateWithZeros(snow_14x8, 14, 8, snow_21x8, 21);          // Concatenates the original bitmap with the block of zeros
  animation_up_to_down_with_large_bitmap(snow_21x8, 21, 8);  
  
  //display sled, from right to left:
  Serial.println("Display a child on the sled...");
  animation_right_to_left(sled, 8, 7);
  delay(1000);  // Pause between animations  

  //display small Christmas decorations:
  Serial.println("Display small Christmas decorations...");
  animation_up_to_down(decoration_01);
  delay(1000);  // Pause between animations

  //display fireworks:
  Serial.println("Display fireworks...");
  animation_explosion();
  delay(1000);  // Pause between animations
  
  //display random pixels:
  Serial.println("Display random snowflakes...");
  random_pixels();
  delay(1000);  // Pause between animations
  
//not used due to the RAM limitations:

  //display large Christmas decorations:
//  concatenateWithZeros(globuri_14x8, 14, 8, globuri_21x8, 21);    // Concatenates the original bitmap with the block of zeros
//  Serial.println("Display large Christmas decoration...");
//  animation_up_to_down_with_large_bitmap(globuri_21x8, 21, 8);  
//  delay(1000);  // Pause between animations

  //display melting snow blals:
//  Serial.println("Display melting snow balls...");  
//  melting_snow_ball();

  //display pacman animation:
//  Serial.println("Display PacMan animation...");
//  for (int i=0; i<5; i++) 
//  {
//    pacman_animation();
//    memcpy(food_line + 3 * 8, (const byte[]){1,1,1,1,1,1,1,1}, 8);
//    delay(2000); // Pause between animations
//  }
}

//*******************************************************************************
//**********Function used for display text message:
//*******************************************************************************

void display_text_on_led_matrix()
{
  //verify of is some text saved in eeprom:
  verify_text_from_eeprom();
    
  // Calculate text length:
  int text_length = strlen(textBuffer);

  // Calculates the delay based on the length of the text:
  word delay_time = text_length * ms_per_char;
  
  // Display the text from the EEPROM (or the newly received one):
  Plex.scrollText(textBuffer, 1);  // Displays the current text in `textBuffer`
  // Aplic delay-ul calculat dinamic
  delay(delay_time);

  // If you receive new text via serial, it will be handled in `serialEvent()`
}

//*******************************************************************************
//********************Main loop**************************************************
//*******************************************************************************

void loop() 
{
  // We read the state of the two switches:
  bool state1 = digitalRead(buttonPin1); // Reading PC1
  bool state2 = digitalRead(buttonPin2); // Reading PC2

  // We determine the mode of operation based on the state of the switches:
  int mode = (state1 << 1) | state2;  // We calculate a 2-bit code for modes (0-3)

// there is an issue with SW1 and SW2 positioning on PCB from schematic:
// SW1 from PCB corespond to SW2 from schematic and SW2 from PCB corespond to SW1 from schematic
// in "switch" function I put the real position of SW2 and SW1 from PCB, to be easy to read them

  // Select the appropriate program using switches:
  switch (mode) {
    case 0:  // (SW2 = HIGH, SW1 = HIGH) <=> (PC2 = LOW, PC1 = LOW)   => mode 3:
      Serial.println("Mod 3: all together.");
      //code for mode 0:
      display_text_on_led_matrix();
      read_temperature(); // read and display the sensor temperature  
      display_all_pictograms();           
      break;
      
    case 1:  // (SW2 = HIGH, SW1 = LOW) <=> (PC = LOW, PC1 = HIGH)  => mode 2:
      Serial.println("Mod 1: only message.");
      display_text_on_led_matrix();
      break;
      
    case 2:  // (SW2 = LOW, SW1 = HIGH) <=> (PC2 = HIGH, PC1 = LOW)  => mode 1:
      Serial.println("Mod 2: only pictograms.");
      //code for mode 2:
      display_all_pictograms();
      break;
      
    case 3:  // (SW2 = LOW, SW1 = LOW)  <=> (PC2 = HIGH, PC1 = HIGH) => mode 0:
      Serial.println("Mod 0: only temperature.");
      //code for mode 0:
      read_temperature(); // read and display the sensor temperature    
      break;
      
    default:
      Serial.println("Error: unknown state.");
  }
  delay(500);  // small delay to avoid repeaded switches reading
}

Hex used with AVRDUDE

haXe
Hex file used to program multiple boards without Arduino IDE
:100000000C9463020C948B020C948B020C948B0264
:100010000C948B020C948B020C948B020C948B022C
:100020000C948B020C94270B0C948B020C948B0277
:100030000C948B020C948B020C948B020C948B020C
:100040000C94670C0C948B020C948B0F0C94BD0FCA
:100050000C948B020C948B020C948B020C948B02EC
:100060000C948B020C948B020C948B020C948B02DC
:100070000C948B020C948B020C948B020C948B02CC
:100080000C948B020C948B020C948B020C948B02BC
:100090000C948B020C948B020C948B020C948B02AC
:1000A0000C948B020C948B020C948B020C948B029C
:1000B0000C948B0200407A10F35A00A0724E18097B
:1000C0000010A5D4E80000E87648170000E40B54BF
:1000D000020000CA9A3B000000E1F505000080968E
:1000E0009800000040420F000000A08601000000C0
:1000F000102700000000E80300000000640000007A
:1001000000000A00000000000100000000002C7642
:10011000D888DC674F0823DFC1DFAE59E1B1B7965D
:10012000E5E3E453C63AE651997696E8E6C28426BA
:10013000EB898C9B62ED407C6FFCEFBC9C9F40F296
:10014000BAA56FA5F490055A2AF75C936B6CF96712
:100150006DC11BFCE0E40D47FEF520E6B500D0EDD7
:10016000902E0300943577050080841E080000203F
:100170004E0A000000C80C333333330F986E1283DD
:100180001141EF8D2114893BE65516CFFEE6DB18B1
:10019000D1844B381BF77C1D901DA4BBE424203276
:1001A00084725E228100C9F124ECA1E53D27470459
:1001B000450441043B0435042F0429042604220489
:1001C0001E04180412040F04090406040004FA03B0
:1001D000F603F103EC03E703E203DD03D803D303E3
:1001E000CE03CB03C803C303BE03B903B403AE03FA
:1001F000A903A4039F039A03950390038B0386032B
:1002000082037C03760371036B0365035F035A0368
:1002100054034F034A0344033E03380332032C03C1
:10022000260320031C03160312030C030603020318
:10023000FD02F802F402EF02EA02E502E002DB024C
:10024000D902D402CF02CB02C502C002BB02B60261
:10025000B102AC02A702A1029C02960290028A029D
:1002600084027E027902770272026C02051008088D
:100270000804044141360801770408364141054429
:1002800064544C44050448300804054428102844AC
:1002900005384030403805182040201804384040C8
:1002A000380504043F4424044854542404781008B6
:1002B00010040814147C047C1414080430484830DA
:1002C000047808087005780830087803417F4004F6
:1002D0007F102844042040403D017A047F080870C4
:1002E000044854543C04087E090204385454580409
:1002F0003048487F03304848047F48483004205441
:1003000054780301020405404040404005040201C6
:1003100002040341417F050204081020037F41418C
:10032000056151494543050708700807056314082E
:100330001463053F4030403F051F2040201F053F0C
:100340004040403F0501017F010104464949310415
:100350007F192946053E4151215E047F09090605A2
:100360003E4141413E057F0408107F057F020C029B
:100370007F047F404040057F081422410520404112
:100380003F0103417F41047F08087F043E41497AD1
:10039000047F090901047F494941047F41221C046B
:1003A0003E414122047F494936047E11117E0532C7
:1003B0004979413E040251090604412214080414FB
:1003C0001414140408142241025636023636040668
:1003D00049291E04364949360471090503043C4A7B
:1003E00049300427454539041F107C100422414937
:1003F00036046251494603427F40053E5149453E1D
:1004000005201008040202606005080808080802B8
:1004100050300508083E08080514083E081403413A
:10042000221C031C224102050305364955225005B2
:10043000231308646205242A7F2A1205147F147F7F
:100440001403070007014F01000A0D0E0900030203
:10045000000004050800000000000000000000008B
:10046000000000000102040810204080010204087E
:1004700010200102040810204080400102040804FA
:10048000040404040404040202020202020303033B
:100490000303030202030505050500000000230015
:1004A000260029002C0000000000250028002B0059
:1004B0002E0000000000240027002A002D00E40781
:1004C000CB0BED0FEA0711241FBECFEFD8E0DEBF44
:1004D000CDBF15E0A0E0B1E0E8E7FAE302C0059087
:1004E0000D92A433B107D9F727E0A4E3B5E001C02A
:1004F0001D92A434B207E1F712E0C2E6D2E004C0D4
:100500002197FE010E940315CF35D107C9F70E943C
:10051000CE120C942F1D0C940000CF93DF93D0E0EB
:10052000C0E06FEFCE010E94E21C2196C832D105D7
:10053000C1F760E088E290E00E94E21C63E171E0B4
:1005400083EA96E0DF91CF910C948210CF92DF92F4
:10055000EF92FF920F931F93CF93DF938C01EC01E7
:1005600009900020E9F72197C81BD90BC932D105A2
:1005700010F0C8E2D0E06801F12CE12CEC16FD0689
:1005800054F4F60161916F01C7010E94E21CFFEF74
:10059000EF1AFF0AF3CF60E0CE010E94E21C6CE28A
:1005A00071E083EA96E00E946410B80183EA96E065
:1005B000DF91CF911F910F91FF90EF90DF90CF903F
:1005C0000C9482100F931F93CF93DF930AE116E0F0
:1005D000D0E0C0E0CE010E94DA1C882341F0C8328E
:1005E000D10529F0F80181938F012196F3CFC65EE2
:1005F000D94F1882DF91CF911F910F910895EF92FB
:10060000FF920F931F93CF93DF930E94E2020AE1C0
:1006100016E07801D0E0C0E0CE010E94DA1CF701BC
:1006200081937F012196C832D105B1F7109242061D
:10063000F6E002341F0749F0F80181918F018F3FE6
:10064000B9F380911A06811110C063E471E083EA66
:1006500096E00E94821048E250E069EA73E08AE185
:1006600096E00E94F0171092420666E771E083EA76
:1006700096E00E9464106AE176E083EA96E0DF91FA
:10068000CF911F910F91FF90EF900C9482106AE030
:1006900071E080E596E00E94C40980E596E00E9442
:1006A000EE0880E596E00E94C70860E08FE00E94B7
:1006B000B90D60E080E10E94B90D26E040E855E206
:1006C00060E070E083EA96E00E94330F6EE871E02C
:1006D00083EA96E00E94821064EF71E080E090E08F
:1006E0000E94D60C69EB71E083EA96E00E948210CA
:1006F00064EF71E080E090E00E94D60C68EE71E05B
:1007000083EA96E00E94821064EF71E080E090E05E
:100710000E94D60C6AE172E083EA96E00E948210A1
:1007200064EF71E080E090E00E94D60C6BE472E030
:1007300083EA96E00E94821062E375E083EA96E025
:100740000E94821064EF71E080E090E00E94D60C7D
:1007500083E00E944B0D0C94FF02AF92BF92CF92A8
:10076000DF92EF92FF920F931F93CF93DF93AA2410
:10077000BB24A21AB30AD901D0E0C0E0061B170BB4
:10078000C017D1072CF1AA24BB24A81AB90A049FC8
:10079000F001059FF00D149FF00D11242E0F3F1F47
:1007A000F0E0E0E010E000E0061717074CF5EC0180
:1007B000CE0FDF1F7F01E20EF31E6E01CA0CDB1CA1
:1007C000C416D506B4F4D990D701DD927D01F5CFDA
:1007D0007D016701CA0CDB1CC416D50624F4F701A1
:1007E00011927F01F6CF2196A40FB51FA41AB50A66
:1007F000C7CF0F5F1F4FA41AB50AE40FF51FD4CF60
:10080000DF91CF911F910F91FF90EF90DF90CF90EC
:10081000BF90AF9008958F929F92AF92BF92CF9268
:10082000DF92EF92FF920F931F93CF93DF934C01D0
:1008300010E000E0D0E0C0E02CEDE22E25E0F22E4A
:1008400038E3B32E6C0180E3C80ED11CF7018B2D69
:1008500011928A95E9F790E080E030E020E0B8015D
:1008600064527A4FD601A80FB91FFB01E80FF91F98
:1008700048E050E0AD90A19241505109D9F72F5F67
:100880003F4F0897C217D3076CF76CED75E080E512
:1008900096E00E94950980E596E00E94C7086AEFFD
:1008A00070E080E090E00E94D60C2196085F1F4F18
:1008B000C730D10559F608E010E0C6E0D0E08CED75
:1008C000E82E85E0F82E98E3D92EF7018D2D1192B0
:1008D0008A95E9F790E080E030E020E0B8016452CA
:1008E0007A4F2C173D078CF4D401A80FB91FFB01D8
:1008F000E80FF91F48E050E0CD90C19241505109F6
:10090000D9F72F5F3F4F0896ECCF6CED75E080E58F
:1009100096E00E94950980E596E00E94C7086AEF7C
:1009200070E080E090E00E94D60C2197085F1F4F96
:10093000209759F680E596E00E94EE0880E596E063
:10094000DF91CF911F910F91FF90EF90DF90CF90AB
:10095000BF90AF909F908F900C94C7082F923F92BA
:100960004F925F926F927F928F929F92AF92BF92BF
:10097000CF92DF92EF92FF920F931F93CF93DF936B
:10098000CDB7DEB74C015B017A012DB63EB687E0EC
:10099000849F2001859F500C11248DB79EB7841928
:1009A00095090FB6F8949EBF0FBE8DBFADB7BEB709
:1009B00011966D0110E000E03B01B1E06B1A710887
:1009C0000A151B050CF04CC0A20170E060E0C601E6
:1009D0000E94D91790E080E030E020E02E153F051E
:1009E00034F5A801481B590BB301641B750B77FD47
:1009F0001BC0E69EA001E79E500DF69E500D1124EF
:100A0000F401E20FF31FE40FF51FE081E89EB0014F
:100A1000E99E700DF89E700D1124A601420F531F20
:100A2000460F571FDA01EC932F5F3F4FD7CF019648
:100A3000081719071CF08730910574F2B60180E59C
:100A400096E00E94950980E596E00E94C7086AEF4B
:100A500070E080E090E00E94D60C0F5F1F4FB0CF97
:100A600080E596E00E94EE0880E596E00E94C708C7
:100A70000FB6F8943EBE0FBE2DBEDF91CF911F91F1
:100A80000F91FF90EF90DF90CF90BF90AF909F902D
:100A90008F907F906F905F904F903F902F90089530
:100AA0009F92AF92BF92CF92DF92EF92FF920F93FD
:100AB0001F93CF93DF937C01EB016A0110E000E00C
:100AC0002CEDA22E25E0B22E38E3932E0C171D0735
:100AD000D4F5F501292D11922A95E9F7A7014C1BB0
:100AE0005D0BC501801B910B30E020E070E060E001
:100AF0002C0F3D1F6C157D0564F4FA01E20FF31F06
:100B0000A081F9013197E80FF91FA0836F5F7F4F34
:100B1000EFCF4F5F5F4F0196E5E08D3D9E0721F7D8
:100B20006CED75E080E596E00E94950980E596E021
:100B30000E94C7086AEF70E080E090E00E94D60C47
:100B40000F5F1F4FC3CFAA24A394B12C0CED15E067
:100B500098E3992EAC16BD06D4F5F801292D119213
:100B60002A95E9F7A50130E020E02C153D05B4F405
:100B70002C9FC0012D9F900D3C9F900D1124840F40
:100B8000951FF701E80FF91F60818A199B09FC0185
:100B9000E452FA4F60832F5F3F4FE7CF4F5F5F4FC5
:100BA0004C175D0704F36CED75E080E596E00E945C
:100BB000950980E596E00E94C7086AEF70E080E042
:100BC00090E00E94D60C8FEFA81AB80AC3CF80E538
:100BD00096E00E94EE0880E596E0DF91CF911F91AC
:100BE0000F91FF90EF90DF90CF90BF90AF909F90CC
:100BF0000C94C708CF93DF93CFE0D0E028E030E03B
:100C000040E050E060E070E0CB010E94B3107093D0
:100C100049066093480627E030E040E050E060E09D
:100C200070E0CB010E94B3107093470660934606B4
:100C300010924306809143068C3048F580E596E09B
:100C40000E94EE08209143064091460660914806B6
:100C500080E596E00E940909209143062F5F4091AC
:100C600046066091480680E596E00E94090980E505
:100C700096E00E94C7086EE170E080E090E00E947C
:100C8000D60C809143068F5F80934306D3CF219784
:100C900009F0B4CFDF91CF910895CF93DF93C6E9E8
:100CA000D0E028E030E040E050E060E070E0CB01D0
:100CB0000E94B310709349066093480627E030E025
:100CC00040E050E060E070E0CB010E94B310709310
:100CD00047066093460622E030E040E050E060E0E6
:100CE00070E0CB010E94B310262F2093440670932E
:100CF0004506409146066091480680E596E00E94D0
:100D0000F50880E596E00E94C70862E370E080E0A5
:100D100090E00E94D60C219721F680E596E0DF91C5
:100D2000CF910C94EE08EF92FF920F931F93CF9305
:100D3000DF93CDB7DEB760970FB6F894DEBF0FBE76
:100D4000CDBF6EE672E083EA96E00E9482108EE0EC
:100D50000E944E0D90934F0680934E06BC01990F52
:100D6000880B990B0E94C9132DEC3CEC4CE85FE317
:100D70000E94551420E030E040E85AE30E945514E8
:100D800060934A0670934B0680934C0690934D06F1
:100D90007E012BE0E20EF11C20E030E040E05FE35A
:100DA0000E94E8122AE037ED43E25CE30E9455130B
:100DB000870121E044E00E942315FF92EF9285E82D
:100DC00092E09F938F930A5011091F930F930E94F3
:100DD000FF1720E041E050E0B80180E596E00E9476
:100DE0002A0A68E57BE180E090E00E94D60C80E56D
:100DF00096E00E94B00960ED77E080E090E00E940C
:100E0000D60C0F900F900F900F900F900F90609650
:100E10000FB6F894DEBF0FBECDBFDF91CF911F910B
:100E20000F91FF90EF9008950F931F9360E972E088
:100E300083EA96E00E94821005E110E024E335E0A9
:100E400048E050E06EE070E082EC93E00E94AD0379
:100E500048E050E065E170E084E395E00E94AE0474
:100E600063EA72E083EA96E00E94821047E050E075
:100E700068E070E08AE694E00E94500568EE73E056
:100E800080E090E00E94D60C62EC72E083EA96E08B
:100E90000E94821082E394E00E940B0468EE73E0EB
:100EA00080E090E00E94D60C69EE72E083EA96E062
:100EB0000E9482100E94FA0568EE73E080E090E0E4
:100EC0000E94D60C6EEF72E083EA96E00E948210D8
:100ED0000E944D0668EE73E080E090E01F910F9154
:100EE0000C94D60CCF93DF930E94FF02CAE1D6E0A8
:100EF00009900020E9F7CB51D64020E041E050E0D6
:100F00006AE176E080E596E00E942A0A8CEB92E0A6
:100F1000C89FB001C99F700DD89F700D112490E03B
:100F200080E0DF91CF910C94D60CCF93DF938FE0CC
:100F30000E94230EEC0180E10E94230E21E030E0AC
:100F4000CD2B11F430E020E0220F331F41E050E0C0
:100F5000892B11F450E040E0242B352B2230310551
:100F600019F12330310539F12130310569F06BE198
:100F700073E083EA96E00E9482100E9472070E944A
:100F800093060E94140708C060E373E083EA96E0CA
:100F90000E9482100E94720764EF71E080E090E08E
:100FA000DF91CF910C94D60C65E473E083EA96E070
:100FB0000E948210E6CF6DE573E083EA96E00E941E
:100FC00082100E949306E8CF62E375E084E196E028
:100FD0000C94441184E196E00C94D210CF92DF92ED
:100FE000EF92FF920F931F93CF93DF9300D000D027
:100FF00000D0CDB7DEB78CEBC82E82E0D82E83EAC6
:1010000096E00E944C0E892B09F49FC083EA96E07B
:101010000E94660E182F80911806909119068897E5
:1010200028F4612F84E196E00E94E7111A3039F725
:1010300084E196E00E94701266E773E0CE010196AB
:101040000E94441164E176E0CE0101960E94FA11FB
:10105000BC0183EA96E00E947010CE0101960E94C6
:10106000D2106AE873E084E196E00E940D128823B2
:1010700011F10E948D0248E250E069EA73E08AE1D2
:1010800096E00E94F0171092420669E973E083EA45
:1010900096E00E94821020E041E050E069EA73E0AF
:1010A00080E596E00E942A0A62E375E084E196E01A
:1010B0000E94AC11A4CF80911806909119068997CF
:1010C000A8F028E230E050E040E064E176E0CE01B4
:1010D00001960E942A12BE016F5F7F4F84E196E065
:1010E0000E94A011CE0101960E94D2108091140698
:1010F000909115060E94A602E0901406F090150645
:1011000048E250E0B7018AE196E00E94F0171092A1
:101110004206F70101900020E9F731978F010E197F
:101120001F0920E041E050E0B70180E596E00E9411
:101130002A0A0C9DB0010D9D700D1C9D700D11248F
:1011400090E080E00E94D60CAFCF26960FB6F894C0
:10115000DEBF0FBECDBFDF91CF911F910F91FF90EA
:10116000EF90DF90CF900895FC0115AE17AE16AE4C
:10117000E05CFF4F28EC30E031832083329611820F
:1011800010828C5B9F4FFC01118210820895EF92B8
:10119000FF920F931F93CF93DF938C017C0182E02A
:1011A000E80EF11CD0E0C0E0F70141917F01FE01A3
:1011B000EE0FFF1FE255FB4F60817181F8018081C6
:1011C00091810E94CF0B2196C833D10569F7DF9139
:1011D000CF911F910F91FF90EF900895029628E311
:1011E000FC0111922A95E9F70895683088F4473098
:1011F00078F450E037E0639F400D511D1124FC014D
:10120000E40FF51F222319F081E0828308951282F2
:1012100008959F92AF92BF92CF92DF92EF92FF928A
:101220000F931F93CF93DF938C01C62ED42E81E0B2
:10123000B82EB21AA22EA194AA0CC22F422F4D0D85
:1012400021E0C8010E94F5084D2D4C1B21E06C2DBA
:10125000C8010E94F5086C2F6C0D21E04D2DC801CE
:101260000E94F5086C2D6C1B21E04D2DC8010E94D9
:10127000F508D0E0DC170CF04CC0B7FC04C0C1503E
:10128000A394A394BA0CDF5F8D2F880F8F5FB80EE5
:101290009C2C9D0E21E0FC2EFD0C4F2D692DC801CC
:1012A0000E94F508EC2CED1A21E04F2D6E2DC8019F
:1012B0000E94F50821E0FD2CFC1A4F2D692DC80174
:1012C0000E94F50821E04F2D6E2DC8010E94F508FF
:1012D000FD2CFD0E21E04F2DEC2EEC0C6E2DC801E7
:1012E0000E94F50821E04F2DFC2CFC1A6F2DC8013F
:1012F0000E94F5089D2C9D1A21E0492D6E2DC801F4
:101300000E94F50821E0492D6F2DC8010E94F508C3
:10131000B1CFDF91CF911F910F91FF90EF90DF90B0
:10132000CF90BF90AF909F900895CF93029630E0FA
:1013300020E0FB01E20FF31FDC0140E051E0C0813F
:10134000C11101C050E05D934F5F38964730B1F74F
:101350002F5F3F4F07962830310559F7CF910895F9
:10136000CF93DF93EC011DAE8BAD9CAD009721F0C8
:101370000E94DD151CAE1BAECE010E94EE08CE0110
:10138000DF91CF910C94C708EF92FF920F931F93B8
:10139000CF93DF93EC017B0162EA74E083EA96E08D
:1013A0000E9482108DAD882319F0CE010E94B009F1
:1013B0001DAE1FAE1EAE82E390E0FE01E05CFF4F6B
:1013C000918380833296118210823296118210822C
:1013D00088819981009721F066E070E00E94E51213
:1013E00086E090E00E94DD128C0148E0B7010E9487
:1013F000510C1983088380EE8AAFF8941092B000E4
:101400001092B1008AAD8093B2008091B1008760E4
:101410008093B10080917000816080937000789417
:10142000CE010E94EE08CE010E94C70881E0DF9144
:10143000CF911F910F91FF90EF900895FB01EE0F58
:10144000FF1FE255FE4F85919491840F951FFC017B
:10145000849108952F923F924F925F926F927F9264
:101460008F929F92AF92BF92CF92DF92EF92FF92B4
:101470000F931F93CF93DF9300D000D01F92CDB76F
:10148000DEB79D838C836B018A012B83DC01DD96A3
:101490008C91DD97882319F0CD010E94B009EC8171
:1014A000FD8117AE16AEEE5BFF4F11821082EC810C
:1014B000FD81EA5BFF4F11830083EC81FD81E85BD6
:1014C000FF4F11821082F60101900020E9F7319759
:1014D000EC19E53608F0E4E60C811D810C5B1F4F2A
:1014E000D8011D921C9276014E2E512CC7018C19E9
:1014F0009D0984159505FCF4F70161917F01062E85
:10150000000C770B6052710977FDF0CF6F357105D4
:1015100069F350E040E08C819D810E941E0AD80151
:101520002D913C9111972F5F3F4F820F932F911D6B
:101530008D939C93DBCFF8018081918108969183F4
:1015400080830E944115AC81BD81DC969C938E9373
:10155000DB973601F12CE12CC3018C199D09841510
:1015600095050CF040C0F30101913F01002E000CE5
:10157000110B0052110917FDEFCF0F35110561F363
:1015800050E040E0B8018C819D810E941E0A470115
:10159000AA24A394B12C282E312CAC81BD81DB96DA
:1015A0008D919C91DC97FC01E80DF91DFA83E9838C
:1015B000FFEF8F1A9F0A2A143B0464F0A501B801BB
:1015C000CD010E941E0AA981BA818C93BFEFAB1A8C
:1015D000BB0AE3CFEFEFEE1AFE0AE20CF31CA9817F
:1015E000BA811C92B9CF90E080E0AC81BD81DB96DE
:1015F000ED91FC91DC97EE0DFF1DE80FF91F1082B5
:1016000001968830910589F781E0DD968C93BB8146
:10161000BB2329F0EC81FD8185AD8111FBCF0F90BB
:101620000F900F900F900F90DF91CF911F910F911E
:10163000FF90EF90DF90CF90BF90AF909F908F90F2
:101640007F906F905F904F903F902F9008951F92E2
:101650000F920FB60F9211242F933F934F935F93E6
:101660006F937F938F939F93AF93BF93EF93FF936A
:10167000809170008E7F8093700080918D0688230A
:1016800009F469C080918E0690918F06019690931F
:101690008F0680938E0620919006309191068217D6
:1016A000930708F458C010928F0610928E06E2E558
:1016B000F6E08781819386E0E338F807D1F7E0917F
:1016C0008B06F0918C068091920690919306E80F1C
:1016D000F91FA3E8B6E030E020E0808190E0022E20
:1016E00002C0959587950A94E2F781708D932F5FDC
:1016F0003F4F2730310589F780E596E00E94C70803
:101700008091920690919306019690939306809310
:101710009206209194063091950682179307D8F08F
:101720001092930610929206209196063091970699
:101730002115310581F080919806909199060196C6
:1017400090939906809398068217930720F080E57E
:1017500096E00E94B00980915006909151060E9437
:10176000FB0B80918A068093B200809170008160AB
:1017700080937000FF91EF91BF91AF919F918F91F6
:101780007F916F915F914F913F912F910F900FBE7D
:101790000F901F90189580E596E00C94B408FC011A
:1017A0009081691770F4791760F4671751F003801E
:1017B000F481E02D699FE00DF11D1124E70FF11D6B
:1017C00040830895DC0190E08C91981798F420E014
:1017D0008C91281768F41396ED91FC911497989FBB
:1017E000E00DF11D1124E20FF11D10822F5FF0CFEB
:1017F0009F5FEACF0895EF92FF921F93CF93DF93FD
:10180000EC0110E089819A812881121748F4810F38
:10181000911D60E0FC0180810E94B90D1F5FF2CF35
:101820002D81820F911D61E0FC0180810E94B90D24
:10183000ED8189819A81E80FF92FF11D61E08081A6
:101840000E94F50D10E098818D811917F8F4E12EB2
:10185000F12CEB81FC81EE0DFF1D899FE00DF11D48
:1018600011248081882381F0E981FA81EE0DFF1D2A
:1018700061E080810E94B90DE981FA81EE0DFF1DC2
:1018800060E080810E94F50D1F5FDDCF8F5F8D834B
:10189000891708F01D82DF91CF911F91FF90EF9083
:1018A0000895CF93DF93EC017A8369834883449F43
:1018B000C00111240E9441159C838B831D82CE019F
:1018C0000E94E20BCE01DF91CF910C94FB0B1F9293
:1018D0000F920FB60F9211242F933F938F939F93E4
:1018E000AF93BF9380919F069091A006A091A1060F
:1018F000B091A20630919E0623E0230F2D3768F1A8
:1019000026E8230F0296A11DB11D20939E06809309
:101910009F069093A006A093A106B093A206809183
:101920009A0690919B06A0919C06B0919D06019607
:10193000A11DB11D80939A0690939B06A0939C06CF
:10194000B0939D06BF91AF919F918F913F912F9141
:101950000F900FBE0F901F9018950196A11DB11DFD
:10196000D4CF3FB7F89480919A0690919B06A091AE
:101970009C06B0919D0626B5A89B05C02F3F19F087
:101980000196A11DB11D3FBFBA2FA92F982F8827FF
:10199000BC01CD01620F711D811D911D42E0660FDA
:1019A000771F881F991F4A95D1F708958F929F92AC
:1019B000AF92BF92CF92DF92EF92FF926B017C01C8
:1019C0000E94B10C4B015C01C114D104E104F1048B
:1019D000E9F00E94E7120E94B10C681979098A099E
:1019E0009B09683E73408105910570F321E0C21A9E
:1019F000D108E108F10888EE880E83E0981EA11C4A
:101A0000B11CC114D104E104F10429F7FF90EF9057
:101A1000DF90CF90BF90AF909F908F900895789473
:101A200084B5836084BD85B5836085BDEEE6F0E056
:101A3000808181608083E1E8F0E082E080838081C2
:101A400081608083E0E8F0E0808181608083E1EB69
:101A5000F0E0808184608083E0EBF0E08081816051
:101A60008083E1E9F0E0808183608083E0E9F0E059
:101A7000808181608083E1EAF0E0808183608083FF
:101A8000E0EAF0E080818160808387E880937A00DB
:101A90001092C1000895809312010895883038F0A3
:101AA00092EF980F9B30D8F08931D8F08351209174
:101AB000120190E4299F900111248770822B80935A
:101AC0007C0080917A00806480937A0080917A0013
:101AD00086FDFCCF80917800909179000895892F40
:101AE000E6CF8FEFE4CF82508D3008F03EC0E82F74
:101AF000F0E0E358F24F0C940315B20DB60D8A0DC9
:101B0000900DB50DB50D940D9A0D9E0DA40DB50D4E
:101B1000A80DAE0D809180008F778093800008958E
:101B2000809180008F7DF9CF8091B0008F77809376
:101B3000B00008958091B0008F7DF9CF8091900022
:101B40008F77809390000895809190008F7DF9CFDA
:101B50008091A0008F778093A00008958091A000CD
:101B60008F7DF9CF84B58F7784BD089584B58F7D3F
:101B7000FBCFCF93DF9390E0FC01EC59FB4F249116
:101B800081589B4FFC0184918823C9F090E0880F15
:101B9000991FFC01EE54FB4FA591B491FC01EA554D
:101BA000FB4FC591D49161110DC09FB7F8948C91F2
:101BB000209582238C938881282328839FBFDF91DF
:101BC000CF910895623051F49FB7F8943C91822FE1
:101BD000809583238C93E8812E2BEFCF8FB7F894D9
:101BE000EC912E2B2C938FBFEACF1F93CF93DF93D3
:101BF000282F30E0F901E75BFB4F8491F901EC59A4
:101C0000FB4FD491F901E158FB4FC491CC23A9F0CB
:101C1000162F81110E94730DEC2FF0E0EE0FFF1FC5
:101C2000EA55FB4FA591B4918FB7F894EC9111113F
:101C300008C0D095DE23DC938FBFDF91CF911F9139
:101C40000895DE2BF8CFCF93DF93282F30E0F901F2
:101C5000E75BFB4F8491F901EC59FB4FD491F901FB
:101C6000E158FB4FC491CC23A1F081110E94730D68
:101C7000EC2FF0E0EE0FFF1FE656FB4FA591B4915D
:101C8000EC91ED2381E090E009F480E0DF91CF91C9
:101C9000089580E090E0FACFFC01918D228D892F8C
:101CA00090E0805C9F4F821B91098F739927089564
:101CB000FC01918D828D981731F0828DE80FF11D16
:101CC000858D90E008958FEF9FEF0895FC01918D31
:101CD000828D981761F0A28DAE0FBF2FB11D5D965A
:101CE0008C91928D9F5F9F73928F90E008958FEFFC
:101CF0009FEF0895FC01538D448D252F30E0842FF4
:101D000090E0821B930B541710F0CF960895019723
:101D1000089583EE9FE0892B49F08EEE97E0892BA2
:101D200029F00E94E30F81110E94EE0780E090E00D
:101D3000892B49F080E090E0892B29F00E94000077
:101D400081110C9400000895FC01A48DA80FB92FF7
:101D5000B11DA35ABF4F2C91848D90E001968F73D3
:101D60009927848FA689B7892C93A089B1898C91F2
:101D7000837080648C93938D848D981306C0028841
:101D8000F389E02D80818F7D80830895CF93DF9349
:101D9000EC01888D8823B9F0AA89BB89E889F98983
:101DA0008C9185FD03C0808186FD0DC00FB607FCB8
:101DB000F7CF8C9185FFF2CF808185FFEDCFCE01EB
:101DC0000E94A40EE9CFDF91CF910895EF92FF9288
:101DD0000F931F93CF93DF93EC0181E0888F9B8D4E
:101DE0008C8D98131AC0E889F989808185FF15C008
:101DF0009FB7F894EE89FF896083E889F98980812B
:101E00008370806480839FBF81E090E0DF91CF91F9
:101E10001F910F91FF90EF900895F62E0B8D10E01B
:101E20000F5F1F4F0F731127E02E8C8D8E110CC08A
:101E30000FB607FCFACFE889F989808185FFF5CFD5
:101E4000CE010E94A40EF1CFEB8DEC0FFD2FF11D02
:101E5000E35AFF4FF0829FB7F8940B8FEA89FB8912
:101E600080818062CFCFCF92DF92EF92FF921F935B
:101E7000CF93DF93EC016A017B01122FE889F98986
:101E800082E08083C11481EED806E104F104A1F060
:101E900060E079E08DE390E0A70196010E94C21412
:101EA0002150310941095109569547953795279594
:101EB000211580E1380798F0E889F989108260E8F7
:101EC00074E88EE190E0A70196010E94C2142150AF
:101ED0003109410951095695479537952795EC8564
:101EE000FD853083EE85FF852083188EEC89FD8982
:101EF0001083EA89FB89808188698083EA89FB896C
:101F000080818F7D8083DF91CF911F91FF90EF9033
:101F1000DF90CF9008951F920F920FB60F92112469
:101F20002F938F939F93EF93FF93E091B306F091DC
:101F3000B4068081E091B906F091BA0682FD1BC01B
:101F400090818091BC068F5F8F732091BD068217B0
:101F500041F0E091BC06F0E0ED55F94F958F80938C
:101F6000BC06FF91EF919F918F912F910F900FBE23
:101F70000F901F9018958081F4CF1F920F920FB68B
:101F80000F9211242F933F934F935F936F937F93FF
:101F90008F939F93AF93BF93EF93FF9383EA96E062
:101FA0000E94A40EFF91EF91BF91AF919F918F91ED
:101FB0007F916F915F914F913F912F910F900FBE45
:101FC0000F901F90189583EA96E00E944C0E21E036
:101FD000892B09F420E0822F0895E3EAF6E01382CA
:101FE000128288EE93E0A0E0B0E084839583A6831C
:101FF000B78382E295E09183808385EC90E09587BA
:10200000848784EC90E09787868780EC90E0918BC2
:10201000808B81EC90E0938B828B82EC90E0958BAF
:10202000848B86EC90E0978B868B118E128E138EAC
:10203000148E0895AF92BF92CF92DF92EF92FF92EB
:102040000F931F93CF93DF936C017B018B01040FE0
:10205000151FEB015E01AE18BF08C017D10759F07C
:102060006991D601ED91FC910190F081E02DC601BE
:102070000995892B79F7C501DF91CF911F910F91B8
:10208000FF90EF90DF90CF90BF90AF900895FB014D
:1020900001900020E9F73197AF01461B570BDC0197
:1020A000ED91FC910280F381E02D0994DB011496FF
:1020B0004D915C9115976D917C91DC01ED91FC91B6
:1020C0000280F381E02D09946115710511F00C94E3
:1020D000471090E080E0089560E375E00C944710AD
:1020E0000F931F93CF93DF93EC010E9456108C0146
:1020F000CE010E946C10800F911FDF91CF911F9134
:102100000F9108950F931F93CF93DF938C01D0E02D
:10211000C0E06115710519F00E944710EC01C8017B
:102120000E946C108C0F9D1FDF91CF911F910F911A
:102130000895CF92DF92EF92FF926B017C01C11460
:10214000D104E104F10441F00E94B216A701960106
:102150000E94E4146B017C01C701B601FF90EF906F
:10216000DF90CF900895CF92DF92EF92FF926B01B4
:102170007C01C216D306E406F50664F4CA01B9016F
:102180006C197D098E099F090E949910C60ED71EF1
:10219000E81EF91EC701B601FF90EF90DF90CF90C7
:1021A00008950895FC0180819181009711F00C94AD
:1021B000DD150895CF93DF93EC0188819981009715
:1021C00011F00E94DD15198218821D821C821B826B
:1021D0001A82DF91CF9108950F931F93CF93DF93CE
:1021E000EC018B016F5F7F4F888199810E940A17F4
:1021F000009751F0998388831B830A8381E0DF91E4
:10220000CF911F910F91089580E0F9CFCF93DF9385
:10221000EC0188819981892B49F08A819B818617FD
:10222000970720F081E0DF91CF910895CE010E94C1
:10223000EC108823C1F38C819D81892B99F7E8816B
:10224000F9811082EFCFEF92FF920F931F93CF93FC
:10225000DF93EC017B018A01BA010E940611811112
:102260000BC0CE010E94DA10CE01DF91CF911F91F9
:102270000F91FF90EF9008951D830C83B701888123
:1022800099810E94E917F0CFFC011182108213821C
:102290001282158214826115710551F0FB010190C3
:1022A0000020E9F73197AF01461B570B0C9423111F
:1022B0000895FB0101900020E9F73197AF01461B1B
:1022C000570B0C9423110F931F93CF93DF938C0123
:1022D000EB01FC0180819181009701F16881798196
:1022E00061157105C9F021ED30E1232BA9F0428180
:1022F00053812C813D814217530770F00E94E917EA
:102300008C819D81F801958384831D821C82DF91DD
:10231000CF911F910F9108950E94DD1588819981B9
:10232000F801918380838A819B81938382838C814E
:102330009D8195838483198218821B821A82E5CF3E
:10234000CF93DF93EC018617970711F00E9463117A
:10235000CE01DF91CF910895CF93DF93EC0161150A
:10236000710531F00E945911CE01DF91CF9108958E
:102370000E94DA10F9CFEF92FF920F931F93CF9341
:10238000DF936115710541F480E0DF91CF911F91DA
:102390000F91FF90EF90089541155105B1F07B0129
:1023A000EC010C811D81040F151FB8010E9406115C
:1023B000882351F3288139818C819D81B701820F57
:1023C000931F0E94E9171D830C8381E0DECFCF931A
:1023D000DF9300D0CDB7DEB769831A8241E050E0C9
:1023E000BE016F5F7F4F0E94BB110F900F90DF9176
:1023F000CF910895CF93DF93EC01FB014481558188
:10240000608171810E94BB11811103C0CE010E94C5
:10241000DA10CE01DF91CF910895FC01248135813E
:10242000232B31F421E0FB01672B49F4822F08951F
:10243000808191816115710539F421E0FC01808171
:102440008823A1F320E0F2CF0E94E01721E0892B3E
:1024500069F3F8CFAF92BF92CF92DF92EF92FF92E3
:102460000F931F93CF93DF935C016B017A01890176
:102470002417350720F48F2D7901042F182F62E3DC
:1024800075E0C5010E944411D6011496CD91DC91EE
:10249000EC16FD06C8F40C171D0708F4E801D60178
:1024A000ED91FC911197EC0FFD1F108110826D9141
:1024B0007C916E0D7F1DC5010E94AC11F6018081DB
:1024C0009181C80FD91F1883C501DF91CF911F914A
:1024D0000F91FF90EF90DF90CF90BF90AF90089555
:1024E000AF92BF92CF92DF92EF92FF920F931F9322
:1024F000CF93DF93DC01CD90DC901197C114D10410
:1025000039F01496CD91DC918C017601209761F41D
:10251000DF91CF911F910F91FF90EF90DF90CF90BF
:10252000BF90AF90089575015701BFEFAB1ABB0A7A
:10253000F7018081082E000C990B0E94C717892B88
:1025400091F72197CC0DDD1D8881082E000C990B89
:102550000E94C717892B29F0CE15DF0510F02197AF
:10256000F3CFAE014F5F5F4F4E195F09D80115964B
:102570005C934E931497CE14DF0420F4B701C60188
:102580000E94D017D801ED91FC91119714968D916E
:102590009C91E80FF91F1082BBCF08950E940F0D88
:1025A0000E94CD120E944703C9E8DEE00E94950711
:1025B0002097E1F30E94890EF9CF009711F481E092
:1025C00090E00C9441150C94DD150C94E3120895E1
:1025D0005058BB27AA270E9400130C941B140E947A
:1025E0000D1438F00E94141420F039F49F3F19F4B0
:1025F00026F40C940A140EF4E095E7FB0C940414F2
:10260000E92F0E942C1458F3BA1762077307840746
:10261000950720F079F4A6F50C944E140EF4E0958D
:102620000B2EBA2FA02D0B01B90190010C01CA018C
:10263000A0011124FF27591B99F0593F50F4503E37
:1026400068F11A16F040A22F232F342F4427585F29
:10265000F3CF469537952795A795F0405395C9F741
:102660007EF41F16BA0B620B730B840BBAF09150F9
:10267000A1F0FF0FBB1F661F771F881FC2F70EC098
:10268000BA0F621F731F841F48F48795779567956B
:10269000B795F7959E3F08F0B0CF9395880F08F057
:1026A0009927EE0F9795879508950E9469130C94CA
:1026B0001B140E94141458F00E940D1440F029F4C9
:1026C0005F3F29F00C94041451110C944F140C9496
:1026D0000A140E942C1468F39923B1F3552391F343
:1026E000951B550BBB27AA2762177307840738F081
:1026F0009F5F5F4F220F331F441FAA1FA9F335D0DE
:102700000E2E3AF0E0E832D091505040E695001C91
:10271000CAF72BD0FE2F29D0660F771F881FBB1F4B
:10272000261737074807AB07B0E809F0BB0B802D29
:10273000BF01FF2793585F4F3AF09E3F510578F055
:102740000C9404140C944F145F3FE4F3983ED4F3BC
:10275000869577956795B795F7959F5FC9F7880F29
:10276000911D9695879597F90895E1E0660F771F7B
:10277000881FBB1F621773078407BA0720F0621B0C
:10278000730B840BBA0BEE1F88F7E0950895E8945D
:1027900009C097FB3EF490958095709561957F4FA9
:1027A0008F4F9F4F9923A9F0F92F96E9BB27939557
:1027B000F695879577956795B795F111F8CFFAF467
:1027C000BB0F11F460FF1BC06F5F7F4F8F4F9F4F98
:1027D00016C0882311F096E911C0772321F09EE8F6
:1027E000872F762F05C0662371F096E8862F70E05C
:1027F00060E02AF09A95660F771F881FDAF7880F36
:102800009695879597F9089597F99F6780E870E006
:1028100060E008959FEF80EC089500240A94161656
:10282000170618060906089500240A9412161306BE
:10283000140605060895092E0394000C11F488234C
:1028400052F0BB0F40F4BF2B11F460FF04C06F5F68
:102850007F4F8F4F9F4F089557FD9058440F551F3E
:1028600059F05F3F71F04795880F97FB991F61F012
:102870009F3F79F087950895121613061406551F89
:10288000F2CF4695F1DF08C0161617061806991FF5
:10289000F1CF86957105610508940895E894BB27EA
:1028A00066277727CB0197F908950E9468140C9446
:1028B0001B140E940D1438F00E94141420F095236C
:1028C00011F00C9404140C940A1411240C944F1459
:1028D0000E942C1470F3959FC1F3950F50E0551F83
:1028E000629FF001729FBB27F00DB11D639FAA2765
:1028F000F00DB11DAA1F649F6627B00DA11D661FB4
:10290000829F2227B00DA11D621F739FB00DA11DD4
:10291000621F839FA00D611D221F749F3327A00D8E
:10292000611D231F849F600D211D822F762F6A2F2A
:1029300011249F5750409AF0F1F088234AF0EE0F8F
:10294000FF1FBB1F661F771F881F91505040A9F7BC
:102950009E3F510580F00C9404140C944F145F3F7B
:10296000E4F3983ED4F3869577956795B795F795F8
:10297000E7959F5FC1F7FE2B880F911D9695879570
:1029800097F90895A1E21A2EAA1BBB1BFD010DC0E9
:10299000AA1FBB1FEE1FFF1FA217B307E407F5070F
:1029A00020F0A21BB30BE40BF50B661F771F881FEB
:1029B000991F1A9469F760957095809590959B0181
:1029C000AC01BD01CF010895052E97FB1EF40094C4
:1029D0000E94FB1457FD07D00E94C21407FC03D0CD
:1029E0004EF40C94FB1450954095309521953F4F33
:1029F0004F4F5F4F089590958095709561957F4FEB
:102A00008F4F9F4F0895EE0FFF1F0590F491E02D1B
:102A100009940E941415A59F900DB49F900DA49F3A
:102A2000800D911D11240895A29FB001B39FC00194
:102A3000A39F700D811D1124911DB29F700D811DEA
:102A40001124911D0895EF920F931F93CF93DF935D
:102A5000E80134E047FD34E1042E000C550B57FF2C
:102A600003C0519541955109E32E022F242FAE0149
:102A70000E94FC19CE01DF91CF911F910F91EF9031
:102A800008950F931F93CF93DF938230910510F435
:102A900082E090E0E0914207F091430730E020E0CF
:102AA000B0E0A0E0309799F42115310509F44AC04F
:102AB000281B390B24303105D8F58A819B8161159B
:102AC000710589F1FB0193838283FE0111C040816E
:102AD00051810281138148175907E0F048175907BF
:102AE00099F4109761F012960C93129713961C9319
:102AF0003296CF01DF91CF911F910F9108950093EE
:102B0000420710934307F4CF2115310551F04217C6
:102B1000530738F0A901DB019A01BD01DF01F8017B
:102B2000C1CFEF01F9CF9093430780934207CDCFF8
:102B3000FE01E20FF31F81939193225031093983F3
:102B40002883D7CF2091400730914107232B41F4B0
:102B500020910201309103013093410720934007F7
:102B600020910001309101012115310541F42DB76B
:102B70003EB74091040150910501241B350BE091B3
:102B80004007F0914107E217F307A0F42E1B3F0B1B
:102B90002817390778F0AC014E5F5F4F24173507CF
:102BA00048F04E0F5F1F50934107409340078193B9
:102BB00091939FCFF0E0E0E09CCFCF93DF9300971D
:102BC000E9F0FC01329713821282A0914207B09182
:102BD0004307ED0130E020E01097A1F4208131811E
:102BE000820F931F20914007309141072817390722
:102BF00009F061C0F0934107E0934007DF91CF9166
:102C00000895EA01CE17DF07E8F54A815B819E014E
:102C100041155105B1F7E901FB83EA8349915991C7
:102C2000C40FD51FEC17FD0761F4808191810296D6
:102C3000840F951FE90199838883828193819B8307
:102C40008A83F0E0E0E012968D919C9113970097B3
:102C5000B9F52D913C911197CD010296820F931FEA
:102C600020914007309141072817390739F63097EE
:102C700051F51092430710924207B0934107A09379
:102C80004007BCCFD383C28340815181840F951FFD
:102C9000C817D90761F44E5F5F4F88819981480F4B
:102CA000591F518340838A819B819383828321159D
:102CB000310509F0B0CFF0934307E09342079ECF70
:102CC000FD01DC01C0CF13821282D7CF8F929F9279
:102CD000AF92BF92CF92DF92EF92FF92CF93DF93AA
:102CE000EC01688179818A819B816115710581057B
:102CF000910521F464E279ED8BE597E02DE133EF66
:102D000041E050E00E94E41449015A019B01AC01EA
:102D1000A7EAB1E40E9409156B017C01ACEEB4EFA7
:102D2000A50194010E94F31CC60ED71EE81EF91ED1
:102D3000F7FE06C081E0C81AD108E10880E8F80A69
:102D4000C882D982EA82FB82C701B6019F77DF91F0
:102D5000CF91FF90EF90DF90CF90BF90AF909F907A
:102D60008F9008958F929F92AF92BF92CF92DF92F1
:102D7000EF92FF9260910601709107018091080126
:102D800090910901611571058105910521F464E2B5
:102D900079ED8BE597E02DE133EF41E050E00E94C3
:102DA000E41449015A019B01AC01A7EAB1E40E9475
:102DB00009156B017C01ACEEB4EFA50194010E94F2
:102DC000F31CC60ED71EE81EF91EF7FE06C081E0F2
:102DD000C81AD108E10880E8F80AC0920601D0922A
:102DE0000701E0920801F0920901C701B6019F773F
:102DF000FF90EF90DF90CF90BF90AF909F908F901B
:102E000008956093060170930701809308019093E1
:102E100009010895B0E0A0E0E0E1F7E10C94FA1CAC
:102E20008C01009751F4CB010E9441158C01C8011F
:102E3000CDB7DEB7E0E10C94161DFC01E60FF71FDD
:102E40009C0122503109E217F30708F49DC0D90113
:102E5000CD91DC911197C617D70798F0C530D105F1
:102E600030F3CE0104978617970708F3C61BD70BDC
:102E70002297C193D1936D937C93CF010E94DD156E
:102E8000D6CF5B01AC1ABD0A4C018C0E9D1EA091E1
:102E90004207B0914307512C412CF12CE12C1097A3
:102EA00031F580914007909141078815990509F007
:102EB0005CC04616570608F058C0809100019091FA
:102EC0000101009741F48DB79EB7409104015091E4
:102ED0000501841B950BE817F90708F055C0F0931E
:102EE0004107E0934007F90171836083A0CF8D9182
:102EF0009C91119712966C90129713967C90139751
:102F0000A815B90559F56C0142E0C40ED11CCA14CC
:102F1000DB0420F1AC014A195B09DA01129615971E
:102F200080F06282738251834083D9016D937C93D8
:102F3000E114F10471F0D7011396FC93EE9312970C
:102F400076CF22968C0F9D1FF90191838083F30128
:102F5000EFCFF0934307E093420769CF4816590635
:102F600008F42C017D01D3019ACFCB010E944115B9
:102F70007C01009749F0AE01B8010E94D017C8014A
:102F80000E94DD15870153CF10E000E050CF911172
:102F90000C94331C803219F089508550C8F708957D
:102FA000FB01DC0102C001900D9241505040D8F766
:102FB0000895DC0101C06D9341505040E0F7089541
:102FC000FB01DC018D91019080190110D9F3990B5F
:102FD0000895FB01DC0101900D920020E1F70895B6
:102FE000FB01DC014150504048F001900D9200205F
:102FF000C9F701C01D9241505040E0F70895AEE07E
:10300000B0E0E5E0F8E10C94061D0D891E8986E02C
:103010008C831A8309838FEF9FE79E838D83AE0194
:10302000475E5F4F6F89788DCE0101960E9422180E
:103030002F813885020F131FF80110822E96E4E0CD
:103040000C94221DABE0B0E0E8E2F8E10C94F81C2F
:103050007C013B018A01FC0117821682838181FF7A
:10306000C8C1CE0101965C01F7019381F30193FD84
:10307000859193FF81913F01882309F453C18532E3
:1030800039F493FD859193FF81913F01853229F4B5
:10309000B70190E00E944C1CE7CF912C212C312CE1
:1030A000FFE1F31538F08B3211F190F4803209F121
:1030B000833229F137FC3CC020ED280F2A3050F52F
:1030C00036FE20C08AE0989E200D1124922E06C064
:1030D0008D3291F0803371F7689430F8F30193FDED
:1030E000859193FF81913F018111DACF21C06894CE
:1030F00031F8689432F8F2CF689433F8EFCF6894DF
:1031000034F8ECCFEAE02E9E200D1124222E689494
:1031100035F8E4CF8E3229F436FC04C1689436F8D1
:10312000DDCF8C3619F4689437F8D8CF8836B1F2F1
:10313000982F9F7D95549330E0F08336A1F183372B
:10314000C1F1833509F063C02801F2E04F0E511C34
:10315000F801C080D180692D70E036FC02C06FEFAD
:103160007FEFC6010E94361C4C01689437F882013B
:103170000AC00C5F1F4FFFE3F98388248394912CCE
:103180006501E89437F833FE2DC0522C8114910468
:1031900071F5552009F468CFB70180E290E00E94F4
:1031A0004C1C5A94F6CFF801808189830E5F1F4F23
:1031B000E4CF2801F2E04F0E511CF801C080D1800D
:1031C000692D70E036FC02C06FEF7FEFC6010E94F0
:1031D000411C4C018201D5CFB70180E290E00E94F2
:1031E0004C1C2A942814190409F0B0F7CECFF6012C
:1031F00037FC859137FE81916F01B70190E00E9405
:103200004C1C51105A94F1E08F1A9108BFCF8436AC
:1032100019F0893609F077C0F80137FE6BC060817C
:103220007181828193810C5F1F4FF32DFF763F2EBA
:1032300097FF09C090958095709561957F4F8F4F4E
:103240009F4F689437F82AE030E0A5010E947C1C6B
:10325000C82ECA188C2C432C36FE0CC0E89440F8BB
:10326000C91440F434FE05C032FC03C0F32DFE7EC9
:103270004F2E892C44FE95C0FE01EC0DF11D80817E
:10328000803309F087C0242D297E422E842D88703A
:10329000582E43FC95C040FE8FC09C2C821418F41D
:1032A0002C0C922C981844FE91C0B70180E390E05A
:1032B0000E944C1C42FE09C088E790E041FE02C01B
:1032C00088E590E0B7010E944C1CC91408F48AC03C
:1032D000CA94D12C9FEFC91AD90ACA0CDB1CF6017B
:1032E00082916F01B70190E00E944C1CAC14BD04A8
:1032F000B1F74FCF60817181072E000C880B990BBD
:103300000E5F1F4F92CFD32CE894D4F82AE030E020
:10331000853739F1232D297FD22E8F3601F148F4DC
:103320008835A9F0F701868197812B96E2E10C940C
:10333000141D803749F08837A9F7D4FE02C068947D
:10334000D2F820E130E00DC06894D4F8F6CF34FE16
:1033500003C0822F8660D82E20E132E002C028E030
:1033600030E0F801D7FE0FC06081718182819381C6
:103370000C5F1F4FA5010E947C1CC82ECA183D2C53
:10338000E89437F867CF6081718190E080E00E5F4C
:103390001F4FF0CF42FC02C0839478CF8394839474
:1033A00075CF842D867809F471CFF6CFB70180E20E
:1033B00090E00E944C1C83948214C0F3512C73CF74
:1033C000522C5818821408F46ECFF8CF842D8678CA
:1033D00009F47BCF8BE241FE80E247FC8DE2B7012E
:1033E00090E071CFB70180E390E00E944C1C9A946A
:1033F0006CCF8FEF9FEF99CFA9E0B0E0E2E0FAE168
:103400000C94FE1C6A01F22EB02E102FFBE3AF2E9F
:10341000A01608F41BE31F5F012F27E0AE014F5FEA
:103420005F4F0E945B1BBC018981982F997091307E
:1034300009F43FC09BE2E1FC04C09E2D9170E0FCCA
:103440003AC05E2D5071E82FE87083FF46C084E0DB
:10345000911101C083E0EF2DE81B8F1508F0E0E02B
:10346000D6018E2F20E2552351F1992329F0D60160
:103470009C93C60101966C0196012D5F3F4FE2FEC1
:1034800024C08EE4D6018C9391E411969C931197FD
:1034900012968C93D9018E2F90E281111BC0E20FFE
:1034A000F32FF11D10828EEF9FEF2996ECE00C9424
:1034B0001A1D9DE2C6CF90E2C4CF2D938150811199
:1034C000FCCFCE0ED11CE0E0D0CF8EE6D6018C939F
:1034D00091E6DBCF9D938150E0CF482F447082FF6F
:1034E0003DC084E0911101C083E08F1510F4EF2DF1
:1034F000E81BD6018E2F20E2552309F1992329F0EC
:10350000D6019C93C60101966C0196012D5F3F4F39
:10351000E2FE1BC089E4D6018C938EE411968C9355
:10352000119786E412968C93D9018E2F90E288230E
:1035300009F4B5CF9D938150FACF2D93815081111D
:10354000FCCFCE0ED11CE0E0D9CF89E6D6018C931A
:103550008EE611968C93119786E6E4CF9B0177FF58
:1035600002C030E020E0A1E0B0E0911102C0B0E084
:10357000A0E0F9013196AE0FBF1F8B2C912CBB2020
:1035800009F461C05401EFEFAE1ABE0AAA0DBB1DCB
:10359000FA161B0619F014F04F2D4A1B511188C062
:1035A000E3FC59C07601A42FB0E2A1114FC0C40EB4
:1035B000D11C992309F45BC040E0D6011196F601B5
:1035C00090836D01552309F448C0012F060F9A819D
:1035D000582F507184FF03C0913309F40150101625
:1035E0000CF047C0093008F008E0EEE2FE2E5B0167
:1035F000A01AB10885019194819491082F3F320758
:1036000029F4D601FC92F60131966F016217730717
:1036100094F1021713077CF5DB01A21BB30BAA245C
:10362000A394B12CAC0EBD1EAA0DBB1D11968C919E
:1036300021503109D601119628153905F4F0F6010B
:1036400080836D01DBCFB12CA12CA0CFF701B1930A
:103650007F01A150AACF9111B0CFD601942F50E392
:1036600002C05D9391509111FCCFC40ED11C40E07B
:10367000ACCF01E0BACF80E3DBCF6217730731F440
:10368000963388F4953311F4552369F0F60180835D
:10369000FD01842F90E2811108C0A40FB11D1C927E
:1036A00090E080E002CF81E3F1CF91938150F3CF9E
:1036B000911183CF8ACF283008F027E03327DA0131
:1036C000990F311D87FD916000966105710539F4F0
:1036D00032602E5F3D9330E32A95E1F708959F3FD6
:1036E00030F080387105610509F03C5F3C5F3D9327
:1036F000913008F08068911DDF93CF931F930F9353
:10370000FF92EF92192F987F9695E92F96959695AF
:10371000E90FFF27E25FFE4F99273327EE24FF24AE
:10372000A701E70105900894079428F4360FE71ED7
:10373000F81E491F511D660F771F881F991F069499
:10374000A1F70590079428F4E70EF81E491F561FAD
:10375000C11D770F881F991F661F0694A1F705905A
:10376000079428F4F80E491F561FC71FD11D880F54
:10377000991F661F771F0694A1F70590079420F400
:10378000490F561FC71FD81F990F661F771F881F25
:103790000694A9F784911095177041F0D695C795B6
:1037A00057954795F794E7941A95C1F7E4EBF0E045
:1037B00068941590159135916591959105907FE2EA
:1037C0007395E118F10A430B560BC90BD009C0F7EA
:1037D000E10CF11E431F561FC91FD01D7EF470332C
:1037E00011F48A95E6CFE894015030F0080F0AF4FE
:1037F0000027021708F4202F2395022F7A3328F090
:1038000079E37D932A95E9F710C07D932A9589F68F
:10381000069497956795379517951794E118F10ACF
:10382000430B560BC90BD00998F023957E917395E5
:103830007A3308F070E37C932013B8F77E917061BF
:103840007D9330F0839571E37D9370E32A95E1F7E2
:103850001124EF90FF900F911F91CF91DF91992745
:1038600087FD90950895992788270895FC01059074
:10387000615070400110D8F7809590958E0F9F1F72
:103880000895FC016150704001900110D8F78095B7
:1038900090958E0F9F1F08950F931F93CF93DF93E3
:1038A000182F092FEB018B8181FD09C01FEF0FEF4E
:1038B000812F902FDF91CF911F910F91089582FF5B
:1038C00014C02E813F818C819D81281739073CF4DB
:1038D000E881F981CF0101969983888310838E81D5
:1038E0009F8101969F838E83E3CFE885F985812FA1
:1038F0000995892BA1F3DACFFA01AA27283051F1D3
:10390000203181F1E8946F936E7F6E5F7F4F8F4F10
:103910009F4FAF4FB1E03ED0B4E03CD0670F781F6F
:10392000891F9A1FA11D680F791F8A1F911DA11D54
:103930006A0F711D811D911DA11D20D009F468948D
:103940003F912AE0269F11243019305D3193DEF635
:10395000CF010895462F4770405D4193B3E00FD0EB
:10396000C9F7F6CF462F4F70405D4A3318F0495DD6
:1039700031FD4052419302D0A9F7EACFB4E0A695B9
:103980009795879577956795BA95C9F700976105DB
:10399000710508959B01AC010A2E06945795479531
:1039A00037952795BA95C9F7620F731F841F951F26
:1039B000A01D0895F999FECF92BD81BDF89A99276F
:1039C00080B50895262FF999FECF1FBA92BD81BD0B
:1039D00020BD0FB6F894FA9AF99A0FBE0196089591
:1039E000B7FF0C9409150E940915821B930B0895CB
:1039F0002F923F924F925F926F927F928F929F92FF
:103A0000AF92BF92CF92DF92EF92FF920F931F93EC
:103A1000CF93DF93CDB7DEB7CA1BDB0B0FB6F8949D
:103A2000DEBF0FBECDBF09942A88398848885F84DD
:103A30006E847D848C849B84AA84B984C884DF804E
:103A4000EE80FD800C811B81AA81B981CE0FD11D32
:103A50000FB6F894DEBF0FBECDBFED01089512E0A2
:103A6000C2E6D2E004C0FE010E9403152196C336CF
:083A7000D107C9F7F894FFCF5C
:103A78000000440780000100000002030405060757
:103A8800080901454550524F4D2068617320626511
:103A9800656E20636C65617265642E005465787488
:103AA80020736176656420746F20454550524F4DF0
:103AB8003A20004E6F2076616C69642074657874D2
:103AC80020666F756E6420696E20454550524F4DD3
:103AD8002E205573696E672064656661756C742065
:103AE800746578742E00546578742072656164205A
:103AF80066726F6D20454550524F4D3A200048651B
:103B08006C6C6F2E2054686973206973206120667D
:103B1800756E204368726973746D617320646563A0
:103B28006F726174696F6E2E0043616E20646973F1
:103B3800706C617920612074657874207769746885
:103B4800206D6178696D756D20343020636861720D
:103B58006163746572732E0054657874206C6172A9
:103B6800676572207468616E203430206368617202
:103B78006163746572732077696C6C206265207468
:103B880072756E63617465642E0043616E206469AA
:103B980073706C617920616C736F2074656D7065EA
:103BA80072617475726520616E642066756E20613D
:103BB8006E696D6174696F6E732E00486176652059
:103BC80066756E20776974682074686973206675F5
:103BD8006E206465636F726174696F6E2100446959
:103BE80073706C61792074656D706572617475723B
:103BF800652E2E2E0054656D703A202573204300E3
:103C0800446973706C617920736E6F77696E672E83
:103C18002E2E00446973706C617920612063686995
:103C28006C64206F6E2074686520736C65642E2E3A
:103C38002E00446973706C617920736D616C6C201F
:103C48004368726973746D6173206465636F726130
:103C580074696F6E732E2E2E00446973706C6179CF
:103C68002066697265776F726B732E2E2E00446919
:103C780073706C61792072616E646F6D20736E6F02
:103C880077666C616B65732E2E2E004D6F64203342
:103C98003A20616C6C20746F6765746865722E00D9
:103CA8004D6F6420313A206F6E6C79206D657373A7
:103CB8006167652E004D6F6420323A206F6E6C7913
:103CC80020706963746F6772616D732E004D6F6445
:103CD80020303A206F6E6C792074656D7065726162
:103CE800747572652E005265636569766564206E29
:103CF800657720746578743A200044656C6574654E
:103D08005F6D65737361676500454550524F4D207F
:103D1800636C65617265642E204E6F2074657874DB
:103D280020736176656420696E20454550524F4D79
:103D38002E00000100000001000000000100000149
:103D48000000000100010000010000000000010067
:103D58000100010001000001000000000001000056
:103D68000001000100000000000000000100000147
:103D78000000000100010000010000000000010037
:103D88000100010001000001000000000001000026
:103D98000001000100000000000000000001000018
:103DA8000001000100000100000000010001010104
:103DB80000000001000001000001010001000000F6
:103DC80000010001000000000001000000000001E7
:103DD80000010000000000000100000000000101D7
:103DE80001000000000101010000000000010101C4
:103DF80000000101010101010101000001000001B1
:103E080000000100010000010000000101010101A2
:103E18000101496E206C6962726172696500000770
:103E28000006000500040003000200010107010666
:103E3800010501040103010201000207020602054F
:103E48000204020302010200030703060305030438
:103E58000302030103000407040604050403040223
:103E6800040104000507050605040503050205010C
...

This file has been truncated, please download it to see its full contents.

BadgerHack example

C/C++
No preview (download only).

BadgerStick example

C/C++
No preview (download only).

LED_Array_8x7 example

C/C++
Examples for shapes, dots, text on charliplexed matrix
No preview (download only).

Chaplex

C/C++
Used to display informations on charliplexed led matrix
No preview (download only).

Credits

Mihai Popa

Mihai Popa

6 projects • 7 followers
I am working as test engineer for navigation systems in auto industry. I am passionate about science, IoT, ML, MCU programming, SF movies.

Comments