Category Archives: Reverse Engineering

Magic Sing Karaoke Microphone Tear Down, Part 2

I’m back!  I have a tendency to pause projects for lengthy periods of time, so here is part 2 of my Magic Sing Karaoke Microphone Tear Down.  This time, we’re actually going to look inside the microphone, which serves as a remote control as well.

On the outside we see a nicely designed case with buttons, and an LCD screen.

Upon power up, the LCD reads “SYNC”.  When you turn on the base station, they connect and the LCD says “Karaoke” which is the default menu option.  The communications is two-way, what happens on the screen is reflected in the LCD.  When you enter a song # or browse for a song and select it, the song # is displayed.

Let’s open it up!  (Carefully)!

We see one lengthy PCB with a silver box on the end.  That silver box indicates RF shielding…So that means the radio is under that hood.

Confirmed!  These chips are a TI CC2400 transceiver (2.4ghz), an undocumented CASUH retaw1-05, and an SST 1Mbit flash chip.  The retaw1-05 is a RF modem chip, but could not find a datasheet on it.

The back of the radio board is boring, but has a couple of connectors.  Moving on…

How the two boards look when separated.  At the left side of the long board is an ATMEGA48.  It is right under the LCD so I’m going to guess it is the button/LCD controller.  I’m pretty sure we can assume that the Atmel also connects to the retaw1-05 radio modem chip.


They made a failed attempt at covering that ATMega48..

Below we can see the codec chip (AIC311). This chip is responsible for converting the audio from the microphone into a digital stream.  It has some other neat capabilities such as pitch changing, base, treble adjustments, etc. By the location, and the traces that run out to the right, I can extrapolate that this chip feeds directly into the bottom black connector going to the radio board.  The Atmega48 surely has some control lines going to this as well.

To Do:

It would be really neat if I could sniff the packets coming out of that CC2400.  I’m also not sure if both the RF Modem and the CC2400 are generating radio frequencies. The datasheet (two page only) that I could find on the Retaw says it is 2.4ghz but it also says it can interface with a CC2400.  There are many products from Korea that use this chip alone for both audio and data (phones, head phones, etc), so I’m a bit confused why they use both chips.

Magic Sing Karaoke Microphone Tear Down, Part 1

I bought this Magic Sing Karaoke microphone system many years ago and my family and friends have enjoyed and some times been annoyed by it quite often!  It truly is a really neat gadget..  I’ve got a plethora of photos of the inside, the outside and the on screen displays.

The microphone base has 2500 songs built in, and has several add on slots for song chips that are available online for about $60 a pop.

The base also has an SD card slot, but it is not for songs.  It is only used for storing user content, photos, backgrounds, movies and songs recorded live.

The system includes two cordless microphones that also each act as a remote control.

The model # I have is the ET19KV.  I originally paid $499 for it!  But that was like eight years ago!

Under the top cover of the base unit we find the slots for expansion chips.  I’m impressed by the number of slots.  Some song chips have 200, 400 songs!  But most have between 60 and 100.  The songs are of the MIDI type.  You can watch the video at the end of the article to hear the actual sound quality.


The rear of the base has the output connections:


The wireless microphone antenna:


Let’s open it up!  Don’t tell my wife!  At least I put it back and no extra screws were left!



Interesting things in here.  The big black parking lot sized chip on the left is an FPGA!  The chip on the right is a flash memory chip, which holds the circuit design for the FPGA.  If you’re not familiar with FPGAs, they are essentially a blank canvas for creating eletronic circuits using logic gates.  They have millions of gates or connections that can be configured into just about any digital circuit imaginable.




I’m very curious about the squigly lines shown above.  These traces, they were intentionally designed that way, I wonder why?

The chip on the bottom left of the below picture is the NTSC/PAL video encoder/decoder.


Another big chip!  This one is a Sunplus DVD/Mpeg1/2 decoder.  I suppose this is for playing movies off the SD card:


You can store Karaoke Movies on an SD Card and play them on the MagicSing.  There is special software called MagicSing Encoder that you need to use to get the best results.  There are lots of sources for Mp3/CDG files that can be converted to the video format usable on the MagicSing.  You can scrounge up CDG discs at yard sales etc and rip them to your hard drive if you have the right CD reader.


Here is the song chip.  This chip holds 200 songs.

The card edge connector is a 40 pin, 2 position, male variety.

The contacts are about 0.050″ (1.27mm) pitch.  Hard to measure!  The card is .031″ thick.

The actual chip inside is a NOR Flash variety.  Some information about NOR vs NAND memory chips:

The connector looks like a Harting 40 pin Motherboard to Daughterboard:

20150113_195301 (1)


This is a Spansion S29Gl064N90TF104 64 megabit NOR flash chip, storage space is 8 megabytes.  It is a 48-pin TSOP.  22 Address pins, 15 data pins. It can operate in 8 bit or 16 bit address/data communications.


This is a 40 pin edge card connector.  I’ve got a temptation to hook this up to my mbed enabled STMicro nucleo board and download the data to see whats in it!  The nucleo board is an ARM powered development board that costs $10 and has plenty of IO pins to connect to this chip.  I had thought seriously about trying to decode whats on this chip but in the end it will be fruitless.

Some work has been done by some smart fellas on NAND flash chip bit banging through the FTDI break out board.  I wonder how this could be adapted to the NOR chip?

Now for some screen shots.















Getting better prints – The ultimate first layer

There are a lot of variables involved in 3D printing.  Assuming you have the printer setup correctly and there are no loose parts to worry about, getting great prints depends on many different configuration parameters.

The most common workflow for 3D Printing involves these basic steps:

  • Design and export, or download, an .STL file
  • Load the .STL file in a slicing software (Cura, Repetier Host, Slic3r, Prontrface, etc)
  • Configure your desired quality settings (layer height, shells, infill, etc)
  • Print

However, let’s say for discussion, you’re not getting ideal results..

Getting an optimal first layer is important to your print because it is the foundation.  If it doesn’t stick properly to the bed, you’re print is going to come out awful.

The settings involved can be very confusing.  I’ll go over some very basic settings.

Layer height

This is the overall “print quality” and determines how smooth the walls of your print will appear.  The typical settings range from .1mm to .3mm and higher for really rough draft type stuff.


This determines the amount of “stuffing” your printed part will get.  A general rule is more than 33% is a waste.  Very strong parts can be made with 33% infill.  For basic things like Yoda heads or non-structural parts, you can get away with 15% or even less.

Shells or Perimeters


In the above image, I’ve drawn three red lines that line up with what are called the “shells” or perimeters of the print.  This setting in Cura/Repetier Host specifies this in mm value.  You divide this by the nozzle diameter (mine is .4mm) and you get the number of shells.  This basically is the “wall thickness” of your print.  You normally will not want this less than 3 times your nozzle diameter.


Top/Bottom Thickness

This is related to your layer height, and determines the number of top and bottom solid layers.  I have mine set to 3 (3x .4mm = 1.2mm)

For most printing, you’ll want solid top and bottoms.  For Vase printing, depending on your STL file, you might want to uncheck Solid Top to have a hollow top.  Also for Vase printing, you’ll want zero infill.  Then you just set your shells to your desired wall thickness.



3D Printing Fusible Alloys

I’ve been doing some research on fusible alloys. These are metals that have a very low melting point, around the temperature of boiling water (212 degrees F, maybe 95-100 degrees Celcius).

Care must be taken with many of these alloys because of most of them contain toxic ingredients such as Lead, Mercury and Cadmium.

The mixture I see working that is non-toxic is Bismuth and Tin.

So the steps roughly seem to include the following:

  1. Build an extruder
  2. Buy some Bismuth shot and Tin inguts
  3. Melt them together 62.5% Bismuth, 37.5% Tin
  4. Extrude to 3mm filament
  5. Print metal objects at about 95 degrees celcius

With a dual extruder setup, we could use High Impact Poly Styrene as a support material and dissolve it using Limonene.




Buy Bismuth from




Buy Tin from


Who’s with me!? In case anyone does this, you read it here first ! lol or maybe second…

3D Printing Bed Adhesion challenges

The difficulty with printing plastics using an FDM 3D printer is getting them to stick to the bed for the entire duration of the print.  There a lot of different common wisdoms that you will read about on the internet, and here is one more!

I’ve used ABS Juice for ABS, Blue tape for PLA, Glue stick, etc.  But Now I’ve found the ONE SIZE FITS ALL sticky stuff!  It’s Elmers Carpenter’s Wood Glue!

I diluted it in a mason jar, I didn’t really measure it, so you can just wing it.  Make it runny is all I can say.  Then apply it with a sponge brush.  Now all of my different filament materials including Nylon, PLA, ABS and HIPS stick to the bed!  They grip the glue very well, and I have no warping!  Check the pics!


In fact, it stuck so well, it pulled the lettering off the blue painter’s tape 🙂

The line you see in the plastic is where the two parts of painter’s tape joined together on the bed.


FreeExpression Firmware Roadmap

Now that I have the base code working, and all the moving parts moving, I am planning the full firmware roadmap.  The original expression machine is a very capable machine but it is designed to be used with the manufacturer’s cartridges.  My ambition with this project is of course to break that cord and use the machine with open source software (Inkscape) in a user friendly manner.  Previous attempts by other people to use these machines with third party software have either been incredibly tedious, or resulted in litigation (yuck).

My approach is quite different.  I have decided to completely write new software that is installed onto the machine itself, erasing the manufacturer’s software (to avoiding copyright infringement) and implement my own grand design for the machine.


Let’s talk about the user controls on the machine:


There are three dials marked Speed, Size, Pressure.  These are convenient because while the software (Inkscape) can manage these as well through the Export/Plot interface, it seems logical to support this functionality through the dials.


The size dial is an interesting one.  In the original machine’s design,  you load a shape from a cartridge and then you use the size dial to resize it.  In this new paradigm, where you are using Inkscape, you simply would set your design size in Inkscape.  So the Size dial is kind of useless unless I implement some other feature (see below) that could make use of it.


The pressure dial is very useful, as it allows us to set the pressure in one of four (five??) increments.  This would tell the firmware to adjust the voltage going to the solenoid that pushes the knife head down.  This in turn controls how hard the solenoid “presses” on the knife.


Adjusting the speed of a cut can help with thicker materials that require more delicate handling, or with thinner materials that can handle faster cutting.  It makes sense to allow the user to adjust the speed before the cut begins. I’m not sure if it should adjust the speed during the cut….


The keypad has numerous keys that perform a wide range of functions.  Many of these keys are used to select a shape from the cartridge library.  Without the need for cartridges, there is a lot of keypad real estate that is going to be unused.

The main keys, A-B, 0-9, and some basic shapes (from Wingdings library) will allow the user to cut using a standard font (Comic Sans).

Direction keys

These keys allow you to position the cutting head over a specific area of your material

Stop key

This key will stop the cutting process completely and basically aborts your project, returning the machine to its home position and ejecting the mat.  There is no way to stop the incoming stream, so the machine will just have to ignore the remaining data and allow the internal buffers to clear out until it receives the final “end of job” HPGL command.

Cut key

There really is no current plan for this key.  Cutting is started at the computer.

Option keys

These keys are just to the right of the display and control things like multi-cut, portrait, mix n match, quantity, auto fill, fit to page and fit to length.  I’m not sure what possible use these can have in the future, but I’ll try to implement some of the options if they make sense.


The display works fine in my current firmware, so I will continue to use it for user input/output.  On the original expression, when a user selects a shape, the machine shows a small image of what they selected.  This will not be possible since the main goal of this project is to allow you to cut whatever you want, the code could not possibly interpret your image completely and display it.  So, the display will just be for menu prompts and confirmations.

Onboard memory

Since the machine has 512k bytes of on board memory storage, I have considered the option to allow the user to save their favorite projects and shapes into the memory, and allow them to easily retrieve them through the keypad or use the speed wheel to browse through the their custom shape library.  If this is implemented, then several of the option keys have meaning again, as well as the size wheel.

SD Card add on


Another interesting possibility is the addition of an SD card port at the cartridge port.  The cartridge port is ideally designed to allow expansion, and in fact the Atmel AVR control pins that are connected to the cartridge port are the very same pins that standard SD card readers use.  The feature would work like this:

User inserts an SD card, and the machine reads the list of files, giving them a menu to browse through them using the speed wheel.  Once a file is selected, they can have the option of storing it, or cutting it.  If they store it, it will be placed into the machine’s on-board permanent memory.  This is useful for those stars, squares, hearts, snowflakes that we use every day 🙂


Reverse engineering a printed circuit board

Reverse engineering things is a fun hobby.  It enables someone like myself who is intensely curious about all things and how they function to understand the design of things.

I started dabbling with electronics when I was in high school.  At the same time, I was learning programming, so I had eventually to choose.  I went the software engineer tract, but never really gave up on my love for electronics.  Unfortunately, I lacked in the math department, so sometimes thing are very difficult for me when it comes to theory.  Nothing can put me to sleep faster than a good book on pulse width modulation theory and math!

Anyway, when it comes to “reverse engineering”, the phrase alone can have all kinds of negative connotations.  Most people will attribute “hacking” and “reverse engineering” as things that evil people do for evil reasons.  Sure, there is that…. But then there is the positive side of it.  By reverse engineering things, you can identify weaknesses, or potential enhancements.  You can even re-purpose hardware, make it better, make it your own.

How do you reverse engineer things?  There are tons of Youtube videos on the subject.  For electronics, a good starting point is a basic understanding of electronic components and their relationship to other components.  You don’t need to be an Electronics Engineer to understand these things.  But you do need to know what a transistor does, or a capacitor, resistor, and how to identify integrated circuits, understand datasheets, and a few more basics that I’m forgetting to mention 🙂

A printed circuit board is basically a bunch of interconnecting lines that move electricity from point A to point B.  Or more accurately, from Part A to Part B.  They may be single sided, double sided (top/bottom) or for very complex systems, multi-layered.  For example, an iPhone 5 board has 16 layers!!

Luckily, the Cricut Expression is only a two sided board.  A minimum toolset will include a digital auto-ranging multimeter.  I use an Extech EX430.

For tracing the connections on a PCB, you need to use what some units call Diode test mode or on my unit it is on the Ohms mode, set the range to “audible”.  Whenever I touch a connection that is a closed circuit (the trace is connected at both ends with nothing in the middle) it will ‘beep’.  Depending on what I’m tracing, I typically start at the connector away from the CPU (in this case an Atmel ATMEGA1281), or I can start at the CPU pins and work outward.

Simple method of tracing the paths on a double layer circuit board involves taking a high resolution picture from a mounted camera at a fixed focal length. This is to ensure that when taking a picture of the top and bottom of the board the dimensions are as close as possible.

Open the two images in Photoshop or Gimp. Set the top image as the top layer and the bottom as the bottom layer. Delete the background layer if any.

In Gimp, you can convert a color to a transparency. I then used an eye dropper tool to pick a portion of the green area that would erase the bulk of the solder mask. I do this only for top layer.

Then set the opacity of your top layer to 50%.

Now, go to Channels and turn off the green channel.

You can size and align the top layer to the bottom layer as needed.PCB1 PCB2

With XRay Vision 🙂


Better contrast:


Now, we can see the traces on both layers of the board.  Using this information with the multimeter techniques, we can identify our traces and build a “reverse schematic” of sorts.  There are probably much more advanced and difficult techniques for this, but this is what worked for me on this project.

Keypad Internals

Here is an image of all the LEDs lit up on the keypad.  Side note:  I once saw a similar machine on Ebay for $40 that had this same exact pattern displayed on it.  The description of the item said “For parts only, not working.”  I thought to myself, I know what happened to that machine!  This happens when the firmware is wiped out and the Atmel chip starts up in it’s blank state, the pins are set into output mode rather than input mode, causing the LEDs to light up.  If you ever see one for sale like this, and you’re not a hard core hacker, you should not buy it!


The keypad is comprised of a whole-lotta-buttons and a few LEDs.  The matrix of buttons are interfaced with the AVR processor by way of three shift registers.  A shift register is also known as a port expander because it allows us to digitally interface 8 switches.  When you matrix buttons in this typical fashion you are able to access a large quantity of buttons for the price of only a few AVR pins.


The shift registers in question are of the Parallel In, Serial Out variety.  This means that 8 buttons can be connected to the data lines of the shift register which represents 8 bits of incoming data.  The data will be sent to the AVR in a sequence of 8 bits in a serial stream of data.  Shift registers can be daisy chained further extending our reach, while still only costing us the same 3 pins.

In order to access this matrix of buttons where you have N rows and C columns, you need to add more shift registers and daisy change them together.  Here is an image I lifted from a Google search that explains how these buttons are connected to the shift registers.


Each group of 8 columns is controlled or accessed by a shift register.  The two types of shift registers used are Parallel In, Serial Out (74HC165N on the bottom in the image) and Serial In, Parallel Out (74HC595N on the top left).  The 595 controls the “row select” part of the scanning algorithm.  The 165 then receives the input state of it’s attached 8 buttons.

Rather than repeat the in depth analysis of multiplexed keypad scanning, I’ll give you a really good link.


In addition to buttons, the keypad has a bunch of light emitting diodes to represent the button’s state.  Not all button’s have LEDs under them.

Using my high tech x-ray vision system, I can see how the two layers are inter-connected.  In this picture, the two layers are not perfectly lined up, but it was sufficient for what I needed to know at the time.


As I went through the keys one by one to document the scan code, I noticed that there are a few overlapping keys.  Either this is some kind of strange anomaly, or that’s the way it is with the original.  Luckily it is not occurring to keys that are close together.

I don’t yet have an entire plan for the features I want in my custom firmware, therefore some of these keys will have no meaning.  I bought the universal overlay that has all the alpha and number keys, along with “Function” keys labelled.

Interfacing with the OLED Display

The FreeExpression contains a nice little OLED display which measures roughly 2.7 inches diagonally.  The display module has a very thin ribbon cable on which is stamped the module’s part number “UG-2864ASYDT01”.

A bit of Googling dug up the data sheet (interestingly stamped “Confidential” across every page).  This device uses a driver integrated circuit called an SSD-1325.

I’ll admit that writing code to make this display work is probably outside my skill set at this time.  Luckily, I found a library named u8glib which contains support for this driver, as well as numerous others.

Now, my task is to figure out the physical connections to the driver, and configure the software accordingly.


The laborious task of following each trace is very tricky with such small components.  I use a multimeter that has an audible beep when two connections are in a closed circuit configuration.  However, this does not work across components like resistors.  So one must follow the trace from end to end, continually testing each connection point.

The SSD-1325 driver IC uses two modes of operation, Parallel and Serial.  Luckily, the Cricut engineers decided to use the Serial configuration to save pin count.  The display’s pinout diagram was pulled from the data sheet:



Now that I identified each pin on the display, and it’s corresponding pin on the AVR, I could plug these values into the u8glib’s initialization routine and hopefully get it going…
The u8g init routine looks like so:

Software SPI:
uint8_t u8g_InitSPI(u8g_t *u8g, u8g_dev_t *dev, uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset);

The u8glib wiki has a cheat sheet of device types:

Since I am using “software spi” on an NHD27 compatible device, from this list, I can see that my desired device type is probably one of these two:


I can see I need sck, mosi, cs and a0 lines.

My Display to AVR connections are as follows:

D/C# -> PF7
D1/MOSI -> PF5
CS# -> PE7
D0/SCLK -> PF6

u8g_InitSPI(&u8g, &u8g_dev_ssd1325_nhd27oled_bw_sw_spi, PN(5, 6), PN(5, 5), PN(4, 7), PN(5,7), U8G_PIN_NONE);

To test this, I used the u8glib example code named “graphicstest.c”…. and…. it didn’t work… at all.

I communicated with the u8glib author via email several times, each time he assured me that it worked with the SSD1325. I was at my wits end. I even thought that I had some how broken the display or disabled it. So I then decided to wire up an LCD module and test it. It didn’t work either. Now I was really flabbergasted. I had all but given up on the display, but then I remembered that the display pins are the same pins as the JTAG interface. I had already considered this, and switched to the ISP interface for programming the device. However, I did not reset the AVR Fuse for JTAGEN. This must be disabled in order for the display pins to work in the normal mode. ARG… So then I disabled the fuse, reconnected the OLED display, and reloaded the test code. Voila! It works! (Video coming soon…)

So now I switch back to my main project to re-integrate the display initialization routines into my project and write some code to print to the display. On my long list of to-do items is to create a menu of sorts and wire up the button’s to display the proper screen or information according to function.

SSD1325 datasheet

An inside look at the Cricut Expression


Disclaimer:  The purpose of this series of posts is to examine a well-built piece of hardware and undertake a study of how to develop firmware for the onboard Atmel AVR microcontroller it incorporates to interface with and control motors, lights, buttons, dials, switches, etc.

You could certainly find “AVR development boards” where you have a scratchpad sort of area to design your own circuits, however, unless you’re an electronics designer, engineer, or really advanced hobbiest, you will likely introduce design flaws that would interfere with your software.  My focus for this project is purely on designing the software, not the hardware.  Therefore it made sense to me to start with something that has been professionally engineered and debugged.

The Cricut Expression is trademarked by Provo Craft, Inc.  It is a very nice little machine that cuts designs out of all sorts of materials, and thousands of happy crafters use it to make all sorts of interesting things.  When I received my machine (a gift from my sister), it was not working and I was very curious about how this thing works, and how to repair it.  It turned into a project…of interesting proportions!

This is an educational project used solely by me to learn Atmel AVR development and hardware interfacing techniques.  I am a software engineer by trade, and an electronics enthusiast at heart.

Ok, so with that out of the way, one more thing to add… This information is for my own use, and may not be of use to anyone for any particular purpose.  Indeed, if you follow these posts and decide to apply anything you learn to your own machine, you accept full responsibility and accept all warnings and disclaimers posted.  The bottom line is, it’s my machine, and I can break it if I want to.



Once the machine is opened from the bottom, the motherboard can be accessed for inspection.  The following image displays the major functional elements.

motherboard layout

(You can click the images to view the full size version)

I diagrammed this during my exploration and annotated which subsystem I had working.  The green highlighting was used to keep track of what I had working at each stage of the process.  I would use yellow for partially functional and red for non-functional.


Future articles will describe each of these in depth, so I will summarize the functional areas below:


The keypad connector interfaces with the large matrix keypad and LEDs on the top panel.


The display is an OLED display using the Univision Technology UG-2864ASYDT01 module based on the SSD1325 driver IC.  The u8lib AVR library is used to interface with the display.


This interface allows you to program the AVR as well as use the Atmel Studio debugging interface to step through the running code on the chip. This is immensely useful when things don’t seem to be working right.  However, when the JTAGEN fuse is enabled the OLED display will be disabled since it uses the same pins.


The FTDI chip is used to convert the serial interface on the AVR to the USB interface for the computer.  It is connected to the USB port on the far right.


The typical 6 pin ISP programming header is exposed in this 10 pin cable.  Interestingly, this cable is actually connected to the cartridge port on the front of the machine.  Eventually I will build a small cartridge board to connect my AVR Dragon programmer to the port instead of hanging a cable out the front of the machine.

Motor Control

This machine (actually,all of these cutters) uses two stepper motors for the two axis (x/y).  This motherboard uses eight MOSFETs for the high-power side, and eight smaller transistors for low power.  This allows us a great deal of capabilities for accurate micro-stepping movement.  Each of the transistors are connected to the output connector.  The stepper motors are 6-wire unipolar models.  Each of the 4 coils (per motor) are connected to the white connectors at the bottom edge of the motherboard.


Driver for 3 analog dials, connected as follows:

dial  | AVR pin
size  | PF0 (ADC0)
speed | PF1 (ADC1)
press | PF2 (ADC2)

Each input is a simple voltage divider between 0 and 5V, with  a few discrete settings where the pot clicks.


The USB connection is set in my software to 9600 baud, XON/XOFF flow control.  This has proven to be the most reliable, and certain software like Sure Cuts A Lot required 9600 baud when using the US Cutter “SC” plugin.

Pen Control

These transistors manage the pen holder’s up/down movement and the “pressure” which equates to a Pulse Width Modulation signal driving the voltage up or down.  The mechanism that moves the pen up or down is essentially an electromagnet or solenoid.

Home Switch

The home switch signals the Atmel AVR micro-controller that the cutting head has reached its right-most position.  This internally translates to a 0 on the X axis.

Flash Memory

The flash memory on the machine is an Atmel AT45DB041D 4 megabit serial flash memory device.  For native mode operation, this flash memory contains the George and Basic Shapes cartridge data.  For my purposes, I have erased the flash memory and may use it to store projects that I print, so that I can easily reprint them in the future without having to load Inkscape or use the computer.  One idea I have for this is to create a menu option to store rather than cut the incoming data.  The user would enter a name for the project and the machine would store the incoming HPGL data in flash memory.

With the addition of an SD card connected to the front cartridge port, this might be very useful in the future 🙂