2021-04-09 19:34:05 +08:00
const zhiyouRegex = /^https?:\/\/zhiyou\.smzdm\.com\/user$/ ;
const smzdmCookieKey = 'smzdm_cookie' ;
const smzdmSessionKey = 'smzdm_session' ;
const scriptName = '什么值得买' ;
let magicJS = MagicJS ( scriptName , "INFO" ) ;
2021-09-28 10:46:31 +08:00
magicJS . barkUrl = magicJS . read ( 'smzdm_unified_push_url' ) || magicJS . read ( 'magicjs_unified_push_url' ) ;
2021-04-09 19:34:05 +08:00
function randomStr ( ) {
let len = 17 ;
let char = '0123456789' ;
let str = ''
for ( i = 0 ; i < len ; i ++ ) {
str += char . charAt ( Math . floor ( Math . random ( ) * char . length ) ) ;
}
return str ;
}
// Web端登录获取Cookie
function GetWebCookie ( ) {
let match _str = magicJS . request . headers . Cookie . match ( /sess=[^\s]*;/ ) ;
session _id = match _str != null ? match _str [ 0 ] : null ;
// 获取新的session_id
if ( session _id ) {
// 获取持久化的session_id
old _session _id = magicJS . read ( smzdmSessionKey ) != null ? magicJS . read ( smzdmSessionKey ) : '' ;
// 获取新的session_id
console . log ( { 'old_session_id' : old _session _id , 'new_session_id' : session _id } ) ;
// 比较差异
if ( old _session _id == session _id ) {
magicJS . logInfo ( '网页版cookie没有变化, 无需更新。' ) ;
}
else {
// 持久化cookie
magicJS . write ( smzdmSessionKey , session _id ) ;
magicJS . write ( smzdmCookieKey , magicJS . request . headers . Cookie ) ;
magicJS . logInfo ( '写入cookie ' + magicJS . request . headers . Cookie ) ;
magicJS . notify ( scriptName , '' , '🎈获取cookie成功! ! ' ) ;
}
}
else {
magicJS . logError ( '没有读取到有效的Cookie信息。' ) ;
}
}
// Web端签到
function WebSignin ( cookie ) {
return new Promise ( ( resolve , reject ) => {
let ts = Date . parse ( new Date ( ) ) ;
let options = {
url : ` https://zhiyou.smzdm.com/user/checkin/jsonp_checkin?callback=jQuery11240 ${ randomStr ( ) } _ ${ ts } &_= ${ ts + 3 } ` ,
headers : {
'Accept' : '*/*' ,
'Accept-Language' : 'zh-cn' ,
'Connection' : 'keep-alive' ,
'Host' : 'zhiyou.smzdm.com' ,
'Referer' : 'https://www.smzdm.com/' ,
'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Safari/605.1.15' ,
'Cookie' : cookie
}
} ;
magicJS . get ( options , ( err , resp , data ) => {
if ( err ) {
magicJS . logWarning ( 'Web端签到出现异常:' + err ) ;
reject ( 'Web:签到异常' ) ;
}
else {
try {
let checkin _data = /\((.*)\)/ . exec ( data ) ;
if ( checkin _data ) {
let checkin _obj = JSON . parse ( checkin _data [ 1 ] ) ;
if ( ! ! checkin _obj && checkin _obj . hasOwnProperty ( 'error_code' ) ) {
if ( checkin _obj . error _code == - 1 ) {
magicJS . logWarning ( ` Web端签到出现异常, 网络繁忙, 接口返回: ${ data } ` ) ;
reject ( 'Web:网络繁忙' ) ;
}
else if ( checkin _obj [ 'error_code' ] == 99 ) {
magicJS . logWarning ( 'Web端Cookie已过期' ) ;
resolve ( [ false , 'Web:Cookie过期' ] ) ;
}
else if ( checkin _obj [ 'error_code' ] == 0 ) {
magicJS . logInfo ( 'Web:签到成功' ) ;
resolve ( [ true , 'Web:签到成功' ] ) ;
}
else {
magicJS . logWarning ( ` Web端签到出现异常, 接口返回数据不合法: ${ data } ` ) ;
reject ( 'Web:返回错误' ) ;
}
}
}
else {
magicJS . logWarning ( ` Web端签到出现异常, 接口返回数据不存在: ${ data } ` ) ;
reject ( 'Web:签到异常' ) ;
}
}
catch ( err ) {
magicJS . logWarning ( ` Web端签到出现异常, 代码执行异常: ${ err } ,接口返回: ${ data } ` ) ;
reject ( 'Web:执行异常' ) ;
}
}
} )
} )
}
function AppSignin ( cookie ) {
function GetAppSigninBody ( ) {
let ts = new Date ( ) . getTime ( ) ;
let token = /sess=([^;]*)/ . exec ( cookie ) [ 1 ] ;
let sign = hex _md5 ( ` f=android&sk=1&time= ${ ts } &token= ${ token } &v=10.0&weixin=0&key=apr1 $ AwP!wRRT $ gJ/q.X24poeBInlUJC ` ) . toUpperCase ( ) ;
return ` touchstone_event=&v=10.0&sign= ${ sign } &weixin=0&time= ${ ts } &sk=1&token= ${ token } &f=android&captcha= `
}
let options = {
url : "https://user-api.smzdm.com/checkin" ,
headers : {
"Accept" : "*/*" ,
"Accept-Encoding" : "gzip, deflate, br" ,
"Accept-Language" : "zh-Hans-CN;q=1, en-CN;q=0.9" ,
"Connection" : "keep-alive" ,
"Content-Type" : "application/x-www-form-urlencoded" ,
"Cookie" : cookie ,
"Host" : "user-api.smzdm.com"
} ,
body : GetAppSigninBody ( )
} ;
return new Promise ( ( resolve , reject ) => {
magicJS . post ( options , ( err , resp , data ) => {
if ( err ) {
magicJS . logError ( ` APP签到失败, 请求异常: ${ err } ` ) ;
reject ( '❌APP签到失败, 请求异常, 请查阅日志! ' ) ;
}
else {
try {
magicJS . logDebug ( ` App签到接口返回: ${ data } ` ) ;
let obj = typeof data === 'string' ? JSON . parse ( data ) : data ;
if ( obj . error _code === '0' && obj . error _msg === '已签到' ) {
resolve ( 'APP:重复签到' ) ;
}
if ( obj . error _code === '0' && obj . error _msg . indexOf ( '签到成功' ) >= 0 ) {
resolve ( 'APP:签到成功' ) ;
}
else {
reject ( 'APP:签到异常' ) ;
}
}
catch ( err ) {
magicJS . logError ( ` App签到失败, 执行异常: ${ err } ,接口响应: ${ data } ` ) ;
reject ( '❌App签到失败, 执行异常, 请查阅日志! ' ) ;
}
}
} )
} ) ;
}
// 获取用户信息,新版
function WebGetCurrentInfoNewVersion ( smzdmCookie ) {
return new Promise ( resolve => {
let options = {
url : 'https://zhiyou.smzdm.com/user/exp/' ,
headers : {
'Cookie' : smzdmCookie
} ,
body : ''
} ;
magicJS . get ( options , ( err , resp , data ) => {
if ( err ) {
magicJS . logError ( ` 获取用户信息失败,异常信息: ${ err } ` ) ;
resolve ( [ null , null , null , null , null , null , null ] ) ;
}
else {
try {
// 获取用户名
let userName = data . match ( /info-stuff-nickname.*zhiyou\.smzdm\.com\/user[^<]*>([^<]*)</ ) [ 1 ] . trim ( ) ;
// 获取近期经验值变动情况
let pointTimeList = data . match ( /<div class="scoreLeft">(.*)<\/div>/ig ) ;
let pointDetailList = data . match ( /<div class=['"]scoreRight ellipsis['"]>(.*)<\/div>/ig ) ;
let minLength = pointTimeList . length > pointDetailList . length ? pointDetailList . length : pointTimeList . length ;
let userPointList = [ ] ;
for ( let i = 0 ; i < minLength ; i ++ ) {
userPointList . push ( {
'time' : pointTimeList [ i ] . match ( /\<div class=['"]scoreLeft['"]\>(.*)\<\/div\>/ ) [ 1 ] ,
'detail' : pointDetailList [ i ] . match ( /\<div class=['"]scoreRight ellipsis['"]\>(.*)\<\/div\>/ ) [ 1 ]
} ) ;
}
// 获取用户资源
let assetsNumList = data . match ( /assets-part[^<]*>(.*)</ig ) ;
let points = assetsNumList [ 0 ] . match ( /assets-num[^<]*>(.*)</ ) [ 1 ] ; // 积分
let experience = assetsNumList [ 2 ] . match ( /assets-num[^<]*>(.*)</ ) [ 1 ] ; // 经验
let gold = assetsNumList [ 4 ] . match ( /assets-num[^<]*>(.*)</ ) [ 1 ] ; // 金币
// let prestige = assetsNumList[6].match(/assets-num[^<]*>(.*)</)[1]; // 威望
let prestige = 0 ;
let silver = assetsNumList [ 6 ] . match ( /assets-num[^<]*>(.*)</ ) [ 1 ] ; // 碎银子
resolve ( [ userName , userPointList , Number ( points ) , Number ( experience ) , Number ( gold ) , Number ( prestige ) , Number ( silver ) ] ) ;
}
catch ( err ) {
magicJS . logError ( ` 获取用户信息失败,异常信息: ${ err } ` ) ;
resolve ( [ null , null , null , null , null , null , null ] ) ;
}
}
} )
} )
}
// 获取用户信息
function WebGetCurrentInfo ( smzdmCookie ) {
return new Promise ( ( resolve ) => {
let webGetCurrentInfo = {
url : ` https://zhiyou.smzdm.com/user/info/jsonp_get_current?with_avatar_ornament=1&callback=jQuery112403507528653716241_ ${ new Date ( ) . getTime ( ) } &_= ${ new Date ( ) . getTime ( ) } ` ,
headers : {
'Accept' : 'text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01' ,
'Accept-Language' : 'zh-CN,zh;q=0.9' ,
'Connection' : 'keep-alive' ,
'DNT' : '1' ,
'Host' : 'zhiyou.smzdm.com' ,
'Referer' : 'https://zhiyou.smzdm.com/user/' ,
'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36' ,
'Cookie' : smzdmCookie
}
} ;
magicJS . get ( webGetCurrentInfo , ( err , resp , data ) => {
try {
let obj = JSON . parse ( /\((.*)\)/ . exec ( data ) [ 1 ] ) ;
if ( obj [ 'smzdm_id' ] !== 0 ) {
resolve ( [
obj [ 'nickname' ] , // 昵称
` https: ${ obj [ 'avatar' ] } ` , // 头像
obj [ 'vip_level' ] , // 新版VIP等级
obj [ 'checkin' ] [ 'has_checkin' ] , //是否签到
Number ( obj [ 'checkin' ] [ 'daily_checkin_num' ] ) , //连续签到天数
Number ( obj [ 'unread' ] [ 'notice' ] [ 'num' ] ) , // 未读消息
Number ( obj [ 'level' ] ) , // 旧版等级
Number ( obj [ 'exp' ] ) , // 旧版经验
Number ( obj [ 'point' ] ) , // 积分
Number ( obj [ 'gold' ] ) , // 金币
Number ( obj [ 'silver' ] ) // 碎银子
] ) ;
}
else {
magicJS . logWarning ( ` 获取用户信息异常, Cookie过期或接口变化: ${ data } ` ) ;
resolve ( [ null , null , null , null , null , false , null , null ] ) ;
}
}
catch ( err ) {
magicJS . logError ( ` 获取用户信息异常,代码执行异常: ${ err } ,接口返回数据: ${ data } ` ) ;
resolve ( [ null , null , null , null , null , false , null , null ] ) ;
}
} )
} ) ;
}
; ( async ( ) => {
if ( magicJS . isRequest && zhiyouRegex . test ( magicJS . request . url ) && magicJS . request . method == 'GET' ) {
GetWebCookie ( ) ;
}
else {
// 通知信息
let title = '' ;
let subTitle = '' ;
let content = '' ;
// 获取Cookie
let smzdmCookie = magicJS . read ( smzdmCookieKey ) ;
if ( ! ! smzdmCookie === false ) {
magicJS . logWarning ( '没有读取到什么值得买有效cookie, 请访问zhiyou.smzdm.com进行登录' ) ;
magicJS . notify ( scriptName , '' , '❓没有获取到Web端Cookie, 请先进行登录。' ) ;
}
else {
try {
// 查询签到前用户数据
let [ nickName , avatar , beforeVIPLevel , beforeHasCheckin , , beforeNotice , , , beforePoint , beforeGold , beforeSilver ] = await WebGetCurrentInfo ( smzdmCookie ) ;
if ( ! nickName ) {
magicJS . notify ( scriptName , '' , '❌Cookie过期或接口变化, 请尝试重新登录' ) ;
magicJS . done ( ) ;
}
else {
let [ , , , beforeExp , , beforePrestige , ] = await WebGetCurrentInfoNewVersion ( smzdmCookie ) ;
magicJS . logInfo ( ` 昵称: ${ nickName } \n Web端签到状态: ${ beforeHasCheckin } \n 签到前等级 ${ beforeVIPLevel } ,积分 ${ beforePoint } ,经验 ${ beforeExp } ,金币 ${ beforeGold } ,碎银子 ${ beforeSilver } , 未读消息${ beforeNotice } ` ) ;
// Web端签到及重试
let webCheckinRetry = magicJS . retry ( WebSignin , 5 , 500 ) ;
let [ webCheckinErr , [ webCheckinResult , webCheckinStr ] ] = await magicJS . attempt ( webCheckinRetry ( smzdmCookie ) , [ false , 'Web端签到异常' ] ) ;
if ( webCheckinErr ) {
magicJS . logWarning ( 'Web端签到异常: ' + webCheckinErr ) ;
magicJS . notify ( webCheckinErr ) ;
}
else {
subTitle = webCheckinStr ;
// APP签到
2021-09-14 19:47:18 +08:00
// await magicJS.sleep(5000);
// await AppSignin(smzdmCookie).then(signinStr => {
// subTitle += ` ${signinStr}`;
// }).catch(ex =>{
// subTitle += ` ${ex}`;
// })
2021-04-09 19:34:05 +08:00
// 查询签到后用户数据
await magicJS . sleep ( 3000 ) ;
let [ , , afterVIPLevel , afterHasCheckin , afterCheckinNum , afterNotice , , , afterPoint , afterGold , afterSilver ] = await WebGetCurrentInfo ( smzdmCookie ) ;
let [ , afteruserPointList , , afterExp , , afterPrestige , ] = await WebGetCurrentInfoNewVersion ( smzdmCookie ) ;
magicJS . logInfo ( ` 昵称: ${ nickName } \n Web端签到状态: ${ afterHasCheckin } \n 签到后等级 ${ afterVIPLevel } ,积分 ${ afterPoint } ,经验 ${ afterExp } ,金币 ${ afterGold } ,碎银子 ${ afterSilver } ,未读消息 ${ afterNotice } ` ) ;
if ( beforeHasCheckin && afterHasCheckin ) {
webCheckinStr = 'Web端重复签到' ;
}
if ( ! ! afterCheckinNum ) content += ` 已连续签到 ${ afterCheckinNum } 天 ` ;
// 通知内容
if ( afterExp && beforeExp ) {
let addPoint = afterPoint - beforePoint ;
let addExp = afterExp - beforeExp ;
let addGold = afterGold - beforeGold ;
// let addPrestige = afterPrestige - beforePrestige;
let addSilver = afterSilver - beforeSilver ;
content += ! ! content ? '\n' : '' ;
content += '积分' + afterPoint + ( addPoint > 0 ? '(+' + addPoint + ')' : '' ) +
' 经验' + afterExp + ( addExp > 0 ? '(+' + addExp + ')' : '' ) +
' 金币' + afterGold + ( addGold > 0 ? '(+' + addGold + ')' : '' ) + '\n' +
'碎银子' + afterSilver + ( addSilver > 0 ? '(+' + addSilver + ')' : '' ) +
// ' 威望' + afterPrestige + (addPrestige > 0 ? '(+' + addPrestige + ')' : '') +
' 未读消息' + afterNotice ;
}
title = ` ${ scriptName } - ${ nickName } V ${ afterVIPLevel } ` ;
magicJS . notify ( title , subTitle , content , { 'media-url' : avatar } ) ;
}
}
}
catch ( err ) {
magicJS . logError ( ` 签到出现异常: ${ err } ` ) ;
magicJS . notify ( scriptName , '' , '❌签到出现异常,请查阅日志' ) ;
}
}
}
magicJS . done ( ) ;
} ) ( ) ;
2021-09-28 10:46:31 +08:00
// prettier-ignore
function MagicJS ( scriptName = "MagicJS" , logLevel = "INFO" ) { return new class { constructor ( ) { if ( this . version = "2.2.3.5" , this . scriptName = scriptName , this . logLevels = { DEBUG : 5 , INFO : 4 , NOTIFY : 3 , WARNING : 2 , ERROR : 1 , CRITICAL : 0 , NONE : - 1 } , this . isLoon = "undefined" != typeof $loon , this . isQuanX = "undefined" != typeof $task , this . isJSBox = "undefined" != typeof $drive , this . isNode = "undefined" != typeof module && ! this . isJSBox , this . isSurge = "undefined" != typeof $httpClient && ! this . isLoon , this . node = { request : void 0 , fs : void 0 , data : { } } , this . iOSUserAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Mobile/15E148 Safari/604.1" , this . pcUserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36 Edg/84.0.522.59" , this . logLevel = logLevel , this . _barkUrl = "" , this . _barkKey = "" , this . isNode ) { this . node . fs = require ( "fs" ) , this . node . request = require ( "request" ) ; try { this . node . fs . accessSync ( "./magic.json" , this . node . fs . constants . R _OK | this . node . fs . constants . W _OK ) } catch ( err ) { this . node . fs . writeFileSync ( "./magic.json" , "{}" , { encoding : "utf8" } ) } this . node . data = require ( "./magic.json" ) } else this . isJSBox && ( $file . exists ( "drive://MagicJS" ) || $file . mkdir ( "drive://MagicJS" ) , $file . exists ( "drive://MagicJS/magic.json" ) || $file . write ( { data : $data ( { string : "{}" } ) , path : "drive://MagicJS/magic.json" } ) ) } set barkUrl ( url ) { try { let _url = url . replace ( /\/+$/g , "" ) ; this . _barkUrl = ` ${ / ^ https ? : \ / \ / ( [ ^ /]*)/ . exec ( _url ) [ 0 ] } /push ` , this . _barkKey = /\/([^\/]+)\/?$/ . exec ( _url ) [ 1 ] } catch ( err ) { this . logDebug ( "读取Bark推送链接失败。" ) } } set logLevel ( level ) { this . _logLevel = "string" == typeof level ? level . toUpperCase ( ) : "DEBUG" } get logLevel ( ) { return this . _logLevel } get isRequest ( ) { return "undefined" != typeof $request && "undefined" == typeof $response } get isResponse ( ) { return "undefined" != typeof $response } get request ( ) { return "undefined" != typeof $request ? $request : void 0 } get response ( ) { return "undefined" != typeof $response ? ( $response . hasOwnProperty ( "status" ) && ( $response . statusCode = $response . status ) , $response . hasOwnProperty ( "statusCode" ) && ( $response . status = $response . statusCode ) , $response ) : void 0 } get platform ( ) { return this . isSurge ? "Surge" : this . isQuanX ? "Quantumult X" : this . isLoon ? "Loon" : this . isJSBox ? "JSBox" : this . isNode ? "Node.js" : "Unknown" } read ( key , session = "" ) { let val = "" ; this . isSurge || this . isLoon ? val = $persistentStore . read ( key ) : this . isQuanX ? val = $prefs . valueForKey ( key ) : this . isNode ? val = this . node . data : this . isJSBox && ( val = $file . read ( "drive://MagicJS/magic.json" ) . string ) ; try { this . isNode && ( val = val [ key ] ) , this . isJSBox && ( val = JSON . parse ( val ) [ key ] ) , session && ( "string" == typeof val && ( val = JSON . parse ( val ) ) , val = val && "object" == typeof val ? val [ session ] : null ) } catch ( err ) { this . logError ( err ) , val = session ? { } : null , this . del ( key ) } void 0 === val && ( val = null ) ; try { val && "string" == typeof val && ( val = JSON . parse ( val ) ) } catch ( err ) { } return this . logDebug ( ` READ DATA [ ${ key } ] ${ session ? ` [ ${ session } ] ` : "" } ( ${ typeof val } ) \n ${ JSON . stringify ( val ) } ` ) , val } write ( key , val , session = "" ) { let data = session ? { } : "" ; if ( session && ( this . isSurge || this . isLoon ) ? data = $persistentStore . read ( key ) : session && this . isQuanX ? data = $prefs . valueForKey ( key ) : this . isNode ? data = this . node . data : this . isJSBox && ( data = JSON . parse ( $file . read ( "drive://MagicJS/magic.json" ) . string ) ) , session ) { try { "string" == typeof data && ( data = JSON . parse ( data ) ) , data = "object" == typeof data && data ? data : { } } catch ( err ) { this . logError ( err ) , this . del ( key ) , data = { } } this . isJSBox || this . isNode ? ( data [ key ] && "object" == typeof data [ key ] || ( data [ key ] = { } ) , data [ key ] . hasOwnProperty ( session ) || ( data [ key ] [ session ] = null ) , void 0 === val ? delete data [ key ] [ session ] : data [ key ] [ session ] = val ) : void 0 === val ? delete data [ session ] : data [ session ] = val } else this . isNode || this . isJSBox ? void 0 === val ? delete data [ key ] : data [ key ] = val : data = void 0 === val ? null : val ; "object" == typeof data && ( data = JSON . stringify ( data ) ) , this . isSurge || this . isLoon ? $persistentStore . write ( data , key ) : this . isQuanX ? $prefs . setValueForKey ( data , key ) : this . isNode ? this . node . fs . writeFileSync ( "./magic.json" , data ) : this . isJSBox && $file . write ( { data : $data ( { string : data } ) , path : "drive://MagicJS/magic.json" } ) , this . logDebug ( ` WRITE DATA [ ${ key } ] ${ session ? ` [ ${ sess
2021-04-09 19:34:05 +08:00
function hex _md5 ( r ) { return rstr2hex ( rstr _md5 ( str2rstr _utf8 ( r ) ) ) } function b64 _md5 ( r ) { return rstr2b64 ( rstr _md5 ( str2rstr _utf8 ( r ) ) ) } function any _md5 ( r , t ) { return rstr2any ( rstr _md5 ( str2rstr _utf8 ( r ) ) , t ) } function hex _hmac _md5 ( r , t ) { return rstr2hex ( rstr _hmac _md5 ( str2rstr _utf8 ( r ) , str2rstr _utf8 ( t ) ) ) } function b64 _hmac _md5 ( r , t ) { return rstr2b64 ( rstr _hmac _md5 ( str2rstr _utf8 ( r ) , str2rstr _utf8 ( t ) ) ) } function any _hmac _md5 ( r , t , d ) { return rstr2any ( rstr _hmac _md5 ( str2rstr _utf8 ( r ) , str2rstr _utf8 ( t ) ) , d ) } function md5 _vm _test ( ) { return "900150983cd24fb0d6963f7d28e17f72" == hex _md5 ( "abc" ) . toLowerCase ( ) } function rstr _md5 ( r ) { return binl2rstr ( binl _md5 ( rstr2binl ( r ) , 8 * r . length ) ) } function rstr _hmac _md5 ( r , t ) { var d = rstr2binl ( r ) ; d . length > 16 && ( d = binl _md5 ( d , 8 * r . length ) ) ; for ( var n = Array ( 16 ) , _ = Array ( 16 ) , m = 0 ; m < 16 ; m ++ ) n [ m ] = 909522486 ^ d [ m ] , _ [ m ] = 1549556828 ^ d [ m ] ; var f = binl _md5 ( n . concat ( rstr2binl ( t ) ) , 512 + 8 * t . length ) ; return binl2rstr ( binl _md5 ( _ . concat ( f ) , 640 ) ) } function rstr2hex ( r ) { for ( var t , d = hexcase ? "0123456789ABCDEF" : "0123456789abcdef" , n = "" , _ = 0 ; _ < r . length ; _ ++ ) t = r . charCodeAt ( _ ) , n += d . charAt ( t >>> 4 & 15 ) + d . charAt ( 15 & t ) ; return n } function rstr2b64 ( r ) { for ( var t = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" , d = "" , n = r . length , _ = 0 ; _ < n ; _ += 3 ) for ( var m = r . charCodeAt ( _ ) << 16 | ( _ + 1 < n ? r . charCodeAt ( _ + 1 ) << 8 : 0 ) | ( _ + 2 < n ? r . charCodeAt ( _ + 2 ) : 0 ) , f = 0 ; f < 4 ; f ++ ) 8 * _ + 6 * f > 8 * r . length ? d += b64pad : d += t . charAt ( m >>> 6 * ( 3 - f ) & 63 ) ; return d } function rstr2any ( r , t ) { var d , n , _ , m , f , h = t . length , e = Array ( Math . ceil ( r . length / 2 ) ) ; for ( d = 0 ; d < e . length ; d ++ ) e [ d ] = r . charCodeAt ( 2 * d ) << 8 | r . charCodeAt ( 2 * d + 1 ) ; var a = Math . ceil ( 8 * r . length / ( Math . log ( t . length ) / Math . log ( 2 ) ) ) , i = Array ( a ) ; for ( n = 0 ; n < a ; n ++ ) { for ( f = Array ( ) , m = 0 , d = 0 ; d < e . length ; d ++ ) m = ( m << 16 ) + e [ d ] , _ = Math . floor ( m / h ) , m -= _ * h , ( f . length > 0 || _ > 0 ) && ( f [ f . length ] = _ ) ; i [ n ] = m , e = f } var o = "" ; for ( d = i . length - 1 ; d >= 0 ; d -- ) o += t . charAt ( i [ d ] ) ; return o } function str2rstr _utf8 ( r ) { for ( var t , d , n = "" , _ = - 1 ; ++ _ < r . length ; ) t = r . charCodeAt ( _ ) , d = _ + 1 < r . length ? r . charCodeAt ( _ + 1 ) : 0 , 55296 <= t && t <= 56319 && 56320 <= d && d <= 57343 && ( t = 65536 + ( ( 1023 & t ) << 10 ) + ( 1023 & d ) , _ ++ ) , t <= 127 ? n += String . fromCharCode ( t ) : t <= 2047 ? n += String . fromCharCode ( 192 | t >>> 6 & 31 , 128 | 63 & t ) : t <= 65535 ? n += String . fromCharCode ( 224 | t >>> 12 & 15 , 128 | t >>> 6 & 63 , 128 | 63 & t ) : t <= 2097151 && ( n += String . fromCharCode ( 240 | t >>> 18 & 7 , 128 | t >>> 12 & 63 , 128 | t >>> 6 & 63 , 128 | 63 & t ) ) ; return n } function str2rstr _utf16le ( r ) { for ( var t = "" , d = 0 ; d < r . length ; d ++ ) t += String . fromCharCode ( 255 & r . charCodeAt ( d ) , r . charCodeAt ( d ) >>> 8 & 255 ) ; return t } function str2rstr _utf16be ( r ) { for ( var t = "" , d = 0 ; d < r . length ; d ++ ) t += String . fromCharCode ( r . charCodeAt ( d ) >>> 8 & 255 , 255 & r . charCodeAt ( d ) ) ; return t } function rstr2binl ( r ) { for ( var t = Array ( r . length >> 2 ) , d = 0 ; d < t . length ; d ++ ) t [ d ] = 0 ; for ( d = 0 ; d < 8 * r . length ; d += 8 ) t [ d >> 5 ] |= ( 255 & r . charCodeAt ( d / 8 ) ) << d % 32 ; return t } function binl2rstr ( r ) { for ( var t = "" , d = 0 ; d < 32 * r . length ; d += 8 ) t += String . fromCharCode ( r [ d >> 5 ] >>> d % 32 & 255 ) ; return t } function binl _md5 ( r , t ) { r [ t >> 5 ] |= 128 << t % 32 , r [ 14 + ( t + 64 >>> 9 << 4 ) ] = t ; for ( var d = 1732584193 , n = - 271733879 , _ = - 1732584194 , m = 271733878 , f = 0 ; f < r . length ; f += 16 ) { var h = d , e = n , a = _ , i = m ; d = md5 _ff ( d , n , _ , m , r [ f + 0 ] , 7 , - 680876936 ) , m = md5 _ff ( m , d , n , _ , r [ f + 1 ] , 12 , - 389564586 ) , _ = md5 _ff ( _ , m , d , n , r [ f + 2 ] , 17 , 606105819 ) , n = md5 _ff ( n , _ , m , d , r [ f + 3 ] , 22 , - 1044525330 ) , d = md5 _ff ( d , n , _ , m , r [ f + 4 ] , 7 , - 176418897 ) , m = md5 _ff ( m , d , n , _ , r [ f + 5 ] , 12 , 1200080426 ) , _ = md5 _ff ( _ , m , d , n , r [ f + 6 ] , 17 , - 1473231341 ) , n = md5 _ff ( n , _ , m , d , r [ f + 7 ] , 22 , - 45705983 ) , d = md5 _ff ( d , n , _ , m , r [ f + 8 ] , 7 , 1770035416 ) , m = md5 _ff ( m , d , n , _ , r [ f + 9 ] , 12 , - 1958414417 ) , _ = md5 _ff ( _ , m , d , n , r [ f + 10 ] , 17 , - 42063 ) , n = md5 _ff ( n , _ , m , d , r [ f + 11 ] , 22 , - 1990404162 ) , d = md5 _ff ( d , n , _ , m , r [ f + 12 ] , 7 , 1804603682 ) , m = md5 _ff ( m , d , n , _ , r [ f + 13 ] , 12 , - 40341101 ) , _ = md5 _ff ( _ , m , d , n , r [ f + 14 ] , 17 , - 1502002290 ) , n = md5 _ff ( n , _ , m , d , r [ f + 15 ] , 22 , 1236535329 ) , d = md5 _gg ( d , n , _ , m , r [ f + 1 ] , 5 , - 165796510 ) , m = md5 _gg ( m , d , n , _ , r [ f + 6 ] , 9 , - 1069501632 ) , _ = md5 _gg ( _ , m , d , n , r [ f + 11 ] , 14 , 643717713 ) , n = md5 _gg ( n , _ , m , d , r [ f + 0 ] , 20 , - 373897302 ) , d = md5 _gg ( d , n , _ , m , r [ f + 5 ] , 5 , - 701558691 ) , m = md5 _gg ( m , d , n , _ , r [ f + 10 ] , 9 , 38016083 ) , _ = md5 _gg ( _ , m , d , n , r [ f + 15 ] , 14 , - 660478335 ) , n = md5 _gg ( n , _ , m , d , r [ f + 4 ] , 20 , - 405537848 ) , d = md5 _gg ( d , n , _ , m , r [ f + 9 ] , 5 , 568446438 ) , m = md5 _gg ( m , d , n , _ , r [ f + 14 ] , 9 , - 1019803690 ) , _ = md5 _gg ( _ , m , d , n , r [ f + 3 ] , 14 , - 187363961 ) , n = md5 _gg ( n , _ , m , d , r [ f + 8 ] , 20 , 1163531501 ) , d = md5 _gg ( d , n , _ , m , r [ f + 13 ] , 5 , - 1444681467 ) , m = md5 _gg ( m , d , n , _ , r [