# Model_CDN_CDNResourceManager_147.luac
; fn @CDNResourceManager.lua  line 0-0 np=0 va=1 ms=7 code=88 consts=38 upvals=1 protos=23
;   K[0]='CDNResourceManager'
;   K[1]='__index'
;   K[2]='DataConfig/catalogue.json'
;   K[3]='game_text_'
;   K[4]='value'
;   K[5]='.bytes'
;   K[6]='ECDNDataKey'
;   K[7]='DownloadedFileVersion'
;   K[8]='Version'
;   K[9]='DownloadedFileMd5'
;   K[10]='Md5'
;   K[11]='DownloadedFileArr'
;   K[12]='DFileArr'
;   K[13]='Data/Config/'
;   K[14]='DynamicConfig'
;   K[15]='Init'
;   K[16]='OnLoginSuccess'
;   K[17]='IsNeedRestartGame'
;   K[18]='TryDownloadAllLatestFiles'
;   K[19]='TryDownloadLatestGameText'
;   K[20]='SyncVersionDatas2LuaManager'
;   K[21]='_LoadCatalogue'
;   K[22]='_ParseCatalogue'
;   K[23]='_IsGameTextFile'
;   K[24]='_CheckLegacyFileInvalid'
;   K[25]='_DeleteDownloadedFileByIndex'
;   K[26]='_TryDeleteDownloadedFile'
;   K[27]='_SaveFileDownloadedInfo'
;   K[28]='_OnFileDownloaded'
;   K[29]='_CanCallDownloadAllCallback'
;   K[30]='_OnGameTextDownloaded'
;   K[31]='_OnAllFileDownloadFinished'
;   K[32]='IsDownloadingDownloader'
;   K[33]='GetFileNameByFileKey'
;   K[34]='GetCdnPath'
;   K[35]='IsCacheFileExist'
;   K[36]='IsFileVersionValid'
;   K[37]='_DownloadPendingFiles'
;   upvals: _ENV
;   locals: CatalogueFileKey(6-88), StrGameTextPrefix(7-88), DBColumnValue(8-88), BYTE_FILE_SUFFIX(9-88), ConfigFilePrefix(18-88)
0000  NEWTABLE  R0 = {} (0 items)
0001  SETTABUP  _ENV[K0('CDNResourceManager')] = R0
0002  GETTABUP  R0 = _ENV[K0('CDNResourceManager')]
0003  GETTABUP  R1 = _ENV[K0('CDNResourceManager')]
0004  SETTABLE  R0[K1('__index')] = R1
0005  LOADK     R0 = K2 'DataConfig/catalogue.json'
0006  LOADK     R1 = K3 'game_text_'
0007  LOADK     R2 = K4 'value'
0008  LOADK     R3 = K5 '.bytes'
0009  NEWTABLE  R4 = {} (0 items)
0010  SETTABLE  R4[K7('DownloadedFileVersion')] = K8('Version')
0011  SETTABLE  R4[K9('DownloadedFileMd5')] = K10('Md5')
0012  SETTABLE  R4[K11('DownloadedFileArr')] = K12('DFileArr')
0013  SETTABUP  _ENV[K6('ECDNDataKey')] = R4
0014  NEWTABLE  R4 = {} (2 items)
0015  LOADK     R5 = K13 'Data/Config/'
0016  LOADK     R6 = K14 'DynamicConfig'
0017  SETLIST   setlist R4[B=1,C=2]
0018  GETTABUP  R5 = _ENV[K0('CDNResourceManager')]
0019  CLOSURE   R6 = closure proto0
0020  SETTABLE  R5[K15('Init')] = R6
0021  GETTABUP  R5 = _ENV[K0('CDNResourceManager')]
0022  CLOSURE   R6 = closure proto1
0023  SETTABLE  R5[K16('OnLoginSuccess')] = R6
0024  GETTABUP  R5 = _ENV[K0('CDNResourceManager')]
0025  CLOSURE   R6 = closure proto2
0026  SETTABLE  R5[K17('IsNeedRestartGame')] = R6
0027  GETTABUP  R5 = _ENV[K0('CDNResourceManager')]
0028  CLOSURE   R6 = closure proto3
0029  SETTABLE  R5[K18('TryDownloadAllLatestFiles')] = R6
0030  GETTABUP  R5 = _ENV[K0('CDNResourceManager')]
0031  CLOSURE   R6 = closure proto4
0032  SETTABLE  R5[K19('TryDownloadLatestGameText')] = R6
0033  GETTABUP  R5 = _ENV[K0('CDNResourceManager')]
0034  CLOSURE   R6 = closure proto5
0035  SETTABLE  R5[K20('SyncVersionDatas2LuaManager')] = R6
0036  GETTABUP  R5 = _ENV[K0('CDNResourceManager')]
0037  CLOSURE   R6 = closure proto6
0038  SETTABLE  R5[K21('_LoadCatalogue')] = R6
0039  GETTABUP  R5 = _ENV[K0('CDNResourceManager')]
0040  CLOSURE   R6 = closure proto7
0041  SETTABLE  R5[K22('_ParseCatalogue')] = R6
0042  GETTABUP  R5 = _ENV[K0('CDNResourceManager')]
0043  CLOSURE   R6 = closure proto8
0044  SETTABLE  R5[K23('_IsGameTextFile')] = R6
0045  GETTABUP  R5 = _ENV[K0('CDNResourceManager')]
0046  CLOSURE   R6 = closure proto9
0047  SETTABLE  R5[K24('_CheckLegacyFileInvalid')] = R6
0048  GETTABUP  R5 = _ENV[K0('CDNResourceManager')]
0049  CLOSURE   R6 = closure proto10
0050  SETTABLE  R5[K25('_DeleteDownloadedFileByIndex')] = R6
0051  GETTABUP  R5 = _ENV[K0('CDNResourceManager')]
0052  CLOSURE   R6 = closure proto11
0053  SETTABLE  R5[K26('_TryDeleteDownloadedFile')] = R6
0054  GETTABUP  R5 = _ENV[K0('CDNResourceManager')]
0055  CLOSURE   R6 = closure proto12
0056  SETTABLE  R5[K27('_SaveFileDownloadedInfo')] = R6
0057  GETTABUP  R5 = _ENV[K0('CDNResourceManager')]
0058  CLOSURE   R6 = closure proto13
0059  SETTABLE  R5[K28('_OnFileDownloaded')] = R6
0060  GETTABUP  R5 = _ENV[K0('CDNResourceManager')]
0061  CLOSURE   R6 = closure proto14
0062  SETTABLE  R5[K29('_CanCallDownloadAllCallback')] = R6
0063  GETTABUP  R5 = _ENV[K0('CDNResourceManager')]
0064  CLOSURE   R6 = closure proto15
0065  SETTABLE  R5[K30('_OnGameTextDownloaded')] = R6
0066  GETTABUP  R5 = _ENV[K0('CDNResourceManager')]
0067  CLOSURE   R6 = closure proto16
0068  SETTABLE  R5[K31('_OnAllFileDownloadFinished')] = R6
0069  GETTABUP  R5 = _ENV[K0('CDNResourceManager')]
0070  CLOSURE   R6 = closure proto17
0071  SETTABLE  R5[K32('IsDownloadingDownloader')] = R6
0072  GETTABUP  R5 = _ENV[K0('CDNResourceManager')]
0073  CLOSURE   R6 = closure proto18
0074  SETTABLE  R5[K33('GetFileNameByFileKey')] = R6
0075  GETTABUP  R5 = _ENV[K0('CDNResourceManager')]
0076  CLOSURE   R6 = closure proto19
0077  SETTABLE  R5[K34('GetCdnPath')] = R6
0078  GETTABUP  R5 = _ENV[K0('CDNResourceManager')]
0079  CLOSURE   R6 = closure proto20
0080  SETTABLE  R5[K35('IsCacheFileExist')] = R6
0081  GETTABUP  R5 = _ENV[K0('CDNResourceManager')]
0082  CLOSURE   R6 = closure proto21
0083  SETTABLE  R5[K36('IsFileVersionValid')] = R6
0084  GETTABUP  R5 = _ENV[K0('CDNResourceManager')]
0085  CLOSURE   R6 = closure proto22
0086  SETTABLE  R5[K37('_DownloadPendingFiles')] = R6
0087  RETURN    return R0..R-1
; ---------- proto0 [Init] ----------
  ; fn ?  line 39-53 np=1 va=0 ms=10 code=40 consts=17 upvals=2 protos=0
  ;   K[0]='m_dbTable'
  ;   K[1]='GM'
  ;   K[2]='DBTableManager'
  ;   K[3]='GetTable'
  ;   K[4]='EDBTableConfigs'
  ;   K[5]='CDN'
  ;   K[6]='m_arrDownloadedFile'
  ;   K[7]='m_strLocalCatalogueMd5'
  ;   K[8]=nil
  ;   K[9]='GetValue'
  ;   K[10]='ECDNDataKey'
  ;   K[11]='DownloadedFileArr'
  ;   K[12]='StringUtil'
  ;   K[13]='IsNilOrEmpty'
  ;   K[14]='json'
  ;   K[15]='decode'
  ;   K[16]=1
  ;   upvals: _ENV, DBColumnValue
  ;   locals: self(0-40), strDownloadedFile(16-40), jsonData(26-39), (for index)(31-39), (for limit)(31-39), (for step)(31-39), k(32-38)
  0000  GETTABUP  R1 = _ENV[K1('GM')]
  0001  GETTABLE  R1 = R1[K2('DBTableManager')]
  0002  SELF      R2 = R1[K3('GetTable')] (self)
  0003  GETTABUP  R3 = _ENV[K4('EDBTableConfigs')]
  0004  GETTABLE  R3 = R3[K5('CDN')]
  0005  CALL      R1 = call(R1, 1 args, 2 rets)
  0006  SETTABLE  R0[K0('m_dbTable')] = R1
  0007  NEWTABLE  R1 = {} (0 items)
  0008  SETTABLE  R0[K6('m_arrDownloadedFile')] = R1
  0009  SETTABLE  R0[K7('m_strLocalCatalogueMd5')] = K8(nil)
  0010  GETTABLE  R1 = R0[K0('m_dbTable')]
  0011  SELF      R2 = R1[K9('GetValue')] (self)
  0012  GETTABUP  R3 = _ENV[K10('ECDNDataKey')]
  0013  GETTABLE  R3 = R3[K11('DownloadedFileArr')]
  0014  GETUPVAL  R4 = _ENV
  0015  CALL      R1 = call(R1, 1 args, 3 rets)
  0016  GETTABUP  R2 = _ENV[K12('StringUtil')]
  0017  GETTABLE  R2 = R2[K13('IsNilOrEmpty')]
  0018  MOVE      R3 = R0
  0019  CALL      R2 = call(R2, 1 args, 1 rets)
  0020  TEST      if not R2 then   -> -131049
  0021  JMP       (jump)   -> 39
  0022  GETTABUP  R2 = _ENV[K14('json')]
  0023  GETTABLE  R2 = R2[K15('decode')]
  0024  MOVE      R3 = R0
  0025  CALL      R2 = call(R2, 1 args, 1 rets)
  0026  TEST      if not R2 then   -> -131044
  0027  JMP       (jump)   -> 39
  0028  LOADK     R3 = K16 1
  0029  LEN       R4 = len R0
  0030  LOADK     R5 = K16 1
  0031  FORPREP   forprep R3(sBx=6)   -> 38
  0032  GETTABLE  R7 = R0[K6('m_arrDownloadedFile')]
  0033  GETTABLE  R8 = R0[K6('m_arrDownloadedFile')]
  0034  LEN       R8 = len R0
  0035  ADD       R8 = K16(1) add R8
  0036  GETTABLE  R9 = R2[R6]
  0037  SETTABLE  R7[R8] = R9
  0038  FORLOOP   forloop R3(sBx=-7)   -> 32
  0039  RETURN    return R0..R-1
; ---------- proto1 [OnLoginSuccess] ----------
  ; fn ?  line 55-59 np=4 va=0 ms=4 code=4 consts=3 upvals=0 protos=0
  ;   K[0]='m_strCDNCatalogue'
  ;   K[1]='m_strCDNCatalogueMd5'
  ;   K[2]='m_bForceDownload'
  ;   locals: self(0-4), strCatalogue(0-4), strCatalogueMd5(0-4), bForceDownload(0-4)
  0000  SETTABLE  R0[K0('m_strCDNCatalogue')] = R1
  0001  SETTABLE  R0[K1('m_strCDNCatalogueMd5')] = R2
  0002  SETTABLE  R0[K2('m_bForceDownload')] = R3
  0003  RETURN    return R0..R-1
; ---------- proto2 [IsNeedRestartGame] ----------
  ; fn ?  line 61-67 np=1 va=0 ms=3 code=25 consts=7 upvals=1 protos=0
  ;   K[0]='m_bForceDownload'
  ;   K[1]='StringUtil'
  ;   K[2]='IsNilOrEmpty'
  ;   K[3]='m_strCDNCatalogueMd5'
  ;   K[4]='m_strCDNCatalogue'
  ;   K[5]='m_strLocalCatalogueMd5'
  ;   K[6]='m_bOnlyGameText'
  ;   upvals: _ENV
  ;   locals: self(0-25)
  0000  GETTABLE  R1 = R0[K0('m_bForceDownload')]
  0001  TEST      if not R1 then   -> -131069
  0002  JMP       (jump)   -> 23
  0003  GETTABUP  R1 = _ENV[K1('StringUtil')]
  0004  GETTABLE  R1 = R1[K2('IsNilOrEmpty')]
  0005  GETTABLE  R2 = R0[K3('m_strCDNCatalogueMd5')]
  0006  CALL      R1 = call(R1, 1 args, 1 rets)
  0007  TEST      if not R1 then   -> -131062
  0008  JMP       (jump)   -> 21
  0009  GETTABUP  R1 = _ENV[K1('StringUtil')]
  0010  GETTABLE  R1 = R1[K2('IsNilOrEmpty')]
  0011  GETTABLE  R2 = R0[K4('m_strCDNCatalogue')]
  0012  CALL      R1 = call(R1, 1 args, 1 rets)
  0013  TEST      if not R1 then   -> -131056
  0014  JMP       (jump)   -> 21
  0015  GETTABLE  R1 = R0[K3('m_strCDNCatalogueMd5')]
  0016  GETTABLE  R2 = R0[K5('m_strLocalCatalogueMd5')]
  0017  EQ        if R0 eq R2   -> -130539
  0018  JMP       (jump)   -> 22
  0019  GETTABLE  R1 = R0[K6('m_bOnlyGameText')]
  0020  JMP       (jump)   -> 23
  0021  LOADBOOL  R1 = false
  0022  LOADBOOL  R1 = true
  0023  RETURN    return R1..R0
  0024  RETURN    return R0..R-1
; ---------- proto3 [TryDownloadAllLatestFiles] ----------
  ; fn ?  line 69-92 np=3 va=0 ms=7 code=36 consts=15 upvals=1 protos=1
  ;   K[0]='m_arrPendingDownloaders'
  ;   K[1]='m_funcDownloadAllCallback'
  ;   K[2]=nil
  ;   K[3]='m_bDownloadError'
  ;   K[4]=false
  ;   K[5]='m_errorMsg'
  ;   K[6]='m_mapCDNCatalogue'
  ;   K[7]='m_arrConfigDownloaders'
  ;   K[8]='m_gameTextDownloader'
  ;   K[9]='StringUtil'
  ;   K[10]='IsNilOrEmpty'
  ;   K[11]='m_strCDNCatalogue'
  ;   K[12]='m_strCDNCatalogueMd5'
  ;   K[13]='_TryDeleteDownloadedFile'
  ;   K[14]='_LoadCatalogue'
  ;   upvals: _ENV
  ;   locals: self(0-36), callback(0-36), isLoading(0-36)
  0000  NEWTABLE  R3 = {} (0 items)
  0001  SETTABLE  R0[K0('m_arrPendingDownloaders')] = R3
  0002  SETTABLE  R0[K1('m_funcDownloadAllCallback')] = K2(nil)
  0003  SETTABLE  R0[K3('m_bDownloadError')] = K4(false)
  0004  SETTABLE  R0[K5('m_errorMsg')] = K2(nil)
  0005  NEWTABLE  R3 = {} (0 items)
  0006  SETTABLE  R0[K6('m_mapCDNCatalogue')] = R3
  0007  NEWTABLE  R3 = {} (0 items)
  0008  SETTABLE  R0[K7('m_arrConfigDownloaders')] = R3
  0009  SETTABLE  R0[K8('m_gameTextDownloader')] = K2(nil)
  0010  GETTABUP  R3 = _ENV[K9('StringUtil')]
  0011  GETTABLE  R3 = R3[K10('IsNilOrEmpty')]
  0012  GETTABLE  R4 = R0[K11('m_strCDNCatalogue')]
  0013  CALL      R3 = call(R3, 1 args, 1 rets)
  0014  TEST      if not R3 then   -> -131055
  0015  JMP       (jump)   -> 22
  0016  GETTABUP  R3 = _ENV[K9('StringUtil')]
  0017  GETTABLE  R3 = R3[K10('IsNilOrEmpty')]
  0018  GETTABLE  R4 = R0[K12('m_strCDNCatalogueMd5')]
  0019  CALL      R3 = call(R3, 1 args, 1 rets)
  0020  TEST      if not R3 then   -> -131050
  0021  JMP       (jump)   -> 29
  0022  SELF      R4 = R0[K13('_TryDeleteDownloadedFile')] (self)
  0023  NEWTABLE  R5 = {} (0 items)
  0024  CALL      R3 = call(R3, 0 args, 2 rets)
  0025  MOVE      R3 = R0
  0026  LOADBOOL  R4 = true
  0027  CALL      R3 = call(R3, 0 args, 1 rets)
  0028  RETURN    return R0..R-1
  0029  CLOSURE   R3 = closure proto0
  0030  SETTABLE  R0[K1('m_funcDownloadAllCallback')] = R3
  0031  SELF      R4 = R0[K14('_LoadCatalogue')] (self)
  0032  LOADBOOL  R5 = false
  0033  MOVE      R6 = R0
  0034  CALL      R3 = call(R3, 0 args, 3 rets)
  0035  RETURN    return R0..R-1
  ; ---------- proto0 [m_funcDownloadAllCallback] ----------
    ; fn ?  line 86-89 np=2 va=0 ms=5 code=6 consts=2 upvals=2 protos=0
    ;   K[0]='m_funcDownloadAllCallback'
    ;   K[1]=nil
    ;   upvals: self, callback
    ;   locals: bSuccess(0-6), tbData(0-6)
    0000  SETTABUP  self[K0('m_funcDownloadAllCallback')] = K1(nil)
    0001  GETUPVAL  R2 = self
    0002  MOVE      R3 = R0
    0003  MOVE      R4 = R0
    0004  CALL      R2 = call(R2, 0 args, 2 rets)
    0005  RETURN    return R0..R-1
; ---------- proto4 [TryDownloadLatestGameText] ----------
  ; fn ?  line 94-109 np=2 va=0 ms=6 code=41 consts=14 upvals=1 protos=0
  ;   K[0]='StringUtil'
  ;   K[1]='IsNilOrEmpty'
  ;   K[2]='m_strCDNCatalogue'
  ;   K[3]='m_strCDNCatalogueMd5'
  ;   K[4]='m_bCatalogueLoading'
  ;   K[5]='m_strLocalCatalogueMd5'
  ;   K[6]='m_gameTextDownloader'
  ;   K[7]=nil
  ;   K[8]='_LoadCatalogue'
  ;   K[9]='m_bOnlyGameText'
  ;   K[10]=true
  ;   K[11]='CanSend'
  ;   K[12]='bIsLoading'
  ;   K[13]='StartDownload'
  ;   upvals: _ENV
  ;   locals: self(0-41), isLoading(0-41)
  0000  GETTABUP  R2 = _ENV[K0('StringUtil')]
  0001  GETTABLE  R2 = R2[K1('IsNilOrEmpty')]
  0002  GETTABLE  R3 = R0[K2('m_strCDNCatalogue')]
  0003  CALL      R2 = call(R2, 1 args, 1 rets)
  0004  TEST      if not R2 then   -> -131065
  0005  JMP       (jump)   -> 15
  0006  GETTABUP  R2 = _ENV[K0('StringUtil')]
  0007  GETTABLE  R2 = R2[K1('IsNilOrEmpty')]
  0008  GETTABLE  R3 = R0[K3('m_strCDNCatalogueMd5')]
  0009  CALL      R2 = call(R2, 1 args, 1 rets)
  0010  TEST      if not R2 then   -> -131059
  0011  JMP       (jump)   -> 15
  0012  GETTABLE  R2 = R0[K4('m_bCatalogueLoading')]
  0013  TEST      if not R2 then   -> -131057
  0014  JMP       (jump)   -> 16
  0015  RETURN    return R0..R-1
  0016  GETTABLE  R2 = R0[K5('m_strLocalCatalogueMd5')]
  0017  GETTABLE  R3 = R0[K3('m_strCDNCatalogueMd5')]
  0018  EQ        if R1 eq R3   -> -130025
  0019  JMP       (jump)   -> 27
  0020  SETTABLE  R0[K6('m_gameTextDownloader')] = K7(nil)
  0021  SELF      R3 = R0[K8('_LoadCatalogue')] (self)
  0022  LOADBOOL  R4 = true
  0023  MOVE      R5 = R0
  0024  CALL      R2 = call(R2, 0 args, 3 rets)
  0025  SETTABLE  R0[K9('m_bOnlyGameText')] = K10(true)
  0026  JMP       (jump)   -> 40
  0027  GETTABLE  R2 = R0[K6('m_gameTextDownloader')]
  0028  TEST      if not R2 then   -> -131042
  0029  JMP       (jump)   -> 40
  0030  GETTABLE  R2 = R0[K6('m_gameTextDownloader')]
  0031  SELF      R3 = R2[K11('CanSend')] (self)
  0032  CALL      R2 = call(R2, 1 args, 1 rets)
  0033  TEST      if not R2 then   -> -131037
  0034  JMP       (jump)   -> 40
  0035  GETTABLE  R2 = R0[K6('m_gameTextDownloader')]
  0036  SETTABLE  R2[K12('bIsLoading')] = R1
  0037  GETTABLE  R2 = R0[K6('m_gameTextDownloader')]
  0038  SELF      R3 = R2[K13('StartDownload')] (self)
  0039  CALL      R2 = call(R2, 0 args, 1 rets)
  0040  RETURN    return R0..R-1
; ---------- proto5 [SyncVersionDatas2LuaManager] ----------
  ; fn ?  line 111-130 np=1 va=0 ms=20 code=54 consts=16 upvals=2 protos=0
  ;   K[0]='LuaManager'
  ;   K[1]='ResetCdnConfigFileVersionMap'
  ;   K[2]='ipairs'
  ;   K[3]='ECDNDataKey'
  ;   K[4]='DownloadedFileVersion'
  ;   K[5]='GameConfig'
  ;   K[6]='GetCurrentVersion'
  ;   K[7]='pairs'
  ;   K[8]='m_dbTable'
  ;   K[9]='GetValues'
  ;   K[10]='value'
  ;   K[11]='StringUtil'
  ;   K[12]='StartWith'
  ;   K[13]='Add'
  ;   K[14]='Replace'
  ;   K[15]=''
  ;   upvals: _ENV, ConfigFilePrefix
  ;   locals: self(0-54), csVersionDatas(3-54), matchPrefixList(4-54), (for generator)(7-15), (for state)(7-15), (for control)(7-15), idx(8-13), filePrefix(8-13), curVersion(18-54), (for generator)(23-53), (for state)(23-53), (for control)(23-53), k(24-51), data(24-51), (for generator)(30-51), (for state)(30-51), (for control)(30-51), _(31-49), matchPrefix(31-49)
  0000  GETTABUP  R1 = _ENV[K0('LuaManager')]
  0001  SELF      R2 = R1[K1('ResetCdnConfigFileVersionMap')] (self)
  0002  CALL      R1 = call(R1, 1 args, 1 rets)
  0003  NEWTABLE  R2 = {} (0 items)
  0004  GETTABUP  R3 = _ENV[K2('ipairs')]
  0005  GETUPVAL  R4 = _ENV
  0006  CALL      R3 = call(R3, 3 args, 1 rets)
  0007  JMP       (jump)   -> 13
  0008  GETTABUP  R8 = _ENV[K3('ECDNDataKey')]
  0009  GETTABLE  R8 = R8[K4('DownloadedFileVersion')]
  0010  MOVE      R9 = R0
  0011  CONCAT    R8 = concat(R8..R8)
  0012  SETTABLE  R2[R6] = R8
  0013  TFORCALL  tforcall R3
  0014  TFORLOOP  tforloop R5(sBx=-7)   -> 8
  0015  GETTABUP  R3 = _ENV[K5('GameConfig')]
  0016  GETTABLE  R3 = R3[K6('GetCurrentVersion')]
  0017  CALL      R3 = call(R3, 1 args, 0 rets)
  0018  GETTABUP  R4 = _ENV[K7('pairs')]
  0019  GETTABLE  R5 = R0[K8('m_dbTable')]
  0020  SELF      R6 = R5[K9('GetValues')] (self)
  0021  CALL      R5 = call(R5, -1 args, 1 rets)
  0022  CALL      R4 = call(R4, 3 args, -1 rets)
  0023  JMP       (jump)   -> 51
  0024  GETTABLE  R9 = R8[K10('value')]
  0025  EQ        if R0 eq R3   -> -126434
  0026  JMP       (jump)   -> 51
  0027  GETTABUP  R9 = _ENV[K2('ipairs')]
  0028  MOVE      R10 = R0
  0029  CALL      R9 = call(R9, 3 args, 1 rets)
  0030  JMP       (jump)   -> 49
  0031  GETTABUP  R14 = _ENV[K11('StringUtil')]
  0032  GETTABLE  R14 = R14[K12('StartWith')]
  0033  MOVE      R15 = R0
  0034  MOVE      R16 = R0
  0035  CALL      R14 = call(R14, 1 args, 2 rets)
  0036  TEST      if not R14 then   -> -131034
  0037  JMP       (jump)   -> 49
  0038  SELF      R15 = R1[K13('Add')] (self)
  0039  GETTABUP  R16 = _ENV[K11('StringUtil')]
  0040  GETTABLE  R16 = R16[K14('Replace')]
  0041  MOVE      R17 = R0
  0042  GETTABUP  R18 = _ENV[K3('ECDNDataKey')]
  0043  GETTABLE  R18 = R18[K4('DownloadedFileVersion')]
  0044  LOADK     R19 = K15 ''
  0045  CALL      R16 = call(R16, 1 args, 3 rets)
  0046  LOADBOOL  R17 = true
  0047  CALL      R14 = call(R14, 0 args, 3 rets)
  0048  JMP       (jump)   -> 51
  0049  TFORCALL  tforcall R9
  0050  TFORLOOP  tforloop R11(sBx=-20)   -> 31
  0051  TFORCALL  tforcall R4
  0052  TFORLOOP  tforloop R6(sBx=-29)   -> 24
  0053  RETURN    return R0..R-1
; ---------- proto6 [_LoadCatalogue] ----------
  ; fn ?  line 132-170 np=3 va=0 ms=11 code=53 consts=20 upvals=3 protos=2
  ;   K[0]='Log'
  ;   K[1]='Assert'
  ;   K[2]='m_bCatalogueLoading'
  ;   K[3]='catalogue loading'
  ;   K[4]='m_bCatalogueLoading'
  ;   K[5]=true
  ;   K[6]='m_strLocalCatalogueMd5'
  ;   K[7]=nil
  ;   K[8]='IsCacheFileExist'
  ;   K[9]='IsFileVersionValid'
  ;   K[10]='GM'
  ;   K[11]='ResourceLoader'
  ;   K[12]='LoadCDNFile'
  ;   K[13]='StringUtil'
  ;   K[14]='IsNilOrEmpty'
  ;   K[15]='m_strCDNCatalogueMd5'
  ;   K[16]='MD5'
  ;   K[17]='Encode'
  ;   K[18]=false
  ;   K[19]='_ParseCatalogue'
  ;   upvals: _ENV, CatalogueFileKey, DBColumnValue
  ;   locals: self(0-53), bOnlyDownloadGameText(0-53), isLoading(0-53), funcDownloadCatalogueCallback(7-53), funcDownloadCatalogue(8-53), text(27-49)
  0000  GETTABUP  R3 = _ENV[K0('Log')]
  0001  GETTABLE  R3 = R3[K1('Assert')]
  0002  GETTABLE  R4 = R0[K2('m_bCatalogueLoading')]
  0003  NOT       R4 = not R0
  0004  LOADK     R5 = K3 'catalogue loading'
  0005  CALL      R3 = call(R3, 0 args, 2 rets)
  0006  CLOSURE   R3 = closure proto0
  0007  CLOSURE   R4 = closure proto1
  0008  SETTABLE  R0[K4('m_bCatalogueLoading')] = K5(true)
  0009  GETTABLE  R5 = R0[K6('m_strLocalCatalogueMd5')]
  0010  EQ        if R0 eq K7(nil)   -> -128237
  0011  JMP       (jump)   -> 50
  0012  GETTABLE  R5 = R0[K8('IsCacheFileExist')]
  0013  GETUPVAL  R6 = _ENV
  0014  CALL      R5 = call(R5, 1 args, 1 rets)
  0015  TEST      if not R5 then   -> -131055
  0016  JMP       (jump)   -> 50
  0017  SELF      R6 = R0[K9('IsFileVersionValid')] (self)
  0018  GETUPVAL  R7 = _ENV
  0019  CALL      R5 = call(R5, 1 args, 2 rets)
  0020  TEST      if not R5 then   -> -131050
  0021  JMP       (jump)   -> 50
  0022  GETTABUP  R5 = _ENV[K10('GM')]
  0023  GETTABLE  R5 = R5[K11('ResourceLoader')]
  0024  SELF      R6 = R5[K12('LoadCDNFile')] (self)
  0025  GETUPVAL  R7 = _ENV
  0026  CALL      R5 = call(R5, 1 args, 2 rets)
  0027  GETTABUP  R6 = _ENV[K13('StringUtil')]
  0028  GETTABLE  R6 = R6[K14('IsNilOrEmpty')]
  0029  MOVE      R7 = R0
  0030  CALL      R6 = call(R6, 1 args, 1 rets)
  0031  TEST      if not R6 then   -> -131038
  0032  JMP       (jump)   -> 47
  0033  GETTABLE  R6 = R0[K15('m_strCDNCatalogueMd5')]
  0034  GETTABUP  R7 = _ENV[K16('MD5')]
  0035  GETTABLE  R7 = R7[K17('Encode')]
  0036  MOVE      R8 = R0
  0037  CALL      R7 = call(R7, 1 args, 1 rets)
  0038  EQ        if R0 eq R7   -> -127953
  0039  JMP       (jump)   -> 47
  0040  SETTABLE  R0[K4('m_bCatalogueLoading')] = K18(false)
  0041  SELF      R7 = R0[K19('_ParseCatalogue')] (self)
  0042  MOVE      R8 = R0
  0043  MOVE      R9 = R0
  0044  MOVE      R10 = R0
  0045  CALL      R6 = call(R6, 0 args, 4 rets)
  0046  JMP       (jump)   -> 52
  0047  MOVE      R6 = R0
  0048  CALL      R6 = call(R6, 0 args, 0 rets)
  0049  JMP       (jump)   -> 52
  0050  MOVE      R5 = R0
  0051  CALL      R5 = call(R5, 0 args, 0 rets)
  0052  RETURN    return R0..R-1
  ; ---------- proto0 [m_bCatalogueLoading] ----------
    ; fn ?  line 134-148 np=4 va=0 ms=10 code=27 consts=7 upvals=6 protos=1
    ;   K[0]='m_bCatalogueLoading'
    ;   K[1]=false
    ;   K[2]='GetCdnPath'
    ;   K[3]='CDNWriter'
    ;   K[4]='WriteFileBytesAsync'
    ;   K[5]='_ParseCatalogue'
    ;   K[6]='m_funcDownloadAllCallback'
    ;   upvals: self, CatalogueFileKey, _ENV, DBColumnValue, bOnlyDownloadGameText, isLoading
    ;   locals: bSuccess(0-27), downloader(0-27), errorMsg(0-27), fileContent(0-27), strFilePath(6-18)
    0000  SETTABUP  self[K0('m_bCatalogueLoading')] = K1(false)
    0001  TEST      if not R0 then   -> -131069
    0002  JMP       (jump)   -> 19
    0003  GETTABUP  R4 = self[K2('GetCdnPath')]
    0004  GETUPVAL  R5 = self
    0005  CALL      R4 = call(R4, 1 args, 1 rets)
    0006  GETTABUP  R5 = _ENV[K3('CDNWriter')]
    0007  GETTABLE  R5 = R5[K4('WriteFileBytesAsync')]
    0008  MOVE      R6 = R0
    0009  MOVE      R7 = R0
    0010  CLOSURE   R8 = closure proto0
    0011  CALL      R5 = call(R5, 0 args, 3 rets)
    0012  GETUPVAL  R5 = self
    0013  SELF      R6 = R5[K5('_ParseCatalogue')] (self)
    0014  MOVE      R7 = R0
    0015  GETUPVAL  R8 = self
    0016  GETUPVAL  R9 = self
    0017  CALL      R5 = call(R5, 0 args, 4 rets)
    0018  JMP       (jump)   -> 26
    0019  GETTABUP  R4 = self[K6('m_funcDownloadAllCallback')]
    0020  TEST      if not R4 then   -> -131050
    0021  JMP       (jump)   -> 26
    0022  GETTABUP  R4 = self[K6('m_funcDownloadAllCallback')]
    0023  LOADBOOL  R5 = false
    0024  MOVE      R6 = R0
    0025  CALL      R4 = call(R4, 0 args, 2 rets)
    0026  RETURN    return R0..R-1
    ; ---------- proto0 [] ----------
      ; fn ?  line 138-142 np=1 va=0 ms=6 code=14 consts=6 upvals=4 protos=0
      ;   K[0]='m_dbTable'
      ;   K[1]='Set'
      ;   K[2]='ECDNDataKey'
      ;   K[3]='DownloadedFileVersion'
      ;   K[4]='GameConfig'
      ;   K[5]='GetCurrentVersion'
      ;   upvals: self, _ENV, CatalogueFileKey, DBColumnValue
      ;   locals: bSuccess(0-14)
      0000  TEST      if not R0 then   -> -131070
      0001  JMP       (jump)   -> 13
      0002  GETTABUP  R1 = self[K0('m_dbTable')]
      0003  SELF      R2 = R1[K1('Set')] (self)
      0004  GETTABUP  R3 = _ENV[K2('ECDNDataKey')]
      0005  GETTABLE  R3 = R3[K3('DownloadedFileVersion')]
      0006  GETUPVAL  R4 = self
      0007  CONCAT    R3 = concat(R3..R3)
      0008  GETUPVAL  R4 = self
      0009  GETTABUP  R5 = _ENV[K4('GameConfig')]
      0010  GETTABLE  R5 = R5[K5('GetCurrentVersion')]
      0011  CALL      R5 = call(R5, -1 args, 0 rets)
      0012  CALL      R1 = call(R1, 0 args, -1 rets)
      0013  RETURN    return R0..R-1
  ; ---------- proto1 [m_bCatalogueLoading] ----------
    ; fn ?  line 150-156 np=0 va=0 ms=5 code=19 consts=10 upvals=4 protos=0
    ;   K[0]='NetworkConfig'
    ;   K[1]='GetCdnFileUrl'
    ;   K[2]='m_strCDNCatalogue'
    ;   K[3]='CDNDownloader'
    ;   K[4]='Create'
    ;   K[5]='bIsLoading'
    ;   K[6]='StartDownload'
    ;   K[7]='Log'
    ;   K[8]='Info'
    ;   K[9]='CDNResourceManager Start Download Catalogue'
    ;   upvals: _ENV, self, funcDownloadCatalogueCallback, isLoading
    ;   locals: strUrl(4-19), downloader(10-19)
    0000  GETTABUP  R0 = _ENV[K0('NetworkConfig')]
    0001  GETTABLE  R0 = R0[K1('GetCdnFileUrl')]
    0002  GETTABUP  R1 = self[K2('m_strCDNCatalogue')]
    0003  CALL      R0 = call(R0, 1 args, 1 rets)
    0004  GETTABUP  R1 = _ENV[K3('CDNDownloader')]
    0005  GETTABLE  R1 = R1[K4('Create')]
    0006  MOVE      R2 = R0
    0007  LOADNIL   R3..R3 = nil
    0008  GETUPVAL  R4 = _ENV
    0009  CALL      R1 = call(R1, 1 args, 3 rets)
    0010  GETUPVAL  R2 = _ENV
    0011  SETTABLE  R1[K5('bIsLoading')] = R2
    0012  SELF      R3 = R1[K6('StartDownload')] (self)
    0013  CALL      R2 = call(R2, 0 args, 1 rets)
    0014  GETTABUP  R2 = _ENV[K7('Log')]
    0015  GETTABLE  R2 = R2[K8('Info')]
    0016  LOADK     R3 = K9 'CDNResourceManager Start Download Catalogue'
    0017  CALL      R2 = call(R2, 0 args, 1 rets)
    0018  RETURN    return R0..R-1
; ---------- proto7 [_ParseCatalogue] ----------
  ; fn ?  line 172-232 np=4 va=0 ms=20 code=139 consts=43 upvals=2 protos=1
  ;   K[0]='m_mapCDNCatalogue'
  ;   K[1]='json'
  ;   K[2]='decode'
  ;   K[3]='m_strLocalCatalogueMd5'
  ;   K[4]='m_strCDNCatalogueMd5'
  ;   K[5]='LocalizationModel'
  ;   K[6]='GetTextShortName'
  ;   K[7]='pairs'
  ;   K[8]=1
  ;   K[9]='ipairs'
  ;   K[10]='content'
  ;   K[11]='_CheckLegacyFileInvalid'
  ;   K[12]='hash'
  ;   K[13]='_IsGameTextFile'
  ;   K[14]='string'
  ;   K[15]='find'
  ;   K[16]=nil
  ;   K[17]='NetworkConfig'
  ;   K[18]='GetCdnFileUrl'
  ;   K[19]='GetCdnPath'
  ;   K[20]='CDNDownloader'
  ;   K[21]='Create'
  ;   K[22]='strFileKey'
  ;   K[23]='strFileMd5'
  ;   K[24]='strFileContent'
  ;   K[25]='bIsLoading'
  ;   K[26]='m_gameTextDownloader'
  ;   K[27]='table'
  ;   K[28]='insert'
  ;   K[29]='m_arrConfigDownloaders'
  ;   K[30]='m_arrPendingDownloaders'
  ;   K[31]='Log'
  ;   K[32]='Info'
  ;   K[33]='CDNResourceManager Start Download File '
  ;   K[34]='IsFileVersionValid'
  ;   K[35]='_SaveFileDownloadedInfo'
  ;   K[36]='GM'
  ;   K[37]='GameTextModel'
  ;   K[38]='LoadCdnText'
  ;   K[39]='_DownloadPendingFiles'
  ;   K[40]=0
  ;   K[41]='_OnAllFileDownloadFinished'
  ;   K[42]='_TryDeleteDownloadedFile'
  ;   upvals: _ENV, StrGameTextPrefix
  ;   locals: self(0-139), fileContent(0-139), bOnlyDownloadGameText(0-139), isLoading(0-139), funcDownloadCallback(11-139), strUrl(12-139), strSavePath(12-139), curTextShortName(15-139), curFileList(16-139), (for generator)(19-119), (for state)(19-119), (for control)(19-119), k(20-117), v(20-117), (for generator)(26-32), (for state)(26-32), (for control)(26-32), _(27-30), contentKey(27-30), downloader(68-97)
  0000  GETTABUP  R4 = _ENV[K1('json')]
  0001  GETTABLE  R4 = R4[K2('decode')]
  0002  MOVE      R5 = R0
  0003  CALL      R4 = call(R4, 1 args, 1 rets)
  0004  TEST      if not R4 then   -> -131065
  0005  JMP       (jump)   -> 7
  0006  NEWTABLE  R4 = {} (0 items)
  0007  SETTABLE  R0[K0('m_mapCDNCatalogue')] = R4
  0008  GETTABLE  R4 = R0[K4('m_strCDNCatalogueMd5')]
  0009  SETTABLE  R0[K3('m_strLocalCatalogueMd5')] = R4
  0010  CLOSURE   R4 = closure proto0
  0011  LOADNIL   R5..R5 = nil
  0012  GETTABUP  R7 = _ENV[K5('LocalizationModel')]
  0013  SELF      R8 = R7[K6('GetTextShortName')] (self)
  0014  CALL      R7 = call(R7, 1 args, 1 rets)
  0015  NEWTABLE  R8 = {} (0 items)
  0016  GETTABUP  R9 = _ENV[K7('pairs')]
  0017  GETTABLE  R10 = R0[K0('m_mapCDNCatalogue')]
  0018  CALL      R9 = call(R9, 3 args, 1 rets)
  0019  JMP       (jump)   -> 117
  0020  LEN       R14 = len R0
  0021  ADD       R14 = K8(1) add R14
  0022  SETTABLE  R8[R14] = R12
  0023  GETTABUP  R14 = _ENV[K9('ipairs')]
  0024  GETTABLE  R15 = R13[K10('content')]
  0025  CALL      R14 = call(R14, 3 args, 1 rets)
  0026  JMP       (jump)   -> 30
  0027  LEN       R19 = len R0
  0028  ADD       R19 = K8(1) add R19
  0029  SETTABLE  R8[R19] = R18
  0030  TFORCALL  tforcall R14
  0031  TFORLOOP  tforloop R16(sBx=-5)   -> 27
  0032  SELF      R15 = R0[K11('_CheckLegacyFileInvalid')] (self)
  0033  MOVE      R16 = R0
  0034  GETTABLE  R17 = R13[K12('hash')]
  0035  GETTABLE  R18 = R13[K10('content')]
  0036  CALL      R14 = call(R14, 1 args, 4 rets)
  0037  TEST      if not R14 then   -> -131033
  0038  JMP       (jump)   -> 98
  0039  SELF      R15 = R0[K13('_IsGameTextFile')] (self)
  0040  GETTABLE  R16 = R13[K10('content')]
  0041  CALL      R14 = call(R14, 1 args, 2 rets)
  0042  TEST      if not R14 then   -> -131027
  0043  JMP       (jump)   -> 53
  0044  TEST      if not R2 then   -> -131025
  0045  JMP       (jump)   -> 117
  0046  GETTABUP  R14 = _ENV[K14('string')]
  0047  GETTABLE  R14 = R14[K15('find')]
  0048  MOVE      R15 = R0
  0049  GETUPVAL  R16 = _ENV
  0050  CALL      R14 = call(R14, 1 args, 2 rets)
  0051  EQ        if R0 eq K16(nil)   -> -123579
  0052  JMP       (jump)   -> 117
  0053  GETTABUP  R14 = _ENV[K17('NetworkConfig')]
  0054  GETTABLE  R14 = R14[K18('GetCdnFileUrl')]
  0055  GETTABLE  R15 = R13[K12('hash')]
  0056  CALL      R14 = call(R14, 1 args, 1 rets)
  0057  MOVE      R5 = R0
  0058  GETTABLE  R14 = R0[K19('GetCdnPath')]
  0059  MOVE      R15 = R0
  0060  CALL      R14 = call(R14, 1 args, 1 rets)
  0061  MOVE      R6 = R0
  0062  GETTABUP  R14 = _ENV[K20('CDNDownloader')]
  0063  GETTABLE  R14 = R14[K21('Create')]
  0064  MOVE      R15 = R0
  0065  MOVE      R16 = R0
  0066  MOVE      R17 = R0
  0067  CALL      R14 = call(R14, 1 args, 3 rets)
  0068  SETTABLE  R14[K22('strFileKey')] = R12
  0069  GETTABLE  R15 = R13[K12('hash')]
  0070  SETTABLE  R14[K23('strFileMd5')] = R15
  0071  GETTABLE  R15 = R13[K10('content')]
  0072  SETTABLE  R14[K24('strFileContent')] = R15
  0073  SETTABLE  R14[K25('bIsLoading')] = R3
  0074  SELF      R16 = R0[K13('_IsGameTextFile')] (self)
  0075  GETTABLE  R17 = R13[K10('content')]
  0076  CALL      R15 = call(R15, 1 args, 2 rets)
  0077  TEST      if not R15 then   -> -130993
  0078  JMP       (jump)   -> 81
  0079  SETTABLE  R0[K26('m_gameTextDownloader')] = R14
  0080  JMP       (jump)   -> 91
  0081  GETTABUP  R15 = _ENV[K27('table')]
  0082  GETTABLE  R15 = R15[K28('insert')]
  0083  GETTABLE  R16 = R0[K29('m_arrConfigDownloaders')]
  0084  MOVE      R17 = R0
  0085  CALL      R15 = call(R15, 0 args, 2 rets)
  0086  GETTABUP  R15 = _ENV[K27('table')]
  0087  GETTABLE  R15 = R15[K28('insert')]
  0088  GETTABLE  R16 = R0[K30('m_arrPendingDownloaders')]
  0089  MOVE      R17 = R0
  0090  CALL      R15 = call(R15, 0 args, 2 rets)
  0091  GETTABUP  R15 = _ENV[K31('Log')]
  0092  GETTABLE  R15 = R15[K32('Info')]
  0093  LOADK     R16 = K33 'CDNResourceManager Start Download File '
  0094  MOVE      R17 = R0
  0095  CONCAT    R16 = concat(R16..R16)
  0096  CALL      R15 = call(R15, 0 args, 1 rets)
  0097  JMP       (jump)   -> 117
  0098  SELF      R15 = R0[K34('IsFileVersionValid')] (self)
  0099  MOVE      R16 = R0
  0100  CALL      R14 = call(R14, 1 args, 2 rets)
  0101  TEST      if not R14 then   -> -130968
  0102  JMP       (jump)   -> 117
  0103  SELF      R15 = R0[K35('_SaveFileDownloadedInfo')] (self)
  0104  MOVE      R16 = R0
  0105  GETTABLE  R17 = R13[K12('hash')]
  0106  GETTABLE  R18 = R13[K10('content')]
  0107  CALL      R14 = call(R14, 0 args, 4 rets)
  0108  SELF      R15 = R0[K13('_IsGameTextFile')] (self)
  0109  GETTABLE  R16 = R13[K10('content')]
  0110  CALL      R14 = call(R14, 1 args, 2 rets)
  0111  TEST      if not R14 then   -> -130959
  0112  JMP       (jump)   -> 117
  0113  GETTABUP  R14 = _ENV[K36('GM')]
  0114  GETTABLE  R14 = R14[K37('GameTextModel')]
  0115  SELF      R15 = R14[K38('LoadCdnText')] (self)
  0116  CALL      R14 = call(R14, 0 args, 1 rets)
  0117  TFORCALL  tforcall R9
  0118  TFORLOOP  tforloop R11(sBx=-99)   -> 20
  0119  GETTABLE  R9 = R0[K26('m_gameTextDownloader')]
  0120  EQ        if R1 eq K16(nil)   -> -126070
  0121  JMP       (jump)   -> 127
  0122  GETTABUP  R9 = _ENV[K27('table')]
  0123  GETTABLE  R9 = R9[K28('insert')]
  0124  GETTABLE  R10 = R0[K30('m_arrPendingDownloaders')]
  0125  GETTABLE  R11 = R0[K26('m_gameTextDownloader')]
  0126  CALL      R9 = call(R9, 0 args, 2 rets)
  0127  SELF      R10 = R0[K39('_DownloadPendingFiles')] (self)
  0128  CALL      R9 = call(R9, 0 args, 1 rets)
  0129  GETTABLE  R9 = R0[K29('m_arrConfigDownloaders')]
  0130  LEN       R9 = len R0
  0131  EQ        if R0 eq K40(0)   -> -126035
  0132  JMP       (jump)   -> 135
  0133  SELF      R10 = R0[K41('_OnAllFileDownloadFinished')] (self)
  0134  CALL      R9 = call(R9, 0 args, 1 rets)
  0135  SELF      R10 = R0[K42('_TryDeleteDownloadedFile')] (self)
  0136  MOVE      R11 = R0
  0137  CALL      R9 = call(R9, 0 args, 2 rets)
  0138  RETURN    return R0..R-1
  ; ---------- proto0 [] ----------
    ; fn ?  line 176-179 np=3 va=0 ms=8 code=10 consts=2 upvals=1 protos=0
    ;   K[0]='_OnFileDownloaded'
    ;   K[1]='_DownloadPendingFiles'
    ;   upvals: self
    ;   locals: bSuccess(0-10), downloader(0-10), errorMsg(0-10)
    0000  GETUPVAL  R3 = self
    0001  SELF      R4 = R3[K0('_OnFileDownloaded')] (self)
    0002  MOVE      R5 = R0
    0003  MOVE      R6 = R0
    0004  MOVE      R7 = R0
    0005  CALL      R3 = call(R3, 0 args, 4 rets)
    0006  GETUPVAL  R3 = self
    0007  SELF      R4 = R3[K1('_DownloadPendingFiles')] (self)
    0008  CALL      R3 = call(R3, 0 args, 1 rets)
    0009  RETURN    return R0..R-1
; ---------- proto8 [_IsGameTextFile] ----------
  ; fn ?  line 234-242 np=2 va=0 ms=10 code=19 consts=4 upvals=1 protos=0
  ;   K[0]='LocalizationModel'
  ;   K[1]='GetTextShortName'
  ;   K[2]='ipairs'
  ;   K[3]='GetFileNameByFileKey'
  ;   upvals: _ENV
  ;   locals: self(0-19), contentList(0-19), curTextShortName(3-19), (for generator)(6-16), (for state)(6-16), (for control)(6-16), _(7-14), contentKey(7-14)
  0000  GETTABUP  R2 = _ENV[K0('LocalizationModel')]
  0001  SELF      R3 = R2[K1('GetTextShortName')] (self)
  0002  CALL      R2 = call(R2, 1 args, 1 rets)
  0003  GETTABUP  R3 = _ENV[K2('ipairs')]
  0004  MOVE      R4 = R0
  0005  CALL      R3 = call(R3, 3 args, 1 rets)
  0006  JMP       (jump)   -> 14
  0007  GETTABLE  R8 = R0[K3('GetFileNameByFileKey')]
  0008  MOVE      R9 = R0
  0009  CALL      R8 = call(R8, 1 args, 1 rets)
  0010  EQ        if R0 eq R2   -> -126962
  0011  JMP       (jump)   -> 14
  0012  LOADBOOL  R8 = true
  0013  RETURN    return R8..R7
  0014  TFORCALL  tforcall R3
  0015  TFORLOOP  tforloop R5(sBx=-9)   -> 7
  0016  LOADBOOL  R3 = false
  0017  RETURN    return R3..R2
  0018  RETURN    return R0..R-1
; ---------- proto9 [_CheckLegacyFileInvalid] ----------
  ; fn ?  line 244-256 np=4 va=0 ms=13 code=38 consts=7 upvals=2 protos=0
  ;   K[0]='IsCacheFileExist'
  ;   K[1]='m_dbTable'
  ;   K[2]='GetValue'
  ;   K[3]='ECDNDataKey'
  ;   K[4]='DownloadedFileMd5'
  ;   K[5]='ipairs'
  ;   K[6]='_CheckLegacyFileInvalid'
  ;   upvals: _ENV, DBColumnValue
  ;   locals: self(0-38), fileKey(0-38), hash(0-38), contentList(0-38), (for generator)(24-35), (for state)(24-35), (for control)(24-35), _(25-33), contentKey(25-33)
  0000  GETTABLE  R4 = R0[K0('IsCacheFileExist')]
  0001  MOVE      R5 = R0
  0002  CALL      R4 = call(R4, 1 args, 1 rets)
  0003  TEST      if not R4 then   -> -131067
  0004  JMP       (jump)   -> 15
  0005  GETTABLE  R4 = R0[K1('m_dbTable')]
  0006  SELF      R5 = R4[K2('GetValue')] (self)
  0007  GETTABUP  R6 = _ENV[K3('ECDNDataKey')]
  0008  GETTABLE  R6 = R6[K4('DownloadedFileMd5')]
  0009  MOVE      R7 = R0
  0010  CONCAT    R6 = concat(R6..R6)
  0011  GETUPVAL  R7 = _ENV
  0012  CALL      R4 = call(R4, 1 args, 3 rets)
  0013  EQ        if R1 eq R4   -> -130029
  0014  JMP       (jump)   -> 17
  0015  LOADBOOL  R4 = true
  0016  RETURN    return R4..R3
  0017  TEST      if not R3 then   -> -131052
  0018  JMP       (jump)   -> 21
  0019  NEWTABLE  R4 = {} (0 items)
  0020  MOVE      R3 = R0
  0021  GETTABUP  R4 = _ENV[K5('ipairs')]
  0022  MOVE      R5 = R0
  0023  CALL      R4 = call(R4, 3 args, 1 rets)
  0024  JMP       (jump)   -> 33
  0025  SELF      R10 = R0[K6('_CheckLegacyFileInvalid')] (self)
  0026  MOVE      R11 = R0
  0027  MOVE      R12 = R0
  0028  CALL      R9 = call(R9, 1 args, 3 rets)
  0029  TEST      if not R9 then   -> -131041
  0030  JMP       (jump)   -> 33
  0031  LOADBOOL  R9 = true
  0032  RETURN    return R9..R8
  0033  TFORCALL  tforcall R4
  0034  TFORLOOP  tforloop R6(sBx=-10)   -> 25
  0035  LOADBOOL  R4 = false
  0036  RETURN    return R4..R3
  0037  RETURN    return R0..R-1
; ---------- proto10 [_DeleteDownloadedFileByIndex] ----------
  ; fn ?  line 258-288 np=2 va=0 ms=12 code=118 consts=34 upvals=3 protos=0
  ;   K[0]='m_arrDownloadedFile'
  ;   K[1]='table'
  ;   K[2]='remove'
  ;   K[3]='m_dbTable'
  ;   K[4]='Remove'
  ;   K[5]='ECDNDataKey'
  ;   K[6]='DownloadedFileMd5'
  ;   K[7]='DownloadedFileVersion'
  ;   K[8]='Set'
  ;   K[9]='DownloadedFileArr'
  ;   K[10]='json'
  ;   K[11]='encode'
  ;   K[12]='GetCdnPath'
  ;   K[13]='File'
  ;   K[14]='Exists'
  ;   K[15]='Delete'
  ;   K[16]='GetFileNameByFileKey'
  ;   K[17]='LocalizationModel'
  ;   K[18]='GetTextShortName'
  ;   K[19]='GM'
  ;   K[20]='GameTextModel'
  ;   K[21]='ReloadLocalText'
  ;   K[22]='GameConfig'
  ;   K[23]='IsTestMode'
  ;   K[24]='StringUtil'
  ;   K[25]='StartWith'
  ;   K[26]='Data/'
  ;   K[27]='EndWith'
  ;   K[28]='DataRaw'
  ;   K[29]='string'
  ;   K[30]='sub'
  ;   K[31]=5
  ;   K[32]='Replace'
  ;   K[33]=''
  ;   upvals: _ENV, DBColumnValue, BYTE_FILE_SUFFIX
  ;   locals: self(0-118), index(0-118), strFileKey(7-118), fullPath(39-118), fileName(52-118), extension(52-118), rawDataFileKey(87-117), rawDataPath(100-117)
  0000  GETTABLE  R2 = R0[K0('m_arrDownloadedFile')]
  0001  LEN       R2 = len R0
  0002  LT        if R0 lt R1   -> -130043
  0003  JMP       (jump)   -> 5
  0004  RETURN    return R0..R-1
  0005  GETTABLE  R2 = R0[K0('m_arrDownloadedFile')]
  0006  GETTABLE  R2 = R2[R1]
  0007  GETTABUP  R3 = _ENV[K1('table')]
  0008  GETTABLE  R3 = R3[K2('remove')]
  0009  GETTABLE  R4 = R0[K0('m_arrDownloadedFile')]
  0010  MOVE      R5 = R0
  0011  CALL      R3 = call(R3, 0 args, 2 rets)
  0012  GETTABLE  R3 = R0[K3('m_dbTable')]
  0013  SELF      R4 = R3[K4('Remove')] (self)
  0014  GETTABUP  R5 = _ENV[K5('ECDNDataKey')]
  0015  GETTABLE  R5 = R5[K6('DownloadedFileMd5')]
  0016  MOVE      R6 = R0
  0017  CONCAT    R5 = concat(R5..R5)
  0018  CALL      R3 = call(R3, 0 args, 2 rets)
  0019  GETTABLE  R3 = R0[K3('m_dbTable')]
  0020  SELF      R4 = R3[K4('Remove')] (self)
  0021  GETTABUP  R5 = _ENV[K5('ECDNDataKey')]
  0022  GETTABLE  R5 = R5[K7('DownloadedFileVersion')]
  0023  MOVE      R6 = R0
  0024  CONCAT    R5 = concat(R5..R5)
  0025  CALL      R3 = call(R3, 0 args, 2 rets)
  0026  GETTABLE  R3 = R0[K3('m_dbTable')]
  0027  SELF      R4 = R3[K8('Set')] (self)
  0028  GETTABUP  R5 = _ENV[K5('ECDNDataKey')]
  0029  GETTABLE  R5 = R5[K9('DownloadedFileArr')]
  0030  GETUPVAL  R6 = _ENV
  0031  GETTABUP  R7 = _ENV[K10('json')]
  0032  GETTABLE  R7 = R7[K11('encode')]
  0033  GETTABLE  R8 = R0[K0('m_arrDownloadedFile')]
  0034  CALL      R7 = call(R7, -1 args, 1 rets)
  0035  CALL      R3 = call(R3, 0 args, -1 rets)
  0036  GETTABLE  R3 = R0[K12('GetCdnPath')]
  0037  MOVE      R4 = R0
  0038  CALL      R3 = call(R3, 1 args, 1 rets)
  0039  GETTABUP  R4 = _ENV[K13('File')]
  0040  GETTABLE  R4 = R4[K14('Exists')]
  0041  MOVE      R5 = R0
  0042  CALL      R4 = call(R4, 1 args, 1 rets)
  0043  TEST      if not R4 then   -> -131027
  0044  JMP       (jump)   -> 49
  0045  GETTABUP  R4 = _ENV[K13('File')]
  0046  GETTABLE  R4 = R4[K15('Delete')]
  0047  MOVE      R5 = R0
  0048  CALL      R4 = call(R4, 0 args, 1 rets)
  0049  GETTABLE  R4 = R0[K16('GetFileNameByFileKey')]
  0050  MOVE      R5 = R0
  0051  CALL      R4 = call(R4, 2 args, 1 rets)
  0052  GETTABUP  R6 = _ENV[K17('LocalizationModel')]
  0053  SELF      R7 = R6[K18('GetTextShortName')] (self)
  0054  CALL      R6 = call(R6, 1 args, 1 rets)
  0055  EQ        if R0 eq R6   -> -128961
  0056  JMP       (jump)   -> 61
  0057  GETTABUP  R6 = _ENV[K19('GM')]
  0058  GETTABLE  R6 = R6[K20('GameTextModel')]
  0059  SELF      R7 = R6[K21('ReloadLocalText')] (self)
  0060  CALL      R6 = call(R6, 0 args, 1 rets)
  0061  GETTABUP  R6 = _ENV[K22('GameConfig')]
  0062  GETTABLE  R6 = R6[K23('IsTestMode')]
  0063  CALL      R6 = call(R6, 1 args, 0 rets)
  0064  TEST      if not R6 then   -> -131006
  0065  JMP       (jump)   -> 117
  0066  GETTABUP  R6 = _ENV[K24('StringUtil')]
  0067  GETTABLE  R6 = R6[K25('StartWith')]
  0068  MOVE      R7 = R0
  0069  LOADK     R8 = K26 'Data/'
  0070  CALL      R6 = call(R6, 1 args, 2 rets)
  0071  TEST      if not R6 then   -> -130999
  0072  JMP       (jump)   -> 117
  0073  GETTABUP  R6 = _ENV[K24('StringUtil')]
  0074  GETTABLE  R6 = R6[K27('EndWith')]
  0075  MOVE      R7 = R0
  0076  GETUPVAL  R8 = _ENV
  0077  CALL      R6 = call(R6, 1 args, 2 rets)
  0078  TEST      if not R6 then   -> -130992
  0079  JMP       (jump)   -> 117
  0080  LOADK     R6 = K28 'DataRaw'
  0081  GETTABUP  R7 = _ENV[K29('string')]
  0082  GETTABLE  R7 = R7[K30('sub')]
  0083  MOVE      R8 = R0
  0084  LOADK     R9 = K31 5
  0085  CALL      R7 = call(R7, 1 args, 2 rets)
  0086  CONCAT    R6 = concat(R6..R6)
  0087  GETTABUP  R7 = _ENV[K24('StringUtil')]
  0088  GETTABLE  R7 = R7[K32('Replace')]
  0089  MOVE      R8 = R0
  0090  GETUPVAL  R9 = _ENV
  0091  LOADK     R10 = K33 ''
  0092  CALL      R7 = call(R7, 1 args, 3 rets)
  0093  MOVE      R6 = R0
  0094  GETTABUP  R7 = _ENV[K24('StringUtil')]
  0095  GETTABLE  R7 = R7[K32('Replace')]
  0096  MOVE      R8 = R0
  0097  MOVE      R9 = R0
  0098  MOVE      R10 = R0
  0099  CALL      R7 = call(R7, 1 args, 3 rets)
  0100  GETTABUP  R8 = _ENV[K13('File')]
  0101  GETTABLE  R8 = R8[K14('Exists')]
  0102  MOVE      R9 = R0
  0103  CALL      R8 = call(R8, 1 args, 1 rets)
  0104  TEST      if not R8 then   -> -130966
  0105  JMP       (jump)   -> 110
  0106  GETTABUP  R8 = _ENV[K13('File')]
  0107  GETTABLE  R8 = R8[K15('Delete')]
  0108  MOVE      R9 = R0
  0109  CALL      R8 = call(R8, 0 args, 1 rets)
  0110  GETTABLE  R8 = R0[K3('m_dbTable')]
  0111  SELF      R9 = R8[K4('Remove')] (self)
  0112  GETTABUP  R10 = _ENV[K5('ECDNDataKey')]
  0113  GETTABLE  R10 = R10[K7('DownloadedFileVersion')]
  0114  MOVE      R11 = R0
  0115  CONCAT    R10 = concat(R10..R10)
  0116  CALL      R8 = call(R8, 0 args, 2 rets)
  0117  RETURN    return R0..R-1
; ---------- proto11 [_TryDeleteDownloadedFile] ----------
  ; fn ?  line 290-298 np=2 va=0 ms=10 code=20 consts=6 upvals=1 protos=0
  ;   K[0]='m_arrDownloadedFile'
  ;   K[1]=1
  ;   K[2]=-1
  ;   K[3]='Table'
  ;   K[4]='ListContain'
  ;   K[5]='_DeleteDownloadedFileByIndex'
  ;   upvals: _ENV
  ;   locals: self(0-20), curFileList(0-20), strFileKey(1-20), (for index)(5-19), (for limit)(5-19), (for step)(5-19), k(6-18)
  0000  LOADNIL   R2..R2 = nil
  0001  GETTABLE  R3 = R0[K0('m_arrDownloadedFile')]
  0002  LEN       R3 = len R0
  0003  LOADK     R4 = K1 1
  0004  LOADK     R5 = K2 -1
  0005  FORPREP   forprep R3(sBx=12)   -> 18
  0006  GETTABLE  R7 = R0[K0('m_arrDownloadedFile')]
  0007  GETTABLE  R2 = R7[R6]
  0008  GETTABUP  R7 = _ENV[K3('Table')]
  0009  GETTABLE  R7 = R7[K4('ListContain')]
  0010  MOVE      R8 = R0
  0011  MOVE      R9 = R0
  0012  CALL      R7 = call(R7, 1 args, 2 rets)
  0013  TEST      if not R7 then   -> -131056
  0014  JMP       (jump)   -> 18
  0015  SELF      R8 = R0[K5('_DeleteDownloadedFileByIndex')] (self)
  0016  MOVE      R9 = R0
  0017  CALL      R7 = call(R7, 0 args, 2 rets)
  0018  FORLOOP   forloop R3(sBx=-13)   -> 6
  0019  RETURN    return R0..R-1
; ---------- proto12 [_SaveFileDownloadedInfo] ----------
  ; fn ?  line 300-319 np=4 va=0 ms=14 code=88 consts=15 upvals=2 protos=0
  ;   K[0]='ECDNDataKey'
  ;   K[1]='DownloadedFileVersion'
  ;   K[2]='GameConfig'
  ;   K[3]='GetCurrentVersion'
  ;   K[4]='DownloadedFileMd5'
  ;   K[5]='Table'
  ;   K[6]='ListContain'
  ;   K[7]='m_arrDownloadedFile'
  ;   K[8]=1
  ;   K[9]='ipairs'
  ;   K[10]='DownloadedFileArr'
  ;   K[11]='json'
  ;   K[12]='encode'
  ;   K[13]='m_dbTable'
  ;   K[14]='BatchSet'
  ;   upvals: _ENV, DBColumnValue
  ;   locals: self(0-88), fileKey(0-88), hash(0-88), contentList(0-88), setValueTable(1-88), (for generator)(39-73), (for state)(39-73), (for control)(39-73), _(40-71), contentKey(40-71)
  0000  NEWTABLE  R4 = {} (0 items)
  0001  GETTABUP  R5 = _ENV[K0('ECDNDataKey')]
  0002  GETTABLE  R5 = R5[K1('DownloadedFileVersion')]
  0003  MOVE      R6 = R0
  0004  CONCAT    R5 = concat(R5..R5)
  0005  NEWTABLE  R6 = {} (0 items)
  0006  GETUPVAL  R7 = _ENV
  0007  GETTABUP  R8 = _ENV[K2('GameConfig')]
  0008  GETTABLE  R8 = R8[K3('GetCurrentVersion')]
  0009  CALL      R8 = call(R8, 1 args, 0 rets)
  0010  SETTABLE  R6[R7] = R8
  0011  SETTABLE  R4[R5] = R6
  0012  GETTABUP  R5 = _ENV[K0('ECDNDataKey')]
  0013  GETTABLE  R5 = R5[K4('DownloadedFileMd5')]
  0014  MOVE      R6 = R0
  0015  CONCAT    R5 = concat(R5..R5)
  0016  NEWTABLE  R6 = {} (0 items)
  0017  GETUPVAL  R7 = _ENV
  0018  SETTABLE  R6[R7] = R2
  0019  SETTABLE  R4[R5] = R6
  0020  GETTABUP  R5 = _ENV[K5('Table')]
  0021  GETTABLE  R5 = R5[K6('ListContain')]
  0022  GETTABLE  R6 = R0[K7('m_arrDownloadedFile')]
  0023  MOVE      R7 = R0
  0024  CALL      R5 = call(R5, 1 args, 2 rets)
  0025  TEST      if not R5 then   -> -131044
  0026  JMP       (jump)   -> 32
  0027  GETTABLE  R5 = R0[K7('m_arrDownloadedFile')]
  0028  GETTABLE  R6 = R0[K7('m_arrDownloadedFile')]
  0029  LEN       R6 = len R0
  0030  ADD       R6 = K8(1) add R6
  0031  SETTABLE  R5[R6] = R1
  0032  TEST      if not R3 then   -> -131037
  0033  JMP       (jump)   -> 36
  0034  NEWTABLE  R5 = {} (0 items)
  0035  MOVE      R3 = R0
  0036  GETTABUP  R5 = _ENV[K9('ipairs')]
  0037  MOVE      R6 = R0
  0038  CALL      R5 = call(R5, 3 args, 1 rets)
  0039  JMP       (jump)   -> 71
  0040  GETTABUP  R10 = _ENV[K0('ECDNDataKey')]
  0041  GETTABLE  R10 = R10[K1('DownloadedFileVersion')]
  0042  MOVE      R11 = R0
  0043  CONCAT    R10 = concat(R10..R10)
  0044  NEWTABLE  R11 = {} (0 items)
  0045  GETUPVAL  R12 = _ENV
  0046  GETTABUP  R13 = _ENV[K2('GameConfig')]
  0047  GETTABLE  R13 = R13[K3('GetCurrentVersion')]
  0048  CALL      R13 = call(R13, 1 args, 0 rets)
  0049  SETTABLE  R11[R12] = R13
  0050  SETTABLE  R4[R10] = R11
  0051  GETTABUP  R10 = _ENV[K0('ECDNDataKey')]
  0052  GETTABLE  R10 = R10[K4('DownloadedFileMd5')]
  0053  MOVE      R11 = R0
  0054  CONCAT    R10 = concat(R10..R10)
  0055  NEWTABLE  R11 = {} (0 items)
  0056  GETUPVAL  R12 = _ENV
  0057  SETTABLE  R11[R12] = R2
  0058  SETTABLE  R4[R10] = R11
  0059  GETTABUP  R10 = _ENV[K5('Table')]
  0060  GETTABLE  R10 = R10[K6('ListContain')]
  0061  GETTABLE  R11 = R0[K7('m_arrDownloadedFile')]
  0062  MOVE      R12 = R0
  0063  CALL      R10 = call(R10, 1 args, 2 rets)
  0064  TEST      if not R10 then   -> -131005
  0065  JMP       (jump)   -> 71
  0066  GETTABLE  R10 = R0[K7('m_arrDownloadedFile')]
  0067  GETTABLE  R11 = R0[K7('m_arrDownloadedFile')]
  0068  LEN       R11 = len R0
  0069  ADD       R11 = K8(1) add R11
  0070  SETTABLE  R10[R11] = R9
  0071  TFORCALL  tforcall R5
  0072  TFORLOOP  tforloop R7(sBx=-33)   -> 40
  0073  GETTABUP  R5 = _ENV[K0('ECDNDataKey')]
  0074  GETTABLE  R5 = R5[K10('DownloadedFileArr')]
  0075  NEWTABLE  R6 = {} (0 items)
  0076  GETUPVAL  R7 = _ENV
  0077  GETTABUP  R8 = _ENV[K11('json')]
  0078  GETTABLE  R8 = R8[K12('encode')]
  0079  GETTABLE  R9 = R0[K7('m_arrDownloadedFile')]
  0080  CALL      R8 = call(R8, 1 args, 1 rets)
  0081  SETTABLE  R6[R7] = R8
  0082  SETTABLE  R4[R5] = R6
  0083  GETTABLE  R5 = R0[K13('m_dbTable')]
  0084  SELF      R6 = R5[K14('BatchSet')] (self)
  0085  MOVE      R7 = R0
  0086  CALL      R5 = call(R5, 0 args, 2 rets)
  0087  RETURN    return R0..R-1
; ---------- proto13 [_OnFileDownloaded] ----------
  ; fn ?  line 321-379 np=4 va=0 ms=20 code=172 consts=55 upvals=3 protos=0
  ;   K[0]='_SaveFileDownloadedInfo'
  ;   K[1]='strFileKey'
  ;   K[2]='strFileMd5'
  ;   K[3]='strFileContent'
  ;   K[4]='ipairs'
  ;   K[5]='GameConfig'
  ;   K[6]='IsTestMode'
  ;   K[7]='StringUtil'
  ;   K[8]='StartWith'
  ;   K[9]='Data/'
  ;   K[10]='EndWith'
  ;   K[11]='DataRaw'
  ;   K[12]='string'
  ;   K[13]='sub'
  ;   K[14]=5
  ;   K[15]='Replace'
  ;   K[16]=''
  ;   K[17]='GetCdnPath'
  ;   K[18]='CS'
  ;   K[19]='System'
  ;   K[20]='IO'
  ;   K[21]='FileInfo'
  ;   K[22]='Directory'
  ;   K[23]='Exists'
  ;   K[24]='CreateDirectory'
  ;   K[25]='DirectoryName'
  ;   K[26]='io'
  ;   K[27]='open'
  ;   K[28]='rb'
  ;   K[29]='read'
  ;   K[30]='*all'
  ;   K[31]='close'
  ;   K[32]='Crypt'
  ;   K[33]='CryptFile'
  ;   K[34]='m_dbTable'
  ;   K[35]='Set'
  ;   K[36]='ECDNDataKey'
  ;   K[37]='DownloadedFileVersion'
  ;   K[38]='GetCurrentVersion'
  ;   K[39]='Table'
  ;   K[40]='ListContain'
  ;   K[41]='m_arrDownloadedFile'
  ;   K[42]='_DeleteDownloadedFileByIndex'
  ;   K[43]='m_gameTextDownloader'
  ;   K[44]='m_bForceDownload'
  ;   K[45]='m_bDownloadError'
  ;   K[46]=true
  ;   K[47]='m_errorMsg'
  ;   K[48]=','
  ;   K[49]='_OnGameTextDownloaded'
  ;   K[50]='m_arrConfigDownloaders'
  ;   K[51]='table'
  ;   K[52]='remove'
  ;   K[53]=0
  ;   K[54]='_OnAllFileDownloadFinished'
  ;   upvals: _ENV, BYTE_FILE_SUFFIX, DBColumnValue
  ;   locals: self(0-172), bSuccess(0-172), downloader(0-172), errorMsg(0-172), (for generator)(10-98), (for state)(10-98), (for control)(10-98), _(11-96), innerFile(11-96), rawDataFileKey(37-96), strSavePath(47-96), rawDataSavePath(53-96), fileInfo(59-96), file(72-96), content(75-96), index(104-144), (for generator)(112-126), (for state)(112-126), (for control)(112-126), _(113-124), contentKey(113-124), (for generator)(154-165), (for state)(154-165), (for control)(154-165), k(155-163), v(155-163)
  0000  TEST      if not R1 then   -> -131070
  0001  JMP       (jump)   -> 99
  0002  SELF      R5 = R0[K0('_SaveFileDownloadedInfo')] (self)
  0003  GETTABLE  R6 = R2[K1('strFileKey')]
  0004  GETTABLE  R7 = R2[K2('strFileMd5')]
  0005  GETTABLE  R8 = R2[K3('strFileContent')]
  0006  CALL      R4 = call(R4, 0 args, 4 rets)
  0007  GETTABUP  R4 = _ENV[K4('ipairs')]
  0008  GETTABLE  R5 = R2[K3('strFileContent')]
  0009  CALL      R4 = call(R4, 3 args, 1 rets)
  0010  JMP       (jump)   -> 96
  0011  GETTABUP  R9 = _ENV[K5('GameConfig')]
  0012  GETTABLE  R9 = R9[K6('IsTestMode')]
  0013  CALL      R9 = call(R9, 1 args, 0 rets)
  0014  TEST      if not R9 then   -> -131056
  0015  JMP       (jump)   -> 96
  0016  GETTABUP  R9 = _ENV[K7('StringUtil')]
  0017  GETTABLE  R9 = R9[K8('StartWith')]
  0018  MOVE      R10 = R0
  0019  LOADK     R11 = K9 'Data/'
  0020  CALL      R9 = call(R9, 1 args, 2 rets)
  0021  TEST      if not R9 then   -> -131049
  0022  JMP       (jump)   -> 96
  0023  GETTABUP  R9 = _ENV[K7('StringUtil')]
  0024  GETTABLE  R9 = R9[K10('EndWith')]
  0025  MOVE      R10 = R0
  0026  GETUPVAL  R11 = _ENV
  0027  CALL      R9 = call(R9, 1 args, 2 rets)
  0028  TEST      if not R9 then   -> -131042
  0029  JMP       (jump)   -> 96
  0030  LOADK     R9 = K11 'DataRaw'
  0031  GETTABUP  R10 = _ENV[K12('string')]
  0032  GETTABLE  R10 = R10[K13('sub')]
  0033  MOVE      R11 = R0
  0034  LOADK     R12 = K14 5
  0035  CALL      R10 = call(R10, 1 args, 2 rets)
  0036  CONCAT    R9 = concat(R9..R9)
  0037  GETTABUP  R10 = _ENV[K7('StringUtil')]
  0038  GETTABLE  R10 = R10[K15('Replace')]
  0039  MOVE      R11 = R0
  0040  GETUPVAL  R12 = _ENV
  0041  LOADK     R13 = K16 ''
  0042  CALL      R10 = call(R10, 1 args, 3 rets)
  0043  MOVE      R9 = R0
  0044  GETTABLE  R10 = R0[K17('GetCdnPath')]
  0045  MOVE      R11 = R0
  0046  CALL      R10 = call(R10, 1 args, 1 rets)
  0047  GETTABUP  R11 = _ENV[K7('StringUtil')]
  0048  GETTABLE  R11 = R11[K15('Replace')]
  0049  MOVE      R12 = R0
  0050  MOVE      R13 = R0
  0051  MOVE      R14 = R0
  0052  CALL      R11 = call(R11, 1 args, 3 rets)
  0053  GETTABUP  R12 = _ENV[K18('CS')]
  0054  GETTABLE  R12 = R12[K19('System')]
  0055  GETTABLE  R12 = R12[K20('IO')]
  0056  GETTABLE  R12 = R12[K21('FileInfo')]
  0057  MOVE      R13 = R0
  0058  CALL      R12 = call(R12, 1 args, 1 rets)
  0059  GETTABLE  R13 = R12[K22('Directory')]
  0060  GETTABLE  R13 = R13[K23('Exists')]
  0061  TEST      if not R13 then   -> -131008
  0062  JMP       (jump)   -> 67
  0063  GETTABUP  R13 = _ENV[K22('Directory')]
  0064  GETTABLE  R13 = R13[K24('CreateDirectory')]
  0065  GETTABLE  R14 = R12[K25('DirectoryName')]
  0066  CALL      R13 = call(R13, 0 args, 1 rets)
  0067  GETTABUP  R13 = _ENV[K26('io')]
  0068  GETTABLE  R13 = R13[K27('open')]
  0069  MOVE      R14 = R0
  0070  LOADK     R15 = K28 'rb'
  0071  CALL      R13 = call(R13, 1 args, 2 rets)
  0072  SELF      R15 = R13[K29('read')] (self)
  0073  LOADK     R16 = K30 '*all'
  0074  CALL      R14 = call(R14, 1 args, 2 rets)
  0075  SELF      R16 = R13[K31('close')] (self)
  0076  CALL      R15 = call(R15, 0 args, 1 rets)
  0077  TEST      if not R14 then   -> -130993
  0078  JMP       (jump)   -> 96
  0079  GETTABUP  R15 = _ENV[K18('CS')]
  0080  GETTABLE  R15 = R15[K32('Crypt')]
  0081  GETTABLE  R15 = R15[K33('CryptFile')]
  0082  MOVE      R16 = R0
  0083  MOVE      R17 = R0
  0084  CALL      R15 = call(R15, 0 args, 2 rets)
  0085  GETTABLE  R15 = R0[K34('m_dbTable')]
  0086  SELF      R16 = R15[K35('Set')] (self)
  0087  GETTABUP  R17 = _ENV[K36('ECDNDataKey')]
  0088  GETTABLE  R17 = R17[K37('DownloadedFileVersion')]
  0089  MOVE      R18 = R0
  0090  CONCAT    R17 = concat(R17..R17)
  0091  GETUPVAL  R18 = _ENV
  0092  GETTABUP  R19 = _ENV[K5('GameConfig')]
  0093  GETTABLE  R19 = R19[K38('GetCurrentVersion')]
  0094  CALL      R19 = call(R19, -1 args, 0 rets)
  0095  CALL      R15 = call(R15, 0 args, -1 rets)
  0096  TFORCALL  tforcall R4
  0097  TFORLOOP  tforloop R6(sBx=-87)   -> 11
  0098  JMP       (jump)   -> 144
  0099  GETTABUP  R4 = _ENV[K39('Table')]
  0100  GETTABLE  R4 = R4[K40('ListContain')]
  0101  GETTABLE  R5 = R0[K41('m_arrDownloadedFile')]
  0102  GETTABLE  R6 = R2[K1('strFileKey')]
  0103  CALL      R4 = call(R4, 1 args, 2 rets)
  0104  TEST      if not R4 then   -> -130966
  0105  JMP       (jump)   -> 109
  0106  SELF      R6 = R0[K42('_DeleteDownloadedFileByIndex')] (self)
  0107  MOVE      R7 = R0
  0108  CALL      R5 = call(R5, 0 args, 2 rets)
  0109  GETTABUP  R5 = _ENV[K4('ipairs')]
  0110  GETTABLE  R6 = R2[K3('strFileContent')]
  0111  CALL      R5 = call(R5, 3 args, 1 rets)
  0112  JMP       (jump)   -> 124
  0113  GETTABUP  R10 = _ENV[K39('Table')]
  0114  GETTABLE  R10 = R10[K40('ListContain')]
  0115  GETTABLE  R11 = R0[K41('m_arrDownloadedFile')]
  0116  MOVE      R12 = R0
  0117  CALL      R10 = call(R10, 1 args, 2 rets)
  0118  MOVE      R4 = R0
  0119  TEST      if not R4 then   -> -130951
  0120  JMP       (jump)   -> 124
  0121  SELF      R11 = R0[K42('_DeleteDownloadedFileByIndex')] (self)
  0122  MOVE      R12 = R0
  0123  CALL      R10 = call(R10, 0 args, 2 rets)
  0124  TFORCALL  tforcall R5
  0125  TFORLOOP  tforloop R7(sBx=-13)   -> 113
  0126  GETTABLE  R5 = R0[K43('m_gameTextDownloader')]
  0127  EQ        if R0 eq R5   -> -129914
  0128  JMP       (jump)   -> 132
  0129  GETTABLE  R5 = R0[K44('m_bForceDownload')]
  0130  TEST      if not R5 then   -> -130940
  0131  JMP       (jump)   -> 144
  0132  SETTABLE  R0[K45('m_bDownloadError')] = K46(true)
  0133  GETTABLE  R5 = R0[K47('m_errorMsg')]
  0134  TEST      if not R5 then   -> -130936
  0135  JMP       (jump)   -> 142
  0136  GETTABLE  R5 = R0[K47('m_errorMsg')]
  0137  LOADK     R6 = K48 ','
  0138  MOVE      R7 = R0
  0139  CONCAT    R5 = concat(R5..R5)
  0140  TEST      if not R5 then   -> -130929
  0141  JMP       (jump)   -> 143
  0142  MOVE      R5 = R0
  0143  SETTABLE  R0[K47('m_errorMsg')] = R5
  0144  GETTABLE  R4 = R0[K43('m_gameTextDownloader')]
  0145  EQ        if R0 eq R4   -> -129897
  0146  JMP       (jump)   -> 151
  0147  SELF      R5 = R0[K49('_OnGameTextDownloaded')] (self)
  0148  MOVE      R6 = R0
  0149  CALL      R4 = call(R4, 0 args, 2 rets)
  0150  JMP       (jump)   -> 171
  0151  GETTABUP  R4 = _ENV[K4('ipairs')]
  0152  GETTABLE  R5 = R0[K50('m_arrConfigDownloaders')]
  0153  CALL      R4 = call(R4, 3 args, 1 rets)
  0154  JMP       (jump)   -> 163
  0155  EQ        if R0 eq R2   -> -126817
  0156  JMP       (jump)   -> 163
  0157  GETTABUP  R9 = _ENV[K51('table')]
  0158  GETTABLE  R9 = R9[K52('remove')]
  0159  GETTABLE  R10 = R0[K50('m_arrConfigDownloaders')]
  0160  MOVE      R11 = R0
  0161  CALL      R9 = call(R9, 0 args, 2 rets)
  0162  JMP       (jump)   -> 165
  0163  TFORCALL  tforcall R4
  0164  TFORLOOP  tforloop R6(sBx=-10)   -> 155
  0165  GETTABLE  R4 = R0[K50('m_arrConfigDownloaders')]
  0166  LEN       R4 = len R0
  0167  EQ        if R0 eq K53(0)   -> -128546
  0168  JMP       (jump)   -> 171
  0169  SELF      R5 = R0[K54('_OnAllFileDownloadFinished')] (self)
  0170  CALL      R4 = call(R4, 0 args, 1 rets)
  0171  RETURN    return R0..R-1
; ---------- proto14 [_CanCallDownloadAllCallback] ----------
  ; fn ?  line 381-387 np=1 va=0 ms=2 code=22 consts=5 upvals=0 protos=0
  ;   K[0]='m_bForceDownload'
  ;   K[1]='m_arrConfigDownloaders'
  ;   K[2]=0
  ;   K[3]='m_gameTextDownloader'
  ;   K[4]=nil
  ;   locals: self(0-22)
  0000  GETTABLE  R1 = R0[K0('m_bForceDownload')]
  0001  TEST      if not R1 then   -> -131069
  0002  JMP       (jump)   -> 14
  0003  GETTABLE  R1 = R0[K1('m_arrConfigDownloaders')]
  0004  LEN       R1 = len R0
  0005  EQ        if R0 eq K2(0)   -> -130295
  0006  JMP       (jump)   -> 10
  0007  GETTABLE  R1 = R0[K3('m_gameTextDownloader')]
  0008  EQ        if R1 eq K4(nil)   -> -130290
  0009  JMP       (jump)   -> 11
  0010  LOADBOOL  R1 = false
  0011  LOADBOOL  R1 = true
  0012  RETURN    return R1..R0
  0013  JMP       (jump)   -> 21
  0014  GETTABLE  R1 = R0[K1('m_arrConfigDownloaders')]
  0015  LEN       R1 = len R0
  0016  EQ        if R1 eq K2(0)   -> -130284
  0017  JMP       (jump)   -> 19
  0018  LOADBOOL  R1 = false
  0019  LOADBOOL  R1 = true
  0020  RETURN    return R1..R0
  0021  RETURN    return R0..R-1
; ---------- proto15 [_OnGameTextDownloaded] ----------
  ; fn ?  line 389-398 np=2 va=0 ms=4 code=15 consts=7 upvals=1 protos=0
  ;   K[0]='m_gameTextDownloader'
  ;   K[1]=nil
  ;   K[2]='GM'
  ;   K[3]='GameTextModel'
  ;   K[4]='LoadCdnText'
  ;   K[5]='m_bForceDownload'
  ;   K[6]='_OnAllFileDownloadFinished'
  ;   upvals: _ENV
  ;   locals: self(0-15), bSuccess(0-15)
  0000  TEST      if not R1 then   -> -131070
  0001  JMP       (jump)   -> 8
  0002  SETTABLE  R0[K0('m_gameTextDownloader')] = K1(nil)
  0003  GETTABUP  R2 = _ENV[K2('GM')]
  0004  GETTABLE  R2 = R2[K3('GameTextModel')]
  0005  SELF      R3 = R2[K4('LoadCdnText')] (self)
  0006  CALL      R2 = call(R2, 0 args, 1 rets)
  0007  JMP       (jump)   -> 12
  0008  GETTABLE  R2 = R0[K5('m_bForceDownload')]
  0009  TEST      if not R2 then   -> -131061
  0010  JMP       (jump)   -> 12
  0011  SETTABLE  R0[K0('m_gameTextDownloader')] = K1(nil)
  0012  SELF      R3 = R0[K6('_OnAllFileDownloadFinished')] (self)
  0013  CALL      R2 = call(R2, 0 args, 1 rets)
  0014  RETURN    return R0..R-1
; ---------- proto16 [_OnAllFileDownloadFinished] ----------
  ; fn ?  line 400-404 np=1 va=0 ms=4 code=13 consts=5 upvals=0 protos=0
  ;   K[0]='_CanCallDownloadAllCallback'
  ;   K[1]='m_funcDownloadAllCallback'
  ;   K[2]=nil
  ;   K[3]='m_bDownloadError'
  ;   K[4]='m_errorMsg'
  ;   locals: self(0-13)
  0000  SELF      R2 = R0[K0('_CanCallDownloadAllCallback')] (self)
  0001  CALL      R1 = call(R1, 1 args, 1 rets)
  0002  TEST      if not R1 then   -> -131068
  0003  JMP       (jump)   -> 12
  0004  GETTABLE  R1 = R0[K1('m_funcDownloadAllCallback')]
  0005  EQ        if R1 eq K2(nil)   -> -130295
  0006  JMP       (jump)   -> 12
  0007  GETTABLE  R1 = R0[K1('m_funcDownloadAllCallback')]
  0008  GETTABLE  R2 = R0[K3('m_bDownloadError')]
  0009  NOT       R2 = not R0
  0010  GETTABLE  R3 = R0[K4('m_errorMsg')]
  0011  CALL      R1 = call(R1, 0 args, 2 rets)
  0012  RETURN    return R0..R-1
; ---------- proto17 [IsDownloadingDownloader] ----------
  ; fn ?  line 406-418 np=2 va=0 ms=8 code=18 consts=3 upvals=1 protos=0
  ;   K[0]='m_gameTextDownloader'
  ;   K[1]='ipairs'
  ;   K[2]='m_arrConfigDownloaders'
  ;   upvals: _ENV
  ;   locals: self(0-18), downloader(0-18), (for generator)(8-15), (for state)(8-15), (for control)(8-15), _(9-13), v(9-13)
  0000  GETTABLE  R2 = R0[K0('m_gameTextDownloader')]
  0001  EQ        if R0 eq R1   -> -130044
  0002  JMP       (jump)   -> 5
  0003  LOADBOOL  R2 = true
  0004  RETURN    return R2..R1
  0005  GETTABUP  R2 = _ENV[K1('ipairs')]
  0006  GETTABLE  R3 = R0[K2('m_arrConfigDownloaders')]
  0007  CALL      R2 = call(R2, 3 args, 1 rets)
  0008  JMP       (jump)   -> 13
  0009  EQ        if R0 eq R1   -> -127988
  0010  JMP       (jump)   -> 13
  0011  LOADBOOL  R7 = true
  0012  RETURN    return R7..R6
  0013  TFORCALL  tforcall R2
  0014  TFORLOOP  tforloop R4(sBx=-6)   -> 9
  0015  LOADBOOL  R2 = false
  0016  RETURN    return R2..R1
  0017  RETURN    return R0..R-1
; ---------- proto18 [GetFileNameByFileKey] ----------
  ; fn ?  line 420-426 np=1 va=0 ms=7 code=40 consts=10 upvals=1 protos=0
  ;   K[0]='string'
  ;   K[1]='sub'
  ;   K[2]='StringUtil'
  ;   K[3]='rFindChar'
  ;   K[4]='/'
  ;   K[5]=0
  ;   K[6]=1
  ;   K[7]='find'
  ;   K[8]='%.'
  ;   K[9]='len'
  ;   upvals: _ENV
  ;   locals: strFileKey(0-40), strFileName(13-40), dotIndex(25-40), shortName(31-40), extension(36-40)
  0000  GETTABUP  R1 = _ENV[K0('string')]
  0001  GETTABLE  R1 = R1[K1('sub')]
  0002  MOVE      R2 = R0
  0003  GETTABUP  R3 = _ENV[K2('StringUtil')]
  0004  GETTABLE  R3 = R3[K3('rFindChar')]
  0005  MOVE      R4 = R0
  0006  LOADK     R5 = K4 '/'
  0007  CALL      R3 = call(R3, 1 args, 2 rets)
  0008  TEST      if not R3 then   -> -131061
  0009  JMP       (jump)   -> 11
  0010  LOADK     R3 = K5 0
  0011  ADD       R3 = K6(1) add R3
  0012  CALL      R1 = call(R1, 1 args, 2 rets)
  0013  GETTABUP  R2 = _ENV[K0('string')]
  0014  GETTABLE  R2 = R2[K7('find')]
  0015  MOVE      R3 = R0
  0016  LOADK     R4 = K8 '%.'
  0017  CALL      R2 = call(R2, 1 args, 2 rets)
  0018  TEST      if not R2 then   -> -131051
  0019  JMP       (jump)   -> 25
  0020  GETTABUP  R2 = _ENV[K0('string')]
  0021  GETTABLE  R2 = R2[K9('len')]
  0022  MOVE      R3 = R0
  0023  CALL      R2 = call(R2, 1 args, 1 rets)
  0024  ADD       R2 = K6(1) add R2
  0025  GETTABUP  R3 = _ENV[K0('string')]
  0026  GETTABLE  R3 = R3[K1('sub')]
  0027  MOVE      R4 = R0
  0028  LOADK     R5 = K6 1
  0029  SUB       R6 = K6(1) sub R2
  0030  CALL      R3 = call(R3, 1 args, 3 rets)
  0031  GETTABUP  R4 = _ENV[K0('string')]
  0032  GETTABLE  R4 = R4[K1('sub')]
  0033  MOVE      R5 = R0
  0034  ADD       R6 = K6(1) add R2
  0035  CALL      R4 = call(R4, 1 args, 2 rets)
  0036  MOVE      R5 = R0
  0037  MOVE      R6 = R0
  0038  RETURN    return R5..R4
  0039  RETURN    return R0..R-1
; ---------- proto19 [GetCdnPath] ----------
  ; fn ?  line 428-430 np=1 va=0 ms=4 code=8 consts=4 upvals=1 protos=0
  ;   K[0]='Path'
  ;   K[1]='Combine'
  ;   K[2]='FileUtils'
  ;   K[3]='CdnPath'
  ;   upvals: _ENV
  ;   locals: fileKey(0-8)
  0000  GETTABUP  R1 = _ENV[K0('Path')]
  0001  GETTABLE  R1 = R1[K1('Combine')]
  0002  GETTABUP  R2 = _ENV[K2('FileUtils')]
  0003  GETTABLE  R2 = R2[K3('CdnPath')]
  0004  MOVE      R3 = R0
  0005  TAILCALL  tailcall(R1, 0)
  0006  RETURN    return R1..R0
  0007  RETURN    return R0..R-1
; ---------- proto20 [IsCacheFileExist] ----------
  ; fn ?  line 432-438 np=1 va=0 ms=4 code=15 consts=4 upvals=1 protos=0
  ;   K[0]='CDNResourceManager'
  ;   K[1]='GetCdnPath'
  ;   K[2]='File'
  ;   K[3]='Exists'
  ;   upvals: _ENV
  ;   locals: fileKey(0-15), fullPath(4-15)
  0000  GETTABUP  R1 = _ENV[K0('CDNResourceManager')]
  0001  GETTABLE  R1 = R1[K1('GetCdnPath')]
  0002  MOVE      R2 = R0
  0003  CALL      R1 = call(R1, 1 args, 1 rets)
  0004  GETTABUP  R2 = _ENV[K2('File')]
  0005  GETTABLE  R2 = R2[K3('Exists')]
  0006  MOVE      R3 = R0
  0007  CALL      R2 = call(R2, 1 args, 1 rets)
  0008  TEST      if not R2 then   -> -131062
  0009  JMP       (jump)   -> 12
  0010  LOADBOOL  R2 = true
  0011  RETURN    return R2..R1
  0012  LOADBOOL  R2 = false
  0013  RETURN    return R2..R1
  0014  RETURN    return R0..R-1
; ---------- proto21 [IsFileVersionValid] ----------
  ; fn ?  line 440-442 np=2 va=0 ms=6 code=17 consts=6 upvals=2 protos=0
  ;   K[0]='m_dbTable'
  ;   K[1]='GetValue'
  ;   K[2]='ECDNDataKey'
  ;   K[3]='DownloadedFileVersion'
  ;   K[4]='GameConfig'
  ;   K[5]='GetCurrentVersion'
  ;   upvals: _ENV, DBColumnValue
  ;   locals: self(0-17), strFileKey(0-17)
  0000  GETTABLE  R2 = R0[K0('m_dbTable')]
  0001  SELF      R3 = R2[K1('GetValue')] (self)
  0002  GETTABUP  R4 = _ENV[K2('ECDNDataKey')]
  0003  GETTABLE  R4 = R4[K3('DownloadedFileVersion')]
  0004  MOVE      R5 = R0
  0005  CONCAT    R4 = concat(R4..R4)
  0006  GETUPVAL  R5 = _ENV
  0007  CALL      R2 = call(R2, 1 args, 3 rets)
  0008  GETTABUP  R3 = _ENV[K4('GameConfig')]
  0009  GETTABLE  R3 = R3[K5('GetCurrentVersion')]
  0010  CALL      R3 = call(R3, 1 args, 0 rets)
  0011  EQ        if R1 eq R3   -> -130032
  0012  JMP       (jump)   -> 14
  0013  LOADBOOL  R2 = false
  0014  LOADBOOL  R2 = true
  0015  RETURN    return R2..R1
  0016  RETURN    return R0..R-1
; ---------- proto22 [_DownloadPendingFiles] ----------
  ; fn ?  line 444-450 np=1 va=0 ms=5 code=14 consts=6 upvals=1 protos=0
  ;   K[0]='m_arrPendingDownloaders'
  ;   K[1]=0
  ;   K[2]=1
  ;   K[3]='table'
  ;   K[4]='remove'
  ;   K[5]='StartDownload'
  ;   upvals: _ENV
  ;   locals: self(0-14), downloader(6-13)
  0000  GETTABLE  R1 = R0[K0('m_arrPendingDownloaders')]
  0001  LEN       R1 = len R0
  0002  LT        if R0 lt R1   -> 517
  0003  JMP       (jump)   -> 13
  0004  GETTABLE  R1 = R0[K0('m_arrPendingDownloaders')]
  0005  GETTABLE  R1 = R1[K2(1)]
  0006  GETTABUP  R2 = _ENV[K3('table')]
  0007  GETTABLE  R2 = R2[K4('remove')]
  0008  GETTABLE  R3 = R0[K0('m_arrPendingDownloaders')]
  0009  LOADK     R4 = K2 1
  0010  CALL      R2 = call(R2, 0 args, 2 rets)
  0011  SELF      R3 = R1[K5('StartDownload')] (self)
  0012  CALL      R2 = call(R2, 0 args, 1 rets)
  0013  RETURN    return R0..R-1
