# your code goes here 35aca863-a674-3803-9b98-228864642098",18446744005159871776,"T"],["ac8f29f5-8e3e-3234-a3b8-5da7103a1b1a",18446744005122523136,"T"],["00000000-0000-0000-0000-000000000000",0,"A"],["1c67ea89-6c80-3ae8-acb4-088957678249",18446744005143965264,"T"],["d0250b1d-d8e3-335a-91a8-4dd41147130e",18446744005157420496,"T"],["cbc282e1-6b20-34ca-8fc7-87df41e16eef",18446744005157389616,"T"],["39c1b102-8748-3532-bb9f-32e2c62f3706",18446744005132814208,"T"],["69e78b4a-6673-3c59-9dd5-79a01fa700a3",18446744005132141616,"T"],["63bcce99-2955-3db0-aa71-bb33651ce3c0",18446744005141581616,"T"],["76a66de4-fa2f-347a-a8ba-234e0ea69604",18446744005140288880,"T"],["c7b128d5-8786-3a97-9942-b9e1e5327c10",18446744005157913968,"T"],["bea9964d-c325-3dc1-86f7-1465d9761d37",18446744005142294784,"T"],["35385611-fb21-34e2-bbf2-315d03493c43",18446744005150341376,"T"],["1ca1baff-3a37-3759-adad-e8d644586eda",18446744005137526400,"T"],["89c9606d-50e3-375d-a636-7de8892a3a1a",18446744005138183120,"T"],["c30ff694-2842-387b-90f8-765a8adf986d",18446744005143060608,"T"],["a42145b5-f303-399b-9124-fbd5d9ac2229",6442450944,"S"],["4cb7ccbe-3939-377c-9c36-08ec8d582151",4305190912,"P"],["26644f7f-d042-38c5-929d-0232c1a43eab",4306780160,"P"],["6d24c5c4-666a-3d85-9c2c-c74150028372",4324982784,"P"],["2285e029-5ba5-3b6d-8064-19e974b69c71",4367040512,"P"],["779af808-e7fa-38c0-848f-aea7b8f57925",4332519424,"P"],["df6a0bb6-7f7e-3d63-bb1b-c9cd80f0a24d",4334223360,"P"],["c1b8a64d-8d53-36cf-a1c0-f87351a5be7f",4334911488,"P"],["e746b5f5-f78d-3a25-bf51-5adcaab82382",4344774656,"P"],["1abad528-6868-368f-94d3-e6523b8fb77c",4364173312,"P"],
""" base58 encoding / decoding functions """
import unittest
alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
base_count = len ( alphabet)
def encode( num) :
""" Returns num in a base58-encoded string """
encode = ''
if ( num < 0 ) :
return ''
while ( num >= base_count) :
mod = num % base_count
encode = alphabet[ mod] + encode
num = num / base_count
if ( num) :
encode = alphabet[ num] + encode
return encode
def decode( s) :
""" Decodes the base58-encoded string s into an integer """
decoded = 0
multi = 1
s = s[ ::-1 ]
for char in s:
decoded += multi * alphabet.index ( char)
multi = multi * base_count
return decoded
class Base58Tests( unittest .TestCase ) :
def test_alphabet_length( self ) :
self .assertEqual ( 58 , len ( alphabet) )
def test_encode_10002343_returns_Tgmc( self ) :
result = encode( 10002343 )
self .assertEqual ( 'Tgmc' , result)
def test_decode_Tgmc_returns_10002343( self ) :
decoded = decode( 'Tgmc' )
self .assertEqual ( 10002343 , decoded)
def test_encode_1000_returns_if( self ) :
result = encode( 1000 )
self .assertEqual ( 'if' , result)
def test_decode_if_returns_1000( self ) :
decoded = decode( 'if' )
self .assertEqual ( 1000 , decoded)
def test_encode_zero_returns_empty_string( self ) :
self .assertEqual ( '' , encode( 0 ) )
def test_encode_negative_number_returns_empty_string( self ) :
self .assertEqual ( '' , encode( -100 ) )
if __name__ == '__main__' :
#print encode(int("00B94BA6C51B3D8372D82FDE5DC78773D960B5A82FCDAC8181",16))
print hex ( decode( "Wh4bh" ) )
IyB5b3VyIGNvZGUgZ29lcyBoZXJlIDM1YWNhODYzLWE2NzQtMzgwMy05Yjk4LTIyODg2NDY0MjA5OCIsMTg0NDY3NDQwMDUxNTk4NzE3NzYsIlQiXSxbImFjOGYyOWY1LThlM2UtMzIzNC1hM2I4LTVkYTcxMDNhMWIxYSIsMTg0NDY3NDQwMDUxMjI1MjMxMzYsIlQiXSxbIjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCIsMCwiQSJdLFsiMWM2N2VhODktNmM4MC0zYWU4LWFjYjQtMDg4OTU3Njc4MjQ5IiwxODQ0Njc0NDAwNTE0Mzk2NTI2NCwiVCJdLFsiZDAyNTBiMWQtZDhlMy0zMzVhLTkxYTgtNGRkNDExNDcxMzBlIiwxODQ0Njc0NDAwNTE1NzQyMDQ5NiwiVCJdLFsiY2JjMjgyZTEtNmIyMC0zNGNhLThmYzctODdkZjQxZTE2ZWVmIiwxODQ0Njc0NDAwNTE1NzM4OTYxNiwiVCJdLFsiMzljMWIxMDItODc0OC0zNTMyLWJiOWYtMzJlMmM2MmYzNzA2IiwxODQ0Njc0NDAwNTEzMjgxNDIwOCwiVCJdLFsiNjllNzhiNGEtNjY3My0zYzU5LTlkZDUtNzlhMDFmYTcwMGEzIiwxODQ0Njc0NDAwNTEzMjE0MTYxNiwiVCJdLFsiNjNiY2NlOTktMjk1NS0zZGIwLWFhNzEtYmIzMzY1MWNlM2MwIiwxODQ0Njc0NDAwNTE0MTU4MTYxNiwiVCJdLFsiNzZhNjZkZTQtZmEyZi0zNDdhLWE4YmEtMjM0ZTBlYTY5NjA0IiwxODQ0Njc0NDAwNTE0MDI4ODg4MCwiVCJdLFsiYzdiMTI4ZDUtODc4Ni0zYTk3LTk5NDItYjllMWU1MzI3YzEwIiwxODQ0Njc0NDAwNTE1NzkxMzk2OCwiVCJdLFsiYmVhOTk2NGQtYzMyNS0zZGMxLTg2ZjctMTQ2NWQ5NzYxZDM3IiwxODQ0Njc0NDAwNTE0MjI5NDc4NCwiVCJdLFsiMzUzODU2MTEtZmIyMS0zNGUyLWJiZjItMzE1ZDAzNDkzYzQzIiwxODQ0Njc0NDAwNTE1MDM0MTM3NiwiVCJdLFsiMWNhMWJhZmYtM2EzNy0zNzU5LWFkYWQtZThkNjQ0NTg2ZWRhIiwxODQ0Njc0NDAwNTEzNzUyNjQwMCwiVCJdLFsiODljOTYwNmQtNTBlMy0zNzVkLWE2MzYtN2RlODg5MmEzYTFhIiwxODQ0Njc0NDAwNTEzODE4MzEyMCwiVCJdLFsiYzMwZmY2OTQtMjg0Mi0zODdiLTkwZjgtNzY1YThhZGY5ODZkIiwxODQ0Njc0NDAwNTE0MzA2MDYwOCwiVCJdLFsiYTQyMTQ1YjUtZjMwMy0zOTliLTkxMjQtZmJkNWQ5YWMyMjI5Iiw2NDQyNDUwOTQ0LCJTIl0sWyI0Y2I3Y2NiZS0zOTM5LTM3N2MtOWMzNi0wOGVjOGQ1ODIxNTEiLDQzMDUxOTA5MTIsIlAiXSxbIjI2NjQ0ZjdmLWQwNDItMzhjNS05MjlkLTAyMzJjMWE0M2VhYiIsNDMwNjc4MDE2MCwiUCJdLFsiNmQyNGM1YzQtNjY2YS0zZDg1LTljMmMtYzc0MTUwMDI4MzcyIiw0MzI0OTgyNzg0LCJQIl0sWyIyMjg1ZTAyOS01YmE1LTNiNmQtODA2NC0xOWU5NzRiNjljNzEiLDQzNjcwNDA1MTIsIlAiXSxbIjc3OWFmODA4LWU3ZmEtMzhjMC04NDhmLWFlYTdiOGY1NzkyNSIsNDMzMjUxOTQyNCwiUCJdLFsiZGY2YTBiYjYtN2Y3ZS0zZDYzLWJiMWItYzljZDgwZjBhMjRkIiw0MzM0MjIzMzYwLCJQIl0sWyJjMWI4YTY0ZC04ZDUzLTM2Y2YtYTFjMC1mODczNTFhNWJlN2YiLDQzMzQ5MTE0ODgsIlAiXSxbImU3NDZiNWY1LWY3OGQtM2EyNS1iZjUxLTVhZGNhYWI4MjM4MiIsNDM0NDc3NDY1NiwiUCJdLFsiMWFiYWQ1MjgtNjg2OC0zNjhmLTk0ZDMtZTY1MjNiOGZiNzdjIiw0MzY0MTczMzEyLCJQIl0sCiIiIiBiYXNlNTggZW5jb2RpbmcgLyBkZWNvZGluZyBmdW5jdGlvbnMgIiIiCmltcG9ydCB1bml0dGVzdAogCmFscGhhYmV0ID0gJzEyMzQ1Njc4OUFCQ0RFRkdISktMTU5QUVJTVFVWV1hZWmFiY2RlZmdoaWprbW5vcHFyc3R1dnd4eXonCmJhc2VfY291bnQgPSBsZW4oYWxwaGFiZXQpCgkJCmRlZiBlbmNvZGUobnVtKToKCSIiIiBSZXR1cm5zIG51bSBpbiBhIGJhc2U1OC1lbmNvZGVkIHN0cmluZyAiIiIKCWVuY29kZSA9ICcnCgkKCWlmIChudW0gPCAwKToKCQlyZXR1cm4gJycKCQoJd2hpbGUgKG51bSA+PSBiYXNlX2NvdW50KToJCgkJbW9kID0gbnVtICUgYmFzZV9jb3VudAoJCWVuY29kZSA9IGFscGhhYmV0W21vZF0gKyBlbmNvZGUKCQludW0gPSBudW0gLyBiYXNlX2NvdW50CiAKCWlmIChudW0pOgoJCWVuY29kZSA9IGFscGhhYmV0W251bV0gKyBlbmNvZGUKIAoJcmV0dXJuIGVuY29kZQogCmRlZiBkZWNvZGUocyk6CgkiIiIgRGVjb2RlcyB0aGUgYmFzZTU4LWVuY29kZWQgc3RyaW5nIHMgaW50byBhbiBpbnRlZ2VyICIiIgoJZGVjb2RlZCA9IDAKCW11bHRpID0gMQoJcyA9IHNbOjotMV0KCWZvciBjaGFyIGluIHM6CgkJZGVjb2RlZCArPSBtdWx0aSAqIGFscGhhYmV0LmluZGV4KGNoYXIpCgkJbXVsdGkgPSBtdWx0aSAqIGJhc2VfY291bnQKCQkKCXJldHVybiBkZWNvZGVkCiAKY2xhc3MgQmFzZTU4VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCiAgZGVmIHRlc3RfYWxwaGFiZXRfbGVuZ3RoKHNlbGYpOgogICAgc2VsZi5hc3NlcnRFcXVhbCg1OCwgbGVuKGFscGhhYmV0KSkKIAogIGRlZiB0ZXN0X2VuY29kZV8xMDAwMjM0M19yZXR1cm5zX1RnbWMoc2VsZik6CiAgICByZXN1bHQgPSBlbmNvZGUoMTAwMDIzNDMpCiAgICBzZWxmLmFzc2VydEVxdWFsKCdUZ21jJywgcmVzdWx0KQogCiAgZGVmIHRlc3RfZGVjb2RlX1RnbWNfcmV0dXJuc18xMDAwMjM0MyhzZWxmKToKICAgIGRlY29kZWQgPSBkZWNvZGUoJ1RnbWMnKQogICAgc2VsZi5hc3NlcnRFcXVhbCgxMDAwMjM0MywgZGVjb2RlZCkKIAogIGRlZiB0ZXN0X2VuY29kZV8xMDAwX3JldHVybnNfaWYoc2VsZik6CiAgICByZXN1bHQgPSBlbmNvZGUoMTAwMCkKICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2lmJywgcmVzdWx0KQogCiAgZGVmIHRlc3RfZGVjb2RlX2lmX3JldHVybnNfMTAwMChzZWxmKToKICAgIGRlY29kZWQgPSBkZWNvZGUoJ2lmJykKICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTAwMCwgZGVjb2RlZCkKIAogIGRlZiB0ZXN0X2VuY29kZV96ZXJvX3JldHVybnNfZW1wdHlfc3RyaW5nKHNlbGYpOgogICAgc2VsZi5hc3NlcnRFcXVhbCgnJywgZW5jb2RlKDApKQogCiAgZGVmIHRlc3RfZW5jb2RlX25lZ2F0aXZlX251bWJlcl9yZXR1cm5zX2VtcHR5X3N0cmluZyhzZWxmKToKICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycsIGVuY29kZSgtMTAwKSkKIAppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICNwcmludCBlbmNvZGUoaW50KCIwMEI5NEJBNkM1MUIzRDgzNzJEODJGREU1REM3ODc3M0Q5NjBCNUE4MkZDREFDODE4MSIsMTYpKQogIHByaW50IGhleChkZWNvZGUoIldoNGJoIikp