decoding algorithm