ENGLISH

なぜ、JavaScript を難読化する必要があるのか?

難読化せずに JavaScript ファイルを提供するということは、ファイル内のコードが誰でも読み取れることを意味します。したがって、その人が JavaScript を理解していれば、ソースコードは全て公開されていることになります。
JavaScript がサーバー通信の機能を保持しておらず、第三者がページの HTML、リソース(JavaScript および CSS)をダウンロードするだけで、同じ結果をローカルで取得できます。そして、コードも読み取り可能である場合、知的財産を盗み、自由に変更することができます。

*目次*

  1. JavaScript の例について考えてみます
  2. JavaScript を難読化するメリット
  3. JavaScript を難読化するデメリット
  4. JavaScript を難読化する必要がありますか?
  5. JavaScript を難読化する方法は?
 

1. JavaScript の例について考えてみます

下記のコードは、JavaScript を理解している人なら誰でも簡単に読むことができる例のひとつです。メソッドの最初の引数として、true または false を指定することにより、計算ロジックに使われる値が変更されることが分かります。

 
demo.js
// 入力してください。
console.log(`The answer is: ${theAnswer(true)}`);
function theAnswer(theReal) {
  let answer = 0;
  for (let i = theReal ? 1 : 2 ; i <= 9; i++ ) {
    if (i >= 3) {
      debugger;
    }
    answer += i;

  }
 

次に、弊社が提供している JSDefender(※)を使って、上記のコード(demo.js)を難読化してみます。

 

(※)JSDefender は、JavaScript 用の難読化ツールです。複数のコード変換およびインジェクション技術を用い、リバース エンジニアリングや改ざんなどの攻撃から JavaScriptを保護します。

 
demo_obfuscation.js
// Job ID: 8y8d46mi879m
let GhLt;!function(){const ovMF=Array.prototype.slice.call(arguments);return eval("(function Im8w(rCfp){const T9hp=DJmn(rCfp,rEMp(Im8w.toString()));try{let TbPp=eval(T9hp);return TbPp.apply(null,ovMF);}catch(vJRp){var P6Jp=(0o204444-67850);while(P6Jp<(0o400126%65562))switch(P6Jp){case (0x30065%0o200031):P6Jp=vJRp instanceof SyntaxError?(0o400076%0x10019):(0o400130%0x1001B);break;case (0o200550-0x1015C):P6Jp=(0o400144%65569);{console.log(\'Error: the code has been tampered!\');return}break;}throw vJRp;}function rEMp(L1Ep){let nzHp=974322232;var HWzp=(73639709%9);{let juCp;while(HWzp<(0o1000271%0x10025)){switch(HWzp){case (0o201034-66049):HWzp=(0o202676-0x105A9);{nzHp^=(L1Ep.charCodeAt(juCp)*(15658734^0O73567354)+L1Ep.charCodeAt(juCp>>>(0x4A5D0CE&0O320423424)))^870961655;}break;case (0x40055%0o200020):HWzp=(0x40074%0o200027);juCp++;break;case (0o204160-67672):HWzp=juCp<L1Ep.length?(0o1000247%65571):(0o400155%0x10024);break;case (73639709%9):HWzp=(0o600140%65560);juCp=(0x75bcd15-0O726746425);break;}}}let LTwn=\"\";var nrzn=(0o201510-0x1033C);{let HOrn;while(nrzn<(0x103FC-0o201732)){switch(nrzn){case (131132%0o200030):nrzn=(66966-0o202613);HOrn=(0x21786%3);break;case (0x40047%0o200017):nrzn=HOrn<(0O347010110&0x463A71D)?(0o400061%0x10008):(0x107F8-0o203726);break;case (0x20049%0o200024):nrzn=(67936-0o204514);{const jmun=nzHp%(0o203674-0x107A6);nzHp=Math.floor(nzHp/(0x10604-0o202756));LTwn+=jmun>=(0o600150%65562)?String.fromCharCode((0o1000441%0x10038)+(jmun-(0o204040-0x10806))):String.fromCharCode((0o215206-72229)+jmun);}break;case (0o201130-0x10244):nrzn=(196643%0o200010);HOrn++;break;}}}return LTwn;}function DJmn(fhpn,zEhn){fhpn=decodeURI(fhpn);let bckn=(0x21786%3);let beRn=\"\";var DLTn=(0O347010110&0x463A71D);{let X8Ln;while(DLTn<(0x108AC-0o204207)){switch(DLTn){case (0o206250-0x10C8D):DLTn=(0o205252-0x10A95);{beRn+=String.fromCharCode(fhpn.charCodeAt(X8Ln)^zEhn.charCodeAt(bckn));bckn++;var zGOn=(0x10780-0o203560);while(zGOn<(0o200606-0x1015F))switch(zGOn){case (0o200500-65840):zGOn=bckn>=zEhn.length?(0o203244-0x10682):(0x300A2%0o200051);break;case (0o400144%65569):zGOn=(68266-0o205203);{bckn=(0x21786%3);}break;}}break;case (262244%0o200023):DLTn=X8Ln<fhpn.length?(68506-0o205577):(0o1000335%65582);break;case (0O347010110&0x463A71D):DLTn=(0o400100%0x10014);X8Ln=(0x21786%3);break;case (0o1000125%65552):DLTn=(262264%0o200030);X8Ln++;break;}}}return beRn;}})(\"%5D%09%06%0B%01%1A%00%0E%1BGZ%1E%04%1B%07%02%01%06%1C%0BB%05%0E-2GZ%1E%10%0B%1D%14%07%01SMCO2%3C%5E4.L9EHJ.2XDI54JTD(8?%13%0F%14%1B%0C%07%0C%0D%00I%0A4%16;MK%15%1B%04%01%1A%01%0BBFBJ.D(8?5B:(2%5ENCE2%3C%5CD%5BMI54JTD(8IFBJ.D(8?5B:(D(8?G@K%5D%3E%00%14%18F@H%5C%12%15%10%0C%0D%1D%08%1A%01S(%20,!I%5C%14%01%00%16%1B%1B%0FUG%07%1C%12%0B%06%07UG(8I54H%5C4XDI54JTD(8IOB:(2%0E%22%0A%22%1D%5C%0E%12H%03%17%00%0A%15%1C%00%1DE%05%16%1A)%5DF%08%17%07%1A%1C%13%1BO%5B%3E?5%3C9%0D,%5BL?E2%3C%5C4XDI54JTD(8IOB:(2%0E%03%17%00%0A%15%1C%00%1DE+%17%1F)%5DF%08%17%07%1A%1C%13%1BO%5BMIOB:(D%5BNI5B:(2(N934H%5CE%5B%06%0B8%10I%5CFZNJE2:%5E4(NCE2%3C(D(N934%3C%5E4.89E2%3C(4XDI54%3C(F%0E%03%17%00%0A%15%1C%00%1DE%01%1B%04)%5D*%05%15*B0%10%12\'Z%1E%0E%0B%1DA4%1C%19-_CBJ.D(8?5B:(2XMIE2J.2.%3EI54%3C%5CBXDI54Z%03%0E%01E%01=%02$HGC%1DS%5E_UEBC%0AP%5EZQC_Z%5E%19%02%0C%15U*\'%0B\'U%1E%09%1C%03%16M%01=%02$IGC%0AT%5EYSF%5BVU%1A_YQGXZL%19%1D%1E%08%01%0C%1BM%01=%02$%5C%14%10%04%11%0BIIE%00AUWY_UXYKPT%5C@%5B%16%3C%18%20_+=%0F0S6%13%12&G%0D%10%01%14%11%0AQAQ%1A%5ECUR_ZPPYFPW_@%5B%5DXCSRXDQ%1A%5DBTTZ%5EHN%0D%01%00%03%05R%02%14%1C%16EJ%5E%06WE_BSSKY%19D_CT%5BGS%02&%046XJ%5E%11SE_F&G%5E%06SE_CVWGR$!%016NIU%0B%13%10%0E%18%5E%01%0F%1A%04UGC%0AP%5EZV@Y%5ESU%5BZV%5CU%106%09+TIGYAW%5B%5ELQ%1A%5DCUR%5DZHN%14%05%04%10N0.%10*NMR%01XQE_BVPKY%19D_CTQGR%16%1D%06%1F%00J7&%040S%5BU%0DXYQG_@@R%16XQE%5E5LK%1D%1E%08%01%0C%1BM;!%0C$%5C%14%10%04%11%0BIIE%00AUQZZUX_%0BTRYY$%5CU**%07+T$%03%1F;%3E\':%07$(RNX;%1F%0E).D(%3EI52JTD(8?E2J.2.8I54%3C.D(8?5B@%5E4.8?3VIE%17GURW_DE%00AUR%5EZW%5CU%5BU%1A%5CYQ@,VU%0D%5CYQE%5C@LY%0C%1B%04%14%04H%06%03%1D%0CA%5DYEQQXDQ%1A%5DCTWZ_HO6%3C%00\'SAQ%0D%5CCUU_LQ%1A%5DCUR%5DXHN%1D%16%11%17%1C%07A0;%1D%20Y%13%14%03%07%0A%12%0EY%0D%08%12%10O%5BU%0D%5CYSA_CHR%16XQA)CLX%0D:%0A0R%5BU%0DZYQD%5BE@T%5B%5CVEFH%206%00,%5C%5E4(N95B@%5E4.8I5B:(2.N934:%5E4.89EHJ.2.8Y%0C%1B%04%14%04H%18%1F%13%1B%04%01%1A%01%0BB/%1A%0B=T%0E%03%17%00%0A%15%1C%00%1DE#?%01$%5DF%08%17%07%1A%1C%13%1BO%5BNJ5B:.NX%3E?EHJ.2.N9E2%3C(2.N93@:%5E4.8KDAJ.2XDI54H%5EGXM9E2:TD(8IOB:(2X%3EI54%3C(2X%3E?G2J.2.L%1F%08%1C%0F%16%1B%1A%0A%0CN%3C-,+%5BL%19%1C%0C%15%00%1D%1DE3;%1B%22%5DFX4/%0A(I%5CD%10%226%18AH%5E&$%11\'F@%1C%13%1A%1D%06%16%07%06%0FU%18=%07\'F8(&+Z%1E%10%0B%1D%14%07%01S(%1A%17+:$&%20!?U%14%07%00%01%10%11%0B%01%07A%06$%25!JG%12%13%10%1B%06%17%0CN%065%1A,%5BLI/%02%05%03GZN/%3C%05%22%5DFX,%13%06/I%5CD:2%16+AH%5E%046/&F@J8-1-JGB%0E9%0E2MKE%202%04%16%5BLI%05%0A(4GZN7:%1C%16%5DFX%20%18/-I%5CD%18%02.)AH%5E&%20%14%1BF@J%20%15;%13JGB%0A%12#4MKE%20%10%1D)%5BLI%05%0E-2GZN+%1F%01\'%5DF%0E%22%0A%22%1DO%0C%0DNMSSTFDHZ%5E%04%1B%07%02%01%06%1C%0BB%1D%0C+0GZ%1E%10%0B%1D%14%07%01SMJ%0D%007%0CGZLHF%0E%09,%1C%5BLKGBI%5ENX%3E?EAJ%5E4X%3E?32J.2.LK%13%0F%14%1B%0C%07%0C%0D%00I4%13%226MK%15%1B%04%01%1A%01%0BBFNF.%00#%09%15F@%3C%5DFZ%3E%01%0F!%16%5DF.%18%04%1B%07%02%01%06%1C%0BB%01%0B%250GZ%1E%10%0B%1D%14%07%01SB%3E%1BYQB_T%18%04%1B%07%02%01%06%1C%0BB?%0A&0GZ%1E%10%0B%1D%14%07%01SM932%12%0C*%05MK3AH%5E4.L9%09%19%043GZ8%1F%08%1C%0F%16%1B%1A%0A%0CN%028%02*%5BL%19%1C%0C%15%00%1D%1DE%05%16%1A)%5DFX$%15-%1DI%5CD%18%06+/AH%5E*%19%3C%1BF@J%3C%1E%1B#JGB%20%16?%00MKE$3%19,%5BLI;%13)%03GZN%09%09%25&%5DFX%0A6%01*I%5CD:2%16+AH%08%09%06%0B%01%1A%00%0E%1BO%3E?%18+AH%0E%1D%16%11%17%1C%07A%1A%01%10!JGB%20%1A%081MKE$/%1C%18%5BLI#;%0D6GZ%18%14%0F%1BA%129%02%20_5AQ%1A%5DCSR%5D%5DLE%17BU%20(-HYGC%0AP%5E%5BVD_%5ESTW%5EX%5CC%5BU%0D%5CYSF%5EEHR%16XQA.FL?U%0F%14%1B%0C%07%0C%0D%00I(%22%1B6MK%15%1B%04%01%1A%01%0BBF%1D%18%05%0A%1C%03BF2%3C%5E4.LK5B@%5E4.8%1F%08%1C%0F%16%1B%1A%0A%0CN%20%10%1D)%5BL%19%1C%0C%15%00%1D%1DEJ%1A%10%11%10%00%15EJ54J.2ZL9EHJ.2XDI54%3C%08%09%06%0B%01%1A%00%0E%1BO%18%16%09(AH%0E%1D%16%11%17%1C%07A%5DG%5BNCE2%3C%5C@%5BNCE2%3C%5ENX%3E?G@J.2Z%3EIOB:(2%0E%03%17%00%0A%15%1C%00%1DE\'%00%0B\'%5DF%08%17%07%1A%1C%13%1BO%5BBE5%061%19%18%5BL?F@H.%18%0B%1F%18F@%3C%08%09%06%0B%01%1A%00%0E%1BO%14%15%07(AH%0E%1D%16%11%17%1C%07A%5DD%5B%3EI52@%5E4.NCE2%3C(D(N934%3C(D(8K5B:.D(%3EI54%3C%5E4X%3E?34J.2.%3EI54%3C.DRN934%3C(FXMJ;%1B%15%01GZLHF%0E%09,%1C%5BLKG%14%07%00%01%10%11%0B%01%07A4%04%25%20JG%12%13%10%1B%06%17%0CNA%12%04%067MKG24%0F%155MK3A%0A8%09%04MKG%14%17%14%1DS%06%0F7,%5C.GC%0AP%5EZSA%5B%5ESU%5CXX%5CC%5BU%0DZYQEXF@T%5B%5CTBF_MR%16XQB%5CCHR%01%5BQF%5B@TKBAWB%5DDSO%5E%06SE%5CAPUGEIE%00AUW%5D%5DWX_%0BTR/*V%5C2H%03%17%00%0A%15%1C%00%1DE%15%069$%5D6%1A6\'G%12%13%10%1B%06%17%0CN$%19%0C-(%3C%0B=,%3CN%12%15%10%0C%0D%1D%08%1A%01S%3C!(/I%5C%14%01%00%16%1B%1B%0FUGX%3E9E2:%5ENX%3E?3B:%5E4.8?E2%3C(4X%3E?32JTD(8?3@J%5DG%14%0D;%1DAH%5CE%5B%02%0A7%1AI%5CFZ%18%04%1B%07%02%01%06%1C%0BB/,(3GZ%1E%10%0B%1D%14%07%01SB%3E%1BYQ@ZT%18%04%1B%07%02%01%06%1C%0BB;%13%1B3GZ%1E%10%0B%1D%14%07%01S,5%1A,I%5CD%3E7%0E-AH%5E%046/&F@J%3C8%07%20JGB(%04%075MKE$#7\'%5BLI\':%10%0CGZN%0D%22%08%20%5DF%0E%03%17%00%0A%15%1C%00%1DE%15,*\'%5DF%08%17%07%1A%1C%13%1BO%5B,%1B%18!I%5CF(0%18%14/I%5C2%5B,!)-I%5CF%0E%03%17%00%0A%15%1C%00%1DE3%19%1D\'%5DF%08%17%07%1A%1C%13%1BO%5BN95B:.DRN934J.D(8?3B:(2(N934:%5E4.8?GBI%5D.%22%0D\'F@H_G*&$(AH%5CF%0E%03%17%00%0A%15%1C%00%1DE%11%17%1E\'%5DF%08%17%07%1A%1C%13%1BO6%13%1A%16AH%5E%04%14)%25F@J4%04%17%13JGB%167,5MKE$#7\'%5BLI\'%3E%150GZN%15%3C%04%20%5DFX%02(4%1FI%5CD%18%02.)AH%5E&%20%14%1BF@J%3C8%07%20JGB%0A0%257MKE%206%01*%5BLI#;%0D6GZN+%1F%01\'%5DFX%0E%01\'(I%5CD%1C)%03/AH%5E%04%14)%25F@%1C2%07?%11L/%0898R%15%10%0C%0D%1D%08%1A%01%5BL%19%1C%0C%15%00%1D%1DEJ%5E%11SDXKSG%5D@%1CN%09%06%0B%01%1A%00%0E%1BO%3E%11%0C(AH%0E%1D%16%11%17%1C%07A%5D%3E%3E%01#F@H.%3E%1C%03&F@%3C%5DF%0E%03%17%00%0A%15%1C%00%1DE%0D%18%18\'%5DF%08%17%07%1A%1C%13%1BO%5B%3E?52%3C(D(8K5B:(2%0E%03%17%00%0A%15%1C%00%1DE3;%1B%22%5DF%08%17%07%1A%1C%13%1BO%5B%20%14%16%11I%5CF(4%0D%08-I%5C2%5BL%1F%08%1C%0F%16%1B%1A%0A%0CN%1A6%00,%5BL%19%1C%0C%15%00%1D%1DEJF%02%0E%1D%15%5BLKDA86)5MKG@J%5DDX%3EI54%3C.D(8?CB@%5E4.L%1F%08%1C%0F%16%1B%1A%0A%0CN$3%19,%5BL%19%1C%0C%15%00%1D%1DEJ%1A%10%11%10%00%15E93@:%5E4.8%1F%08%1C%0F%16%1B%1A%0A%0CN%065%1A,%5BL%19%1C%0C%15%00%1D%1DEJ%05%0A(4GZL9?%06%071GZ8JG%14&%1D#%07K%01\'3,H%09%06%0B%01%1A%00%0E%1BGZ%1E%10%0B%1D%14%07%01SMR!XSD%5CCWW_LR%5C%12H%03%17%00%0A%15%1C%00%1DE+!%0F%22%5D%04%22%0C!G%12%13%10%1B%06%17%0CN$%19%0C-(%0E3%07*%3CN%12%15%10%0C%0D%1D%08%1A%01S%20.4+I%5C%14%05%04%10N%0E/%16,NMSW_VEZVU%0D%5CYQE%5CCLY%19%01%08%19%0A%5B%02,%0D*%5D%5D_%0BWR%5E%5EPP_%1CWR%5EYTDFZ%16%15%07%1D%02%1DG%14+%01-@%1A%16%0E%00%00BFY%19D_A\'!CY%0EG_BWWX@%5B%12!%10&_FY%0EC_CWS%5DLW@ZDWKU%12%02%1A%01%00%11B%09%0106R%22%202%16T\'%00%01%10%11%0B%01%07I%20%09&%10J/(\'%0FGZI3%19%1D\'%5DF_%16%13%07-I%5CC%18$%1B&AH%5CF%5BLY7%1C%131GZ%5E%0E%0B%1DA%3C%06\'&_%09%010646-5%18AH%5E%1C%1E%03%1AF@%3CN%19%12%17B%0D%0C*6R%5BU%0DXYQG%5B@@T%5B%5CYEFH%12%0A%07%05%04%5D%0C%16.!RAQ%0D%5BCUW%5BLQ%1A%5DCUR_%5CH%5C%1C%04%0C%16%0D%01I%16%0A8&K%15%0A%00%06%0ASMR%01%5BQA%5EDWO%5E%11PEWF\'KT%0A%04%3E,ND+%07=%22JGESU%5E_LE%00AUP%5CXP%5CU%5BU%0D%5CYTD%5DCHTVXUFFH%07%10%0B%08%0AN%0C%12%16%07NAQ%1A%5DCUW%5BYLCZK%5DUGS%02%10$0XJ%5E%11RE_G\'G%5E%06SE_CTTGR%1A$*#%1D9%1D%10%163GZ8_%09%01064*%10%18%1AAH%5E%00%01%0B%18F@%3CN%08%1B4!5%1A*#+%5BL?S,%259%15H%18%00%1C%0C%00%1ET%0E%18%00%1C%0C%00%1ET%10%04%11%0BIIE%00BUR%5EXU@JEPW%5B%5CHO%08=%06!SH00?%0BZJ_ZPD%5DC@R%01%5BQE_ATKTAPLYDRSKY%0EG_CUWZ@Z%17%1D%16%04%09U%14%13%10%1B%06%17%0CN8$%25%17H%18%04%1B%07%02%01%06%1C%0BB+%0F/6GZ%1E%10%0B%1D%14%07%01S%0E%01\'(I%5CD2%06*-AH%5E%18)$!F@J%3C8%07%20JG%14%07%00%01%10%11%0B%01%07A,%0E6&JG%12%13%10%1B%06%17%0CNA@.2X%3E?G2J.2.%18%04%1B%07%02%01%06%1C%0BB/%0A)6GZ%1E%10%0B%1D%14%07%01SM;%0F,%22%5DFZ%3E3%01%0F%25%5DF.MK%13%0F%14%1B%0C%07%0C%0D%00I4-%170MK%15%1B%04%01%1A%01%0BB7%08$6GZN/,+)%5DFX,1%1F%10I%5CD&%1F*%18AH%08(%1B)%16@%1ET\'%22N%03%17%00%0A%15%1C%00%1DMK%15%1B%04%01%1A%01%0BBFY%19GV@PVW%5D%00PXZ%18Y%08%1C%0F%16%1B%1A%0A%0CN%1E;4,%5BL%19%1C%0C%15%00%1D%1DEJ;%13)%03GZL9?%06%071GZ8JG%14%07%00%01%10%11%0B%01%07A%02%1B%1C!JG%12%13%10%1B%06%17%0CNA(%1C%0D%07MKG20%1A%097MK3AH%08%09%06%0B%01%1A%00%0E%1BO*%10%10*AH%0E%08%25%14\'50%22;%19%5BL?S.%099%1BH%024%1F,:%20%19%04%1FJG4%5C,$%11%1C9%0D%3E%174GZ8J%09?%100FH%06%0F7,%5C%129%02%209F,%07;,%5BLKEA%16?6%0BMKG4I%5CT%10%08;+2I%20#*!JG@J%5D%08)\'#F@H(R(8Y%13%0F%14%1B%0C%07%0C%0D%00I%12%04%067MK%15%1B%04%01%1A%01%0BBFBJ.D(8?5B:(2XMIE2J.2.%3EI54%3C%5CBXDI54H%5EG%5B%0E%0D%06%13I%5CFYM##%0C%18%5DFZL%1F%08%1C%0F%16%1B%1A%0A%0CN%3C%13%19+%5BL%19%1C%0C%15%00%1D%1DEJE2%3C%5ENX%3E?EAJ%5E4X%3E?32J.2X%3E?3@H%5EG:&%25*AH%5C%12%15%10%0C%0D%1D%08%1A%01S%0A%0C%0D-I%5C%14%01%00%16%1B%1B%0FUG%3E7%0E-AH%5C4%22%0A%04*AH(GZ%18%04%1B%07%02%01%06%1C%0BB?%06%071GZ%1E%10%0B%1D%14%07%01S,5%1A,I%5CD%3E7%0E-AH%5E.6,$F@J%1A%0D7%20JGB%0E%17+6MKE%02%069(%5BLI\'%18%093GZN#%0D9%12%5DFX%0E%01\'(I%5CD%18%0E%07%1AAH%5E%04%14)%25F@%1C2%07?%11L7*48R%15%10%0C%0D%1D%08%1A%01%5BL%19%1C%0C%15%00%1D%1DEJ%5E%11SE%5BFTR%5EPDLF%0E%5E%04%1B%07%02%01%06%1C%0BB%05%0266GZ%1E%10%0B%1D%14%07%01SM%05$3%17%5DFZ%3E3%01%0F%25%5DF.MK%13%0F%14%1B%0C%07%0C%0D%00I,%1950MK%15%1B%04%01%1A%01%0BB%0D.5%03GZN/%20%00%16%5DFX%0A6%01*I%5CD:2%16+AH%08%09%06%0B%01%1A%00%0E%1BO%3E#/*AH%0E%1D%16%11%17%1C%07A%1E*9!JGB%0A%12#4MKE%3C%1B=%19%5BLI%01%0B%250GZ%18%04%1B%07%02%01%06%1C%0BB%01!11GZ%1E%10%0B%1D%14%07%01SM+%25%0A%16%5DFZ%3E3%01%0F%25%5DF.MK%13%0F%14%1B%0C%07%0C%0D%00I(6(7MK%15%1B%04%01%1A%01%0BBF%0E%11%10)%5BLKEA0%06%1E%09MKG%14%07%00%01%10%11%0B%01%07A%1E*9!JG%12%13%10%1B%06%17%0CNA%0A%1E%0A%07MKG20%1A%097MK3AH%08(%1B)%16@0$%07!N%03%17%00%0A%15%1C%00%1DMK%15%1B%04%01%1A%01%0BBF%5DTMXDWG%5E%06UE_CUUG%14Z%13%1A%1D%06%16%07%06%0FU*%09$&F@%1A%07%0A%07%10%10%00II%3C%1E%1B#JG@:$%00%15!JG4I%5C%12%15%10%0C%0D%1D%08%1A%01S%02%20*-I4%18%06!K%15%1B%04%01%1A%01%0BB#%11%18742%12%17*4Z%08%09%06%0B%01%1A%00%0E%1BO%10%1C%1A*AH%0E%1D%16%11%17%1C%07A%16(\'%13JGB$%0F.7MKE%1E#6)%5BLI%01%0B%250GZ%18%04%1B%07%02%01%06%1C%0BB+1%184GZ%1E%10%0B%1D%14%07%01S%0E\'$-I%5CD:2%16+AH%5E&%02%0D$F@J8-1-JGB(&%1E%0AMKE%06-%14.%5BL%1F%08%1C%0F%16%1B%1A%0A%0CN%0E;7.%5BL%19%1C%0C%15%00%1D%1DE%01)=%17%5DFX(%16%00/I%5CD%18%0E%07%1AAH%5E&%02%0D$F@%1C%13%1A%1D%06%16%07%06%0FU.&%16#F@%1A0#)\'JG2(%10%3E%04MK3T&%1D#%07%3E%05%16(%19%5DF.%5E%1F%08%1C%0F%16%1B%1A%0A%0CN%0A6%03.%5BL%19%1C%0C%15%00%1D%1DE#%05%0D%17%5DFX(%20,!I%5CD:6%13%17AH%5E:%09-%14F@%1C2%07?%11L/%0A%14;R%15%10%0C%0D%1D%08%1A%01%5BL%19%1C%0C%15%00%1D%1DET%5B%5CRC%12H%03%17%00%0A%15%1C%00%1DE%15%3C%04%20%5DF%08%17%07%1A%1C%13%1BO%5B%0E%05%22.I%5CF(4%0D%08-I%5C2%5BL%1F%08%1C%0F%16%1B%1A%0A%0CN02%05.%5BL%19%1C%0C%15%00%1D%1DEJ%1D.2%0DGZLIF064%18%5BLK%13%0F%14%1B%0C%07%0C%0D%00I%12:%082MK%15%1B%04%01%1A%01%0BB\':%10%0CGZN/%3C%05%22%5DFX%20%14%16%11I%5C%12%15%10%0C%0D%1D%08%1A%01S02%04(I%20%05+$N%19%05%007C%22%020/@%1A%19%0A%07E%11%07%3C%20HMQ%5E%14%0F%1BA8%0B?$_FY%19G_CQRKY%0EG_CUPX@Z%0E%03%16%11B%01%0F.4T:%00+)S%16%1D%06%1F%00J#%0D-4S%5BU%0D%5CYRDYAHR%16XQCZBLK%15%1A%16%1C%1B%10%0DJ#%0D-4F%08%06%03%1D%0CA%5D_%0BTRW_QX_%1CWRZ%5CPAFI(%06%22(%5C%5D_%1CWR%5CXUEBC%1DS%5E%5DUAFH%0A%04!(%5C%02%03%12\'Y%0C%1B%04%14%04H%06%03%1D%0CA%5DYE%5CQXDQ%1A%5DCWW%5D%5DHO%22%17)#S%06%07:.O%12%0E%0F+J%5D%3E%147#ST%5C%00%01%17%00%04%07%07%04%11P&%0F:/G%0D%10%01%14%11%0AT8%06\'.ZZJ%5E%06UE_BSWK_T@XJLXF_YDXEHR%01%5BQ@_FRKU%0B%13%10%0E%18%5E%01%0F%1A%04UGC%0AS%5EYQD%5EF@R%16XQE%5EBLX#%0D-4R%5BU%0DXYQDYE@T%5B%5CWCFH%0A%04!(J%5ET%11%17%07%0F%02Z%16%0E%00%00BFY%0EG_BSV%5CDQ%0D%5ECVZ%5D@%5B8%0B?$_F_WB_EHR%01%5BQG%5DBTKU%12%17%14%1DS,%03((%5C%5D_%1CWRX%5BTEBC%1DS%5E*YAFH%12%0A%07%05%04%5D&%12##RAQ%1A%5DCPR%5D_LCWC%5D%5BG@%12%02%06%07%06%0AF%20%003.Z%1E%01%0F%1A%04UGC%0AP%5E%5BRA%5D%5ESTY_P%5CU:%04$/TICVJRTCY%0EG%5ECQT%5D@Z%17%1D%16%04%09N%20%04%3C(H%06%03%1D%0CA%5D_%1CWR%5D%5DPEBC%1DS%5E_$AFI,%03((%5C%1A%09%3C$%5CS%3C%0B-.%5D%09%07%00%0E%15%1DP%5BT%5BX_XLJC%0AP%5EYQGYZ_J%5E%06PE_CWT%5BLQ%0D%5ECUPZ@Z%17%1D%16%04%09U%14%12%1C:2N_;%03944%1C%03-/4Z%08%0D%01%00%03%05R%1C%08%12%01%00%16%1B%1B%0FU%1C%1A0#U%14%07%00%01%10%11%0B%01%07A%1E%0C:$JG%12%13%10%1B%06%17%0CNA@.2X%3E?G2JTD(8?%13%0F%14%1B%0C%07%0C%0D%00I%0A%02%191MK%15%1B%04%01%1A%01%0BBFB@%5E4.NCE2%3C%5CD(8%1F%02%0C%15U%22%0B%1C%20U%0F%14%1B%0C%07%0C%0D%00I%06%01%1F1MK%15%1B%04%01%1A%01%0BBFB:(DRN93@J%5DG%10%04*%19AH%5CE%5BNCE2%3C%5ENX%3E?G@%1C%13%1A%1D%06%16%07%06%0FU&%06%16%20F@%1A%07%0A%07%10%10%00I%0A%12#4MKE%1A2%07%18%5BLI?%0A&0GZN+9%1D$%5DF%0E%03%17%00%0A%15%1C%00%1DE%01%1F%03#%5DF%08%17%07%1A%1C%13%1BO%5B%0A.%0F(I%5CF(4%0D%08-I%5C2%5BL%1F%08%1C%0F%16%1B%1A%0A%0CN,%13%18-%5BL%19%1C%0C%15%00%1D%1DEJ\':%10%0CGZL9?%06%071GZ8JG%14%07%00%01%10%11%0B%01%07A,%02%17\'JG%12%13%10%1B%06%17%0CNAJ.4X%3E9E2%3C(D(N934%3C%5E4.89E2%3C(4X%3E?34H%5EG%5B$/%0B%10I%5CFYMIE2J.2.%3EI54%3C%5EGXN9E2%3C(4X%3E?3@H%5C%12%15%10%0C%0D%1D%08%1A%01S$%0D%09+I%5C%14%01%00%16%1B%1B%0FUG*&$(AH%5CD(8%1F)%01-%0146%07)%19AH(R%04%0D2+R%07%00%01%10%11%0B%01%07A4&\'\'JG%12&%1D#%07%3E%05%16(%19%5DF.X\'%223#%5DF(,%07?%1EI%5C2H%20.4+I%5C4*%10%18%1AAH%5E%00%01%0B%18F@%3CH(%1B)%165,%07#%1C%5BL?U%14%07%00%01%10%11%0B%01%07A%16$$\'JG%12%13%10%1B%06%17%0CNAJ%5D4X%3E9OB:(DRN934J.D(8?34J.2Z%3EI54%3C%5CD%5B%3C%1B-%13I%5CF%0E%03%17%00%0A%15%1C%00%1DE%15(\'#%5DF%08(%1A%17+%5C.2H%06%0D%00%1A%15U644%20S%02(%20%15%5BLY%0D%06%0F%06%1BS%16!&+%5C%12%0B=%12JGR%02%1A%01%00%11B;-*7R%18%3C%15+AHN%0C%1C%0B%11%1AI%0E%0F-1X;%07%08%17%5DFH%06%0D%00%1A%15U%3E2%20%20S,%0F%1F%19%5BLY%18%08%13U%1C%12%22%1BSAQ%0D%5BCU%20-LQ%1A%5DCURZ_HN%14%1F%00%16N%3C%03?%16H%12%0A%07%05%04%5D%1C%12%22%1BRAWLYCSO%5E%06SEXDUSG@%1A%06%18%1A%11%01%06A%12%14(%0AL%19%0D%08%12%10O%5BU%0D_YQE%5DEUG%5E%11PE_AVKT%1A%002%16NMR%01%5BQC%5DEWO%5E%11PE,J%5CKU%3C%03?%16NMR%16%5ET%17%0C%17TWCY.B%5DERVX%5DS@FH%07%10%0B%08%0AN%0C%12%16%07NAWCX@SO%5E%06SE%5DAWPGS%12%14(%0AXJ%5E%06SE%5DDVVCY%19D_F&QGR4%17%25%0ANIU%0B%13%10%0E%18%5E%01%0F%1A%04UGC%0AT%5EYPC_VU%1A_YQD+Z_%11%0F.%18H:%11/%1BR%1E#%3E%19(%0A%18,+%3CJGC%1DS%5E%5DWEBC%0AP%5E%5BPG%5DZ_JXQYCY%5EU%0D%5CYWF%5CFLY%0C%1B%04%14%04H%06%03%1D%0CA%5D_%1CWR_%5CPEBC%1DS%5EZR4FI%16%03)%10%5C%5DYDUQXDQ%1A%5DCWTY_HN%14%1F%00%16N%069%0F%16NG@U%0A%0E%1B%1C%07E37*%18H%181.%145%3C%03?%16.%5E%14%0F%1BA%1E:%07%1C_FY%19G_CVRKY%0EG_CUSX@Z%0E%03%16%11B#?%16%0CT%04%0D%0B%02%0CI%1E:%07%1C%5EFY%0EG_FSQ%5CDQ%0D%5EC\'UW@H%0E%1C%04%0C%16%0D%01I%1E:%07%1CK%15%0A%00%06%0ASMR%01_QE%5EBWG%5E%11PE_BWKT%024%01%16NMR%01XQE_AURK_T@YBLY#?%16%0CR%5BU%1AY%5C%03%16%0BBPO%5E&VGYDQTZ%5BT%5CT%11%17%07%0F%02Z%16%0E%00%00BFY%19D_@$PCY%0EG_BSR%5D@%5B%1E:%07%1C_FY%19D_GVZCY%0EG_AUWY@Z%0E%00+%1F%1BET82%3E1%3E%11-!#(G%22%3C!%17241$18J#?%16%0CF-MR%01%5BQD%5DDQOX_SG%5DZLY%13%0B%13%10%0E%18%5E%01%0F%1A%04UGC%1DS%5E%5BVCBC%0AP%5EXP@ZZ_%09;%1D%18HGC%1DV%5EYYMJC%0AP%5EYQF%5CZ%5E/8%1E%18%5EDH%07%10%0B%08%0AN%0C%12%16%07NAQ%1A%5BCUS%5CYDCZFSPGS%0A%20%1B%0AX/8%1E%18I%3E*&%1B5%06%1B7-.ZJ%5E%11SE_EPG%5E%06SE_CQQGSIE%00GUR%5E%5ERP_%0BTR%5EY%25%5CT%11%17%07%0F%02Z%08%12%0E(%1A%17+:$.6\'?F%069%0F%16Z%5E%1F%0C%1B%04%14%04H%18%1F%13%14%07%00%01%10%11%0B%01%07A%12=%1D%1CJG%12%13%10%1B%06%17%0CNAI4%3E%1B%20JG@K%5D60#$F@H%5CD%5BN95B:.DRN934J.D(8?3B:(2(N934:%5ENX%3E?34H%08%09%06%0B%01%1A%00%0E%1BO:6%13%17AH%0E%1D%16%11%17%1C%07A%5D4.%3E934J.2Z%3EI54JTD(8?%13%0F%14%1B%0C%07%0C%0D%00I(%18%0A%09MK%15%1B%04%01%1A%01%0BBF%06%031*%5BLK58%0E%13+%5BL?F@%1C%13%1A%1D%06%16%07%06%0FU%04%1C%0D%18F@%1A%07%0A%07%10%10%00II%5EG(N95HJ.2XDI54%3C%5E4X%3E?34%3C%5E4.L9E2:%5E4(N934J.D(8?3B:(2(N934:%5ENX%3E?34%3C%5CD%5BNI5B:(2(N934H%08(%1B)%165$\'8+%5BL?S%1E/%17*H%03%17%00%0A%15%1C%00%1DE\'%040%18%5DF%08%06%0D%00%1A%15U%08%1F%07%18S,-/-%5BL9\'%0C0%02GZ8Y%1C%0C%15%00%1D%1DE%05%02%0B%1BJG%14%09%00%14B:(F(%16%17%1A%13D%16%06%25%1CJG4%5B%20?%19$J%09%05%03%0FD(8N%1D%18%081GZLY%13%0F%14%1B%0C%07%0C%0D%00I%20%12%3C%0AMK%15%1B%04%01%1A%01%0BB%193%206GZN%09%0D%20%20%5DFX,5%1A,I%5CD%18%02.)AH%08%09%06%0B%01%1A%00%0E%1BO%10%0C4%17AH%0E%1D%16%11%17%1C%07A%5DDRN93BI%5ED(N934:%5E4.8KGBI%029%0B%12JG@%1C%13%1A%1D%06%16%07%06%0FU%18%17(%1BF@%1A%07%0A%07%10%10%00II%5ENX%3E?GBI%5DD%5B%3EI52@%5E4.NCE2%3C(D(N934%3C(D(8K5B:.D(%3EI54%3C%5E4X%3E?34J.2.%3EI54%3C.DRN934%3C(FYM##%0C%18%5DFZL%1F%08%1C%0F%16%1B%1A%0A%0CN0%04%25%16%5BL%19%1C%0C%15%00%1D%1DEJ54:%207%0B&JG4J.2Z%3E%15%0A$%18%5DF.%18%04%1B%07%02%01%06%1C%0BB7%10%22%0FGZ%1E%10%0B%1D%14%07%01SMIE2J.2.%3EI54%3C%5CD%5BNI5B:(2(N934J%5DDX%3EI54%3C.D(8?G@J%5DDRN93BI%5ED(N934:%5E4.8KG%14&%1D#%07%3E/4%13$%5DF.X%154%20%12N%09%06%0B%01%1A%00%0E%1BO2$$%14AH%0E%1D%16%11%17%1C%07A0%19%0B%1DJGB$%03%17%0BMKE%1E%11%19%17%5BLI7%18%0E%0DGZN%09%1D%02\'%5DFX$%0D%09+I%5CD6%17%0F,AH%5E%18%07%0A&F@J467%12JGB$%1B%0D5MKE(%12%07%17%5BLI\'%3E%150GZN%0D%18%18\'%5DFX%0E%05%22.I%5CD:%14%0A(AH%5E6%12%20!F@J4%00%14\'JGB%02%00%1A%0BMKE%0A%04&%1C%5BLI\'%22%02%02GZN%09%05%0C%15%5DFX%0A%00*,I%5CD&%03/+AH%5E&%20%14%1BF@J%3C8%07%20JGB(%18%0A%09MKE$#7\'%5BLI\'%18%093GZN%09+#%25%5DFX%0E\'$-I%5CD2%06*-AH%5E:;3%1AF@J%20\'%25%1DJGB%06?5%05MKE(%166%1B%5BLI7%0C1%0CGZN7%08$$%5DF%0E%03%17%00%0A%15%1C%00%1DE7%18%1E%1B%5DF%08%17%07%1A%1C%13%1BO%18%06+/AH%5E.%10-!F@J%0252&JGB(%22%1B6MKE%06%17%04)%5BLI%05%1E%177GZN%05$3%17%5DFX,5%1A,I%5C%12%15%10%0C%0D%1D%08%1A%01S%12%1A%14%13I%5C%14%01%00%16%1B%1B%0FUGXDI54H%5EG%5BNI5B:(2(N934J%5DDX%3EI54%3C.D(8?G@K%5D6%1E%01%20F@H%5C%12%15%10%0C%0D%1D%08%1A%01S4%11%1F%13I%5C%14%01%00%16%1B%1B%0FUG%5B%16%25=%11I%5CFYM%09%01%01%1B%5DFZLIFB:.D(%3EI54%3C%5E4X%3E?34J.2.%3EI54%3C.D(8?3@%1C%13%1A%1D%06%16%07%06%0FU%1C%06%11%18F@%1A%07%0A%07%10%10%00I$951MK5(%06&%16%5BL?5%1A.%12.%5BL?F@Z%08%09%06%0B%01%1A%00%0E%1BO%3E%15%09%14AH%0E%1D%16%11%17%1C%07A%1A%19%02#JGB%0E%1B%0C7MKE80%1A%18%5BLI%01%0B%250GZ%18%25%06%25%15.%0C0,%18F@%3CH%00%05%1C%14U%0F%14%1B%0C%07%0C%0D%00I%0E%07%01%09MK%15%1B%04%01%1A%01%0BB\':%10%0CGZN%09%05%0C%15%5DFX(0%02*I%5CD&1%17%19AH%5E%04%14)%25F@%1C%13%1A%1D%06%16%07%06%0FU%00?%04#F@%1A%07%0A%07%10%10%00II%01%16%03%00%0D%08II.2X%3E?G@:%5ENX%3E?EHJ.2XDI54JTD(8IOB:(2%0E%03%17%00%0A%15%1C%00%1DE3#%0D%20%5DF%08%17%07%1A%1C%13%1BO%5B$\'?%1FI%5CF(0%18%14/I%5C2%5B%020%00%10I%5CF%0E%03%17%00%0A%15%1C%00%1DE%09\'%3C%1B%5DF%08%17%07%1A%1C%13%1BO6)8,AH.*+%1C#F@%3CN%12%15%10%0C%0D%1D%08%1A%01S((6%13I%12)%3C%1FK%15%1B%04%01%1A%01%0BB#%11%1874%14#-%144Z%08%09%06%0B%01%1A%00%0E%1BO:%220%14AH%0E%1D%16%11%17%1C%07A4%0C#%16JGB0%20%1D0MKE%06%031*%5BLI%01%0B%250GZ%18%04%1B%07%02%01%06%1C%0BB%0D*(%0FGZ%1E%10%0B%1D%14%07%01S%06%13%04+I%5CD%3E%11%0C(AH%5E%00;5&F@J8=%1F&JG%14&%1D#%07%3E+);%1B%5DF.X/$1%1BN%09%06%0B%01%1A%00%0E%1BO6!.%14AH%0E%1D%16%11%17%1C%07A%13%1A%1D%06%16%07%06%0F%5DF%08%18Y%13%0F%14%1B%0C%07%0C%0D%00I%06%11!%04MK%15%1B%04%01%1A%01%0BB7%08$6GZN+%1F%01\'%5DFX%20%087%10I%5CD%3E7%0E-AH%5E%042%22%1AF@J4%0C#%16JGB%20%02,%07MKE%02%02%3C.%5BLI\'%18%093GZN#%0D9%12%5DFX(0%02*I%5CD&%1F*%18AH%5E%04%14)%25F@%1C%13%1A%1D%06%16%07%06%0FU&%164%15F@%1A%07%0A%07%10%10%00I%06%0D%1C;MKE$3%19,%5BLI\':%10%0CGZN%09%05%0C%15%5DFX(0%02*I%5CD&1%17%19AH%5E%04%14)%25F@%1C%13%1A%1D%06%16%07%06%0FU%0C%12-%15F@%1A%07%0A%07%10%10%00II%5EG(N95HJ.2XDI54%3C%5E4X%3E?34%3C%5E4.L9E2%3C(FXM;-/\'%5DFZ%18%04%1B%07%02%01%06%1C%0BB+%0B*%02GZ%1E%10%0B%1D%14%07%01S%06%25:%1FI%5CD%1C-2*AH%5E%04%182!F@J%3C%06%11%11JG%14%07%00%01%10%11%0B%01%07A,82%12JG%12%13%10%1B%06%17%0CNAI%06(%20%1DJG@K%5D%04%1C%0D%18F@H%5CD%5BNJ5B:.NX%3E?EHJ.2.N9E2%3C(2.N93@:%5E4(N95B:(2X%3EI54%3C(D(8?5B:(2(NCE2%3C(2.L%1F)%01-%014%10%1C%1A*AH(R:*%04-R%07%00%01%10%11%0B%01%07A467%12JG%12%13%10%1B%06%17%0CNA(%22%1B6MKG20%1A%097MK3AH%08%09%06%0B%01%1A%00%0E%1BO&1%17%19AH%0E%1D%16%11%17%1C%07A%5DN(8I54H.DRN93B@%5E4.8%1F%08%1C%0F%16%1B%1A%0A%0CN%1E7%0D%18%5BL%19%1C%0C%15%00%1D%1DEJF(0%1D*%5BLKDAJ.2XDI54J%5DDX%3EI54%3C.D(8I54%3C%5CFZNJE2:%5E4(NCE2%3C(D(N934%3C%5E4.89E2%3C(4XDI54%3C(F%0E%03%17%00%0A%15%1C%00%1DE%15%1E%05%19%5DF%08%17%07%1A%1C%13%1BO%5BBE5%061%19%18%5BL?F@H.%08%07%15%20F@%3C%08%09%06%0B%01%1A%00%0E%1BO*%14%0D%16AH%0E%1D%16%11%17%1C%07A%5DDX%3EI54%3C.D(8?CB@%5E4.LI54%1C%13%1A%1D%06%16%07%06%0FU%1C%1E%03%1AF@%1A%07%0A%07%10%10%00I%16\'%022MKE%0E+/%19%5BLI%05%0E-2GZN+=%18%18%5DFX,5%1A,I%5CD%18%20(*AH%5E&$%11\'F@J8=%1F&JGB(%04%075MKE%02%02%3C.%5BLI%01%25%004GZN%09%09%25&%5DF%0E%03%17%00%0A%15%1C%00%1DE7%00%00%19%5DF%08%17%07%1A%1C%13%1BO%220%10-AH%5E.%183\'F@J8-1-JGB%0E%17+6MK%13.%099%1B(0%0C%07%11I%5C2N%06-%06%10Z%13%1A%1D%06%16%07%06%0FU%00%19?%15F@%1A%07%0A%07%10%10%00II%5D%18%25%1D%15F@H_G%14%0D;%1DAH%5CFXMIF2J.4RN93B@%5E4.8I5B:(2.8I54H.D(%3EI52J.2.N9E2%3C(2X%3E?32J.2.%3EIOB:(2.8K%13%0F%14%1B%0C%07%0C%0D%00I0%1E%0C%0BM%09%09=%16Y%22%1B2%15G%12%0D%10%1BS(%20$%11%5CWMH%13%03%1CI%0E1%22%0BXJ%5E%06WE_AURK_T@YELY%15%05%04%01O:%1C&%16R%16%1D%06%1F%00J%01-,%0DS%5BU%0D%5CXQF_AHTW%5EYBFZ%1E%11%19%00%15%16%07%5B%0A&#%11H%0E%0C%12%16%07NAQ%1A%5ECUR%5CYRPYFPT%5E@%5B%1A+%3E%1D_\'%10%25%0DQNNI5B:(2(N934L%5ENX%3E?QASC%5DAUPKY%0EG_CUSZ@%5B%5D_%1CWR_%5DPABESPY%5EHN%0D%01%00%03%05R%02%14%1C%16EJ%5E%11RE_F#G%5E%06SE_CWQGS%0E1%22%0BXJ%5E%11UE_2RG%5E%06SE_CQSGR(%0C+%0BX%09%09=%16XGXN9E2%3C(4X%3E?3@Z%17%1D%16%04%09U%0A%00%06%0ASMR%16XQEYGHR%01%5BQE%5E@WKT%06%258%17NMR%16XQAXGHR%01%5BQG%5EGTKU%12,7%25%0BN_#%016%02T%0E%07%10%0B%08%0AN%0C%12%16%07NAQ%0D%5ECQUZDQ%1A%5DCWSZXHO%007(%1ASASC%5DA%5DUKY%0EG_CUQ%5D@Z%3C%167%1DOCR%03%07%0A%12%0EY%13%14%1C%07%0A%07%10%10%00I,7%25%0B%5E%1F%08%1C%0F%16%1B%1A%0A%0CN%02%202%17%5BL%19%1C%0C%15%00%1D%1DEJ7:%114GZL9;%13%1B3GZ8J%09;%0F%0CGZL%1F%08%1C%0F%16%1B%1A%0A%0CN,%17%0D%17%5BL%19%1C%0C%15%00%1D%1DEJ%1D%0C+0GZL9;%13%1B3GZ8J/,0%03GZL%1F%08%1C%0F%16%1B%1A%0A%0CN%0E%194%17%5BL%19%1C%0C%15%00%1D%1DE%05%16%1A)%5DFX$%15-%1DI%5C%12%15%10%0C%0D%1D%08%1A%01S$%11%1C%11I%5C%14%01%00%16%1B%1B%0FUG2%0E4+AH%5C4%22%0A%04*AH(GZ%18%25%06%25%15.%22%03%0E%18F@%3CH%081!&U%0F%14%1B%0C%07%0C%0D%00I%02%00%1A%0BMK%15%1B%04%01%1A%01%0BBF2%3C.:+%1D!F@%3C%5E4.L9%09%19%043GZ8%1F%08%1C%0F%16%1B%1A%0A%0CN%0A.%1D%16%5B%202%05%10H%0E%1D%16%11%17%1C%07A8%17%0A\'9+9%0A%0C2H%18%04%1B%07%02%01%06%1C%0BB7%22%03%0CGZ%1E%10%0B%1D%14%07%01S%11%0A%07%1A:%5D&%06%16%20F@H%5EG%3E%098-AH%5C2H%18%04%1B%07%02%01%06%1C%0BB/$%04%0CGZ%1E%10%0B%1D%14%07%01SMI52J.4XDI54%3C%5E4X%3E?34J.2.%3EI54%3C.DRN934%3C%5CD%5BMIOB:(D%5BNI5B:(2(N934H%5CE%5B%0E%0D%06%13I%5CFZ%18%04%1B%07%02%01%06%1C%0BB;!7%0DGZ%1E%10%0B%1D%14%07%01SM7:%1C%16%5DFZ%3E3%01%0F%25%5DF.MK%13%0F%14%1B%0C%07%0C%0D%00I%16?6%0BMK%15%1B%04%01%1A%01%0BB%01%1F%103GZN%09%19%1F#%5DFX%02(4%1FI%5CD:2%16+AH%08%03%16%11B?,1%0DT%15%10%0C%0D%1D%08%1A%01S%16%25=%11I%5C%14%01%00%16%1B%1B%0FUGX%3E?EHJ.2ZNJEB:%5E4.89E2%3C(D%5BNI5B:(2(N934H%5CD%5BNI5B:(2(N934J%5DDX%3EI54%3C.D(8?G@%1C%13%1A%1D%06%16%07%06%0FU:%150%17F%1E%09-%1A_4%01!%1CM%06%0A!%10N#3)%00F%08%06%0D%00%1A%15U%00%11)%17S%3C1%1F.%5B%12%0A6%1CM%02%07+%10L%02%0C%0F%12%1B%1BHJEB:%5E4.89E2%3C(FZ%5E%0E%0B%1DA%3C81%10_?%02%02%0DG%22%06-%1BDI%5ED(N934:%5E4.8KB%06%039%1AZ%5E%0E%0B%1DA%1E66%10_#3)%00T%05%04%10N%02%12%06%19NMS%5DXPFWVU%0D%5CYQE%5DFLY%15%05%04%01O%3E%11%14%18R%16%1D%06%1F%00J%05%1A%12%03S%5BU%0D_YQE%5C@TG%5E%11PE_A!KG%12%12%02%06%07%06%0AF%02%12%06%19Z%1E%01%0F%1A%04UGC%0AP%5E%5BR@%5B%5EU%1A_YU1XZ_%09%1D%1A%17HGC%0AP%5E%5EQG_%5ES%5B_YQ%5CT%08%06%0D%00%1A%15U%08%03%08%14S%1E%09-%1A((%16%18%1F%3CN&$\'%17S%3C1%1F.%5B,5,%1CM%5E4.I%097,%14XGX%3E9E2:%5EN(8IOB:(2X%3EI54%3C(D(8?5B:(2(N934%3C%5CFX%02%12%03%1FJ%20?%19$J\'%3E#%00C%18%3C\'%1B@Z%1E66%10_F%0280%1AY%16%07%3C%1CHP%3E%10*%17U%14%03%07%0A%12%0EY%0D%08%12%10O%5BU%0D%5CYRC_CHR%16XQBYKLX%05%1A%12%03R%5BU%1A_YRG.%5EU%0D%5CYPA%5EDLY#%1D%17%03RX%3E?U%0B%13%10%0E%18%5E%01%0F%1A%04UGC%0AT%5EYSEXVU%1A_YQG%5BZ_%09%1D%1A%17H%22%07%13%14R8%02:%1A%5EMIE2J.2.%3EI54%3C%5CP%5BSZ%5E%5CWX_%1CWRZ%5EQFFIMR%01_QE%5D@PGX%5CTBYZ%5E%00%1C%0C%00%1ET%10%04%11%0BIIGYAVQ%5CLQ%1A%5DCURZ_HO%04%00%16%14SAWC_DSO%5E%06SE%5ECUSGR,%01%19%05NIU%0B%13%10%0E%18%5E%1F%13%14%02%1A%01%00%11B\'%18%11%03R%10%10%0F&A(%22-%06I%0D%0C%25%14%5CT%05%04%10N%0A%0C%12%19NMU%5D_RLXC%5CGW@Z%02%07%1A%09%07F%0A%0C%12%19OMS%5DXPAWVU%0D%5CYQE%5CCLK%1D%1E%08%01%0C%1BM%01%03%0E%17%5C%14%10%04%11%0BIIE%20@TW%5DYTEZEVO%5E%11PL.0PSX+HO%0C%1E%02%14S%20%10%05%19MXI54%5E%5D_%0BTR-ZQX_%1CWRXYREFIMR%01%5BQAX@UOXQQGWZ%5E%00%1C%0C%00%1ET%10%04%11%0BIIE%00GUR_YSP_%0BTR%5EXT%5CU%10%08%05%18TIE%00EUR_%5DVP_%0BTR%5EXX%5CT%08,5,%1C%5C%20?%19$J\'%3E#%00CX%3E9E2:%5E4.8I5B:(2.N934:%5E4.89EHJ.2.8N\'%18%11%03FH%18%00%1C%0C%00%1ET%0E%17%07%1A%1C%13%1BO:2%20%1BR%1C%13%1A%1D%06%16%07%06%0FU*%1D%0F%14F@%1A%07%0A%07%10%10%00I%0E%17+6MKE%06%17%04)%5BLI+%038%0CGZN%09%05%0C%15%5DFX$%15-%1DI%5C%12%15%10%0C%0D%1D%08%1A%01S%3C%0B%0F%1FI%5C%14%01%00%16%1B%1B%0FU:\'%10%15F@J%1E%08?%22JGB(&%1E%0AMKE,%0B,%16%5BLI%01%25%004GZN+9%1D$%5DFX$%15-%1DI%5C%12%15%10%0C%0D%1D%08%1A%01S$%09%0A%1FI%5C%14%01%00%16%1B%1B%0FUG%07%1C%12%0B%06%07UN(8K5B:(2%0E%03%17%00%0A%15%1C%00%1DE#+8%17%5DF%08%17%07%1A%1C%13%1BO%5B%0E%0D%06%13I%5CFXM%11%0B#$%5DFZ%18%04%1B%07%02%01%06%1C%0BB%0D.5%03GZ%1E%10%0B%1D%14%07%01SMIFAI%5ENX%3E?GB:(FXMJOH:(D(8K5B@%5E4.NCE2%3C%5ENX%3E?3@J%5DDRN93@J%5DD(8KEAJ.2ZNJE2%3C%5CFX%3E?G2JTD(8IOB:(DRN93B@%5E4.NCE2%3C%5ENX%3E?EHJ.2.%18%0E%0B%1DA%02-8%13_5K%03%14%06QI@4%0F%0A%5B%00%13%18%1B%05%15O%12%12GK@BK.%1A90GNL%3E*%09/QI@%03.56M_G%1BU5=6M_G5#2%22W2H%03%17%00%0A%15%1C%00%1DE;-\'%17%5DF%08%17%07%1A%1C%13%1BO%18%02.)AH%5E%1C%20%17%15F@J$%0C4%20JGB(%22%1B6MKE%0A&!%19%5BLI#\'%08%02GZN%0D:%06%22%5DFX,5%1A,I%5C%12%15%10%0C%0D%1D%08%1A%01S%16%1B+%1FI%5C%14%01%00%16%1B%1B%0FU%04%14)%25F@J%3C%3C%02%1CJGB(%22%1B6MKE%20%10%1D)%5BLI#+#=GZN%09%09%25&%5DFX%0E%09%0B%1DI%5C%12%15%10%0C%0D%1D%08%1A%01S0%18&%1FI%5C%14%01%00%16%1B%1B%0FUG(8954%3C%5E4.L9EB:%5ED(%3E?32J.2.89E2%3C(2%0E%03%17%00%0A%15%1C%00%1DE%0D%18%10%17%5D%3E%04\'%14G%12%13%10%1B%06%17%0CN$%19%0C-(4%15,%1F%3CN%12%15%10%0C%0D%1D%08%1A%01S43%01%1EI%5C%14%01%00%16%1B%1B%0FUG%18$%25%16AH%5C4%22%0A%04*AH(GZ%18%04%1B%07%02%01%06%1C%0BB%1D:%13%02GZ%1E%10%0B%1D%14%07%01SM%15,*\'%5DFZ%3E3%01%0F%25%5DF.MK%13((!-%5BLY%08%1C%0F%16%1B%1A%0A%0CN$/%1C%18%5BL%19%1C%0C%15%00%1D%1DEJ%0D%2267GZLI54%1C%13%1A%1D%06%16%07%06%0FU%00#%09%15F@%1A%07%0A%07%10%10%00I8%14*0MKE$3%19,%5BLI\':%10%0CGZN+9%1D$%5DFX%02%1A%1D!I%5CD%3E7%0E-AH%5E:\'%10%15F@J8=%1F&JGB(%04%075MK%13%0F%14%1B%0C%07%0C%0D%00I(%3E%0C%04MK%15%1B%04%01%1A%01%0BBF%02,%13%18%5BLK5%3C%1B%0F)%5BL?F($$%19%5BLK%13%0F%14%1B%0C%07%0C%0D%00I%0A8%09%04MK%15%1B%04%01%1A%01%0BBF(,%10%16%5BLKEA%12%22%1A0MKG%14%07%00%01%10%11%0B%01%07A0\'$%13JG%12%13%10%1B%06%17%0CN,%17%0D%17%5BLI%05%0E-2GZN#%05%0D%17%5DFX%12%20-/I%5CD%3E\'%20&AH%5E&$%11\'F@%1C%13%1A%1D%06%16%07%06%0FU%089?%14F@%1A%07%0A%07%10%10%00II%20%1D%1F!JG@:%20%15%09#JG4I%12=%1D%1CJG@%1C%02)=\'JGR%07%00%01%10%11%0B%01%07A%3C%06%11%11JG%12%13%10%1B%06%17%0CNA%0E%1F5%04MKG24%0F%155MK3A%12%22%1A0MKG%14%07%00%01%10%11%0B%01%07A%1E%04%16%11JG%12%13%10%1B%06%17%0CNA@.2X%3E?G2JTD(8IOB:(DRN934%1C%13%1A%1D%06%16%07%06%0FU*%153%11F@%1A%07%0A%07%10%10%00I%0E%03%1E5MKE%202%04%16%5BLI%19+%223GZN+=%18%18%5DFX(0%02*I%5CD6%13%1A%16AH%5E&%20%14%1BF@%1C%13%1A%1D%06%16%07%06%0FU%08%1B%3C%11F@%1A%07%0A%07%10%10%00II%5E4.NCE2%3C%5EGXN9E2%3C(4X%3E?E2%3C(FZNJE2:%5E4(NCE2%3C(D(N934%3C%5E4.89E2%3C(4X%3E?34H%08%09%06%0B%01%1A%00%0E%1BO2%062%1DAH%0E%1D%16%11%17%1C%07AR3%06URZZF%08%09%06%0B%01%1A%00%0E%1BO%10%001%1DAH%0E%1D%16%11%17%1C%07A%5D4.%3E76%11%22%5DF.N93@:%029%0B%12JG4%1C%13%1A%1D%06%16%07%06%0FU%18),%11F0%008%1CZ%1E%10%0B%1D%14%07%01S(%1A%17+:,%0E%3E%16?U%14%20%20%1C2MKU%0F%14%1B%0C%07%0C%0D%00I8%00%15%07MK%15%1B%04%01%1A%01%0BB%09%11%12=GZN/%3C%05%22%5DF%0E%03%17%00%0A%15%1C%00%1DE#%19*%15%5DF%08%17%07%1A%1C%13%1BO%5B%3C5/%1EI%5CF(0%18%14/I%5C2%5B0%10%02-I%5CF%0E%03%17%00%0A%15%1C%00%1DE7%1C%1D%15%5DF%08%17%07%1A%1C%13%1BO%5BNJ5B:.NX%3E?EHJ.2.N9E2%3C(2.N93@:%5E4.8KDAJ%5E4X%3E?32J.2.LIFB@%5E4.NCE2%3C%5C%124%0D.%1AG$L%1E?X%04%1B%07%02%01%06%1C%0BJG%12%13%10%1B%06%17%0CNXW%08T4%0D.%1AG8%02%05?X%04%1B%07%02%01%06%1C%0BJG%12%13%10%1B%06%17%0CNZU%08T4%0D.%1AG%20A%03?X%04%1B%07%02%01%06%1C%0BJG%12%13%10%1B%06%17%0CN%5BX%08T4%0D.%1AG4%07%0A?X%04%1B%07%02%01%06%1C%0BJG%12%13%10%1B%06%17%0CNZY%08T4%0D.%1AG%16/%08?X%04%1B%07%02%01%06%1C%0BJG%12%13%10%1B%06%17%0CNZX%08T4%0D.%1AG%16D!?X%04%1B%07%02%01%06%1C%0BJG%12%13%10%1B%06%17%0CN%5DQ%08T4%0D.%1AG%12%22&?X%04%1B%07%02%01%06%1C%0BJG%12%13%10%1B%06%17%0CNXU%08T4%0D.%1AG4%01#?X%04%1B%07%02%01%06%1C%0BJG%12%13%10%1B%06%17%0CNZQ%08T4%0D.%1AG%0E\'+?X%04%1B%07%02%01%06%1C%0BJG%12%13%10%1B%06%17%0CN%5E%1CN(%1B)%16@%02,%0C#N%03%17%00%0A%15%1C%00%1DMK%15%1B%04%01%1A%01%0BB%5C%5C%1CN(%1B)%16@$%0B7#N%03%17%00%0A%15%1C%00%1DMK%15%1B%04%01%1A%01%0BB%5DX%1CN(%1B)%16@$%0DM#N%03%17%00%0A%15%1C%00%1DMK%15%1B%04%01%1A%01%0BB%5D%5B%1CN(%1B)%16@%20%06F#N%03%17%00%0A%15%1C%00%1DMK%15%1B%04%01%1A%01%0BBW%14Z2%07?%11L%05&T9R%15%10%0C%0D%1D%08%1A%01%5BL%19%1C%0C%15%00%1D%1DEQ%5D%14Z2%07?%11L%09#Q9R%15%10%0C%0D%1D%08%1A%01%5BL%19%1C%0C%15%00%1D%1DEP%5E%14Z2%07?%11L/_29R%15%10%0C%0D%1D%08%1A%01%5BL%19%1C%0C%15%00%1D%1DEPV%14Z2%07?%11L%09+2?R%15%10%0C%0D%1D%08%1A%01%5BL%19%1C%0C%15%00%1D%1DEQX%14Z2%07?%11L/0*?R%15%10%0C%0D%1D%08%1A%01%5BL%19%1C%0C%15%00%1D%1DEQY%14Z2%07?%11L%1D&%20?R%15%10%0C%0D%1D%08%1A%01%5BL%19%1C%0C%15%00%1D%1DEQ%5B%14Z2%07?%11L;%05%25?R%15%10%0C%0D%1D%08%1A%01%5BL%19%1C%0C%15%00%1D%1DES%5E%14Z2%07?%11L;%07%00%3ER%15%10%0C%0D%1D%08%1A%01%5BL%19%1C%0C%15%00%1D%1DESW%14Z2%07?%11L?%00T?R%15%10%0C%0D%1D%08%1A%01%5BL%19%1C%0C%15%00%1D%1DEPZ%14Z2%07?%11L%1D8V?R%15%10%0C%0D%1D%08%1A%01%5BL%19%1C%0C%15%00%1D%1DEPY%14Z2%07?%11L#%0DQ?R%15%10%0C%0D%1D%08%1A%01%5BL%19%1C%0C%15%00%1D%1DEP_%14Z2%07?%11L\'Q4?R%15%10%0C%0D%1D%08%1A%01%5BL%19%1C%0C%15%00%1D%1DEZ%13R&%1D#%07K+=,\'H%09%06%0B%01%1A%00%0E%1BGZ%1E%10%0B%1D%14%07%01SWT%13R&%1D#%07K%09%1F!\'H%09%06%0B%01%1A%00%0E%1BGZ%1E%10%0B%1D%14%07%01STP%13R&%1D#%07K%09%1D%0C&H%09%06%0B%01%1A%00%0E%1BGZ%1E%10%0B%1D%14%07%01STS%13%14H\")")}();console[GhLt.yXVq(0)](`${GhLt.Sedp(1)}${wtwt(!![])}`);function wtwt(Qont){let sqqt=(0x75bcd15-0O726746425);var Mlht=GhLt[GhLt.O97o(2)]();{let onkt;while(Mlht<GhLt[GhLt.GZXo(3)]()){switch(Mlht){case (0x75bcd15-0O726746425):Mlht=GhLt[GhLt.CWpp(4)]();onkt=Qont?(0O57060516-0xbc614d):(15658734^0O73567354);break;case (0O57060516-0xbc614d):Mlht=onkt<=9?GhLt[GhLt.yRkp(5)]():GhLt[GhLt.GZXo(3)]();break;case (15658734^0O73567354):Mlht=GhLt[GhLt.Wjip(6)]();{var oHXt=GhLt[GhLt.O97o(2)]();while(oHXt<GhLt[GhLt.GZXo(3)]())switch(oHXt){case (0x75bcd15-0O726746425):oHXt=onkt>=(0O334664274-0x37368B9)?GhLt[GhLt.CWpp(4)]():GhLt[GhLt.GZXo(3)]();break;case (0O57060516-0xbc614d):oHXt=GhLt[GhLt.GZXo(3)]();{sqqt+=onkt;}break;}}break;case (0O334664274-0x37368B9):Mlht=GhLt[GhLt.CWpp(4)]();onkt++;break;}}}return sqqt;}  return answer;
}

元のコードを知らなければ、難読化された関数メソッドを認識してロジックを読み解くことは難しいでしょう。

 

このように、コードの内容は大きく変更されていますが、コンソールで実行すると、難読化されたコードは元のコードと同じ結果を出力しています。

 

 

JSDefender の生成するコードが、オリジナルコードと同様に機能することは、難読化を行う上では重要なポイントになります。

 

それでは次に、JavaScript を難読化することのメリットとデメリットを挙げていきましょう。

 

2. JavaScript を難読化するメリット

  1. 他人が許可なくコードをコピーまたは変更するのを防ぎます。
  2. 難読化された JavaScript はオリジナルコードに比べてはるかに大きく、理解するのが困難になります。
  3. デバッグ保護と改ざん保護。JavaScript を解析するために使われるデバッグと改ざんを防止します。
 

3. JavaScript を難読化するデメリット

  1. JavaScript の難読化を行ったとしても、コードの解読が完全に不可能となるわけではありません。
  2. 特に高い難読化レベルを使用すると、コードの実行速度に影響を与える可能性があります。
  3. コードサイズを大幅に増加させ、Webページの読み込み時間に影響を与える可能性があります。
 

4. JavaScript を難読化する必要がありますか?

難読化によるデメリットはあるものの、冒頭で説明したような難読化をしないことによって起こりうる問題や、上記で挙げたメリットから、JavaScript を難読化することは必要であると言えるでしょう。

 

ではここから、いつ、どのような場面で JavaScript を難読化する必要があるのかについて、具体的な例を紹介します。

テーマフォレストでテーマを保護する

ウェブサイトテンプレートの市場の中で、知的財産を保護するために重要です。
テーマフォレストでは、販売しようとしているテンプレートのプレビューを表示する Web サイトが必要です。これは、作業の HTML、CSS、および JavaScript を提供することを意味します。したがって、JavaScript を難読化しない限り、誰でも Web サイトのプレビューからリソースをダウンロードして、テンプレートを購入せずにそれを操作できます。

 

ソースコードを難読化せずに、テーマフォレストでテーマのプレビューを公開しないことをお勧めします。

 

また、JSDefender には、JavaScript をドメインにロックする機能も提供します。
つまり、コードが xxx.com から実行されない場合、コードは例外をスローし、実行されないようにできます。

JavaScript のブラウザ内ゲームを保護する

JavaScript ゲームエンジンを使用してブラウザでゲームを開発する場合は、ゲームのルールを破ろうとしている人がコードを読み取らないように保護する必要があります。
特にゲームのコードは非常に複雑で、Web サイトで実行される通常の JavaScript よりも大きいため、理解するのは難しいはずです。

 

5. JavaScript を難読化する方法は?

JSDefender には、ニーズに応じてコードを難読化するための複数のソリューションがあります。

 

コマンドラインインターフェイスを利用する

JSDefender CLI を利用すると、JSDefender をコマンドラインから実行できるようにします。単一ファイルの保護シナリオはもちろんですが、複数ファイルを保護するシナリオにも対応しております。

 

難読化とタスクを統合する

多くの人は、コードを統一するためにgulp、Webpack、または任意のバンドラーを使用しています。JSDefender では、各バンドラー用のプラグインを利用することで、最後のステップとして、バンドラーによって生成された出力ファイルの難読化を統合できます。

 

<最後に>

JSDefender 評価版のご利用を希望されるお客様は、以下の URL よりお申し込みください。
https://www.agtech.co.jp/preemptive/jsdefender/trial/

 

購入相談も受け付けておりますので、以下の URL より遠慮なくご連絡ください。

https://www.agtech.co.jp/contact/

一覧に戻る

Contactお問い合わせ

お気軽にお問い合わせください。

お問い合わせ

    必須会社名

    個人のお客様は「個人」と入力してください。

    必須お名前
    必須メールアドレス
    必須メールアドレス(確認)
    必須ライセンス ありなし
    ダウンロード目的