local function dec2bit(dec)
local str = ''
local tmp = dec
while (tmp > 0) do
if (tmp % 2 == 1) then
str = str .. '1'
else
str = str .. '0'
end
tmp = math.modf(tmp / 2)
end
str = string.reverse(str)
return str
end
local function bit2dec(xorbit)
return tonumber(xorbit, 2)
end
local function bit2xor(str, cnt)
cnt = cnt or 0
if cnt > 0 then
str = string.format('%0' .. cnt .. 's', str)
end
local len = #str
local rtmp = ''
for i = 1, len do
local st = tonumber(string.sub(str, i, i))
if (st == 1) then
rtmp = rtmp .. '0'
elseif (st == 0) then
rtmp = rtmp .. '1'
end
end
return rtmp, #rtmp
end
function math.numEnc(enum, off_num)
local bit = dec2bit(enum)
local xor_bit, xor_len = bit2xor(bit, nil)
local enc_num = bit2dec(xor_bit)
off_num = off_num or 0
enc_num = enc_num + off_num
return enc_num, xor_len
end
function math.numDec(dnum, xor_len, off_num)
off_num = off_num or 0
dnum = dnum - off_num
local bit = dec2bit(dnum)
local xor_bit, _ = bit2xor(bit, xor_len or 0)
local dec_num = bit2dec(xor_bit)
return dec_num
end
base64 = {}
local extract = _G.bit32 and _G.bit32.extract
if not extract then
if _G.bit then
local shl, shr, band = _G.bit.lshift, _G.bit.rshift, _G.bit.band
extract = function( v, from, width )
return band( shr( v, from ), shl( 1, width ) - 1 )
end
elseif _G._VERSION == "Lua 5.1" then
extract = function( v, from, width )
local w = 0
local flag = 2^from
for i = 0, width-1 do
local flag2 = flag + flag
if v % flag2 >= flag then
w = w + 2^i
end
flag = flag2
end
return w
end
else
extract = load[[return function( v, from, width )
return ( v >> from ) & ((1 << width) - 1)
end]]()
end
end
function base64.makeencoder( s62, s63, spad )
local encoder = {}
for b64code, char in pairs{[0]='E','G','C','D','A','F','B','H','I','J',
'K','L','N','M','O','P','Q','R','S','T','U','V','W','X','Y',
'Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n',
'o','p','q','r','s','t','u','v','w','x','y','z','0','1','2',
'3','4','5','6','7','8','9',s62 or '+',s63 or'/',spad or'='} do
encoder[b64code] = char:byte()
end
return encoder
end
function base64.makedecoder( s62, s63, spad )
local decoder = {}
for b64code, charcode in pairs( base64.makeencoder( s62, s63, spad )) do
decoder[charcode] = b64code
end
return decoder
end
local DEFAULT_ENCODER = base64.makeencoder()
local DEFAULT_DECODER = base64.makedecoder()
local char, concat = string.char, table.concat
function base64.enc( str, encoder, usecaching )
encoder = encoder or DEFAULT_ENCODER
local t, k, n = {}, 1, #str
local lastn = n % 3
local cache = {}
for i = 1, n-lastn, 3 do
local a, b, c = str:byte( i, i+2 )
local v = a*0x10000 + b*0x100 + c
local s
if usecaching then
s = cache[v]
if not s then
s = char(encoder[extract(v,18,6)], encoder[extract(v,12,6)], encoder[extract(v,6,6)], encoder[extract(v,0,6)])
cache[v] = s
end
else
s = char(encoder[extract(v,18,6)], encoder[extract(v,12,6)], encoder[extract(v,6,6)], encoder[extract(v,0,6)])
end
t[k] = s
k = k + 1
end
if lastn == 2 then
local a, b = str:byte( n-1, n )
local v = a*0x10000 + b*0x100
t[k] = char(encoder[extract(v,18,6)], encoder[extract(v,12,6)], encoder[extract(v,6,6)], encoder[64])
elseif lastn == 1 then
local v = str:byte( n )*0x10000
t[k] = char(encoder[extract(v,18,6)], encoder[extract(v,12,6)], encoder[64], encoder[64])
end
return concat( t )
end
function base64.dec( b64, decoder, usecaching )
decoder = decoder or DEFAULT_DECODER
local pattern = '[^%w%+%/%=]'
if decoder then
local s62, s63
for charcode, b64code in pairs( decoder ) do
if b64code == 62 then s62 = charcode
elseif b64code == 63 then s63 = charcode
end
end
pattern = ('[^%%w%%%s%%%s%%=]'):format( char(s62), char(s63) )
end
b64 = b64:gsub( pattern, '' )
local cache = usecaching and {}
local t, k = {}, 1
local n = #b64
local padding = b64:sub(-2) == '==' and 2 or b64:sub(-1) == '=' and 1 or 0
for i = 1, padding > 0 and n-4 or n, 4 do
local a, b, c, d = b64:byte( i, i+3 )
local s
if usecaching then
local v0 = a*0x1000000 + b*0x10000 + c*0x100 + d
s = cache[v0]
if not s then
local v = decoder[a]*0x40000 + decoder[b]*0x1000 + decoder[c]*0x40 + decoder[d]
s = char( extract(v,16,8), extract(v,8,8), extract(v,0,8))
cache[v0] = s
end
else
local v = decoder[a]*0x40000 + decoder[b]*0x1000 + decoder[c]*0x40 + decoder[d]
s = char( extract(v,16,8), extract(v,8,8), extract(v,0,8))
end
t[k] = s
k = k + 1
end
if padding == 1 then
local a, b, c = b64:byte( n-3, n-1 )
local v = decoder[a]*0x40000 + decoder[b]*0x1000 + decoder[c]*0x40
t[k] = char( extract(v,16,8), extract(v,8,8))
elseif padding == 2 then
local a, b = b64:byte( n-3, n-2 )
local v = decoder[a]*0x40000 + decoder[b]*0x1000
t[k] = char( extract(v,16,8))
end
return concat( t )
end
local ac = {}
function ac.split(str, p)
local rt = {}
str:gsub('[^' .. p .. ']+', function(w)
table.insert(rt, w)
end)
return rt
end
local lines = {
2,
13,
26,
29,
}
local data_strs = {
'90TRMlzZwI1SMFTUMFzQORXWxUFV0R0TwEDRThAcGRFRxUFT3GTaWRVTx8UNVRFUJR2aTJUTVRFdFRFTX1UNVdTRUG1QMx2UG1UVURXRUx0VMFTV3AFVOlzaxIVWBFTUMFzQORXWxUFV0pWT5sWNSFBZxAVTxNkT0lVNVRFdq5UOrFjUGxWNR1UND5AdZFTVURHROlzaxIVTwFTUMFzQORXWxUFV0R1T58BNVJlUwAVTxNkT0lVNVRFdq1Uewo2VGZkRSRUNVx0dwkmVU1UNPMjTUGVQ4VVVG1UVURXRUx0VMFTV',
'=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3tWakdXRA50dFRkT3VAROdXRA50dFRkT3VAROdXRA50dFRFUyAUQWdkUVx0dwkmVU1UNPdXRApkMFpmZ2VAROdXRA50dFRUTwcAROdXRA50dFRkT3VAROdXRA50dFRkT3VkeSdzRqJWOHp2U1dARKRXRUZ2dFpHU3VUQO9SR6G1d4QkTFdkaQdHNU10RSZVUGFzQORXWxUFV0pHU3hDRO9SRUVVcFpBZ5ckaZZ2R6dFOFRFV4UkejdXRqGleHRFTxVkaOhzR6JVZHpnTNdkeSh2RUJWSHpXVVdkaLh2R6VWYHRkT3VAROdXRA50dFRkT5AFVRVlRGJFdFRFTX1UNVdTRA50dFRkT3VAROdXRA50dFRkTHZ0QOhTQD50dFRkT3VAROVnTC50dFRkT3VAROdXRA50dFRkT3VAROdXRA5UU1NkTlR3QOdXRA5AUSMkTxVUQOGDaTGleGFkVHJVVNdHNpZFVMFzT3MXeLd3ctM2dOpWZ3GjaldHMUt0dnRkW3lVQLd3czI2d0k3Y3VAROdXRA50dFRkT3VAROdXRA50dFRkT3VAROdXRA50dFRkT3VAROdXRA50dFRkT3GjaOdkUWFVQxNkT0lVNVRFdA50dFRkTKlDbmdXRqZ2K14mZrUjbmtSMuZ2K1gkTrUjbmtSMuZ2K14mZrUjbmtSMuZ2K14mZrUDSOdXRA50dFRkT3VAROdXRA50dFRkT3VAVmdHNB5UOGRVUVZUQSRXRUx0VMFTV',
}
local function segment_flip_str(str)
local len = math.ceil(#str / 10)
local data_str = {}
for i = len, 1, -1 do
local s = 10 * (i - 1) + 1
local e = 10 * i
local cstr = str:sub(s, e)
data_str[#data_str + 1] = string.reverse(cstr)
end
return table.concat(data_str, '')
end
print('[DzAPI]')
for index, data_str in ipairs(data_strs) do
local encode2 = segment_flip_str(data_str)
local decode2 = base64.dec(base64.dec(encode2))
local save_datas = ac.split(decode2, ';')
table.sort(save_datas, function(a, b)
return a < b
end)
for _, save_data in ipairs(save_datas) do
print(save_data)
end
end
print(' ')
print(' ')