package Ġorg . open rs 2 . patch er Ċ Ċ import Ġcom . github . m ichael bull . logging . Inline Logger Ċ import Ġorg . open rs 2 . asm . classpath . Class Path Ċ import Ġorg . open rs 2 . asm . classpath . Library Ċ import Ġorg . open rs 2 . asm . io . Jar Library Reader Ċ import Ġorg . open rs 2 . asm . io . Jar Library Writer Ċ import Ġorg . open rs 2 . asm . io . Manifest Jar Library Writer Ċ import Ġorg . open rs 2 . asm . io . Pack 2 0 0 Library Reader Ċ import Ġorg . open rs 2 . asm . io . Pack 2 0 0 Library Writer Ċ import Ġorg . open rs 2 . asm . io . Pack Class Library Writer Ċ import Ġorg . open rs 2 . asm . io . Signed Jar Library Writer Ċ import Ġorg . open rs 2 . asm . transform . Transformer Ċ import Ġorg . open rs 2 . conf . Config Ċ import Ġorg . open rs 2 . crypto . Pk cs 1 2 KeyStore Ċ import Ġorg . open rs 2 . patch er . transform . Resource Transformer Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Path Ċ import Ġjava . util . jar . Attributes Ċ import Ġjava . util . jar . Attributes . Name . MAN IFEST _ VERSION Ċ import Ġjava . util . jar . Manifest Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Singleton Ċ Ċ @ Singleton Ċ public Ġclass ĠPatch er Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġ@ Patch er Qualifier Ġprivate Ġval Ġtransform ers : ĠSet < Transformer >, ĊĠĠĠ Ġprivate Ġval Ġconfig : ĠConfig , ĊĠĠĠ Ġprivate Ġval Ġpack Class Library Writer : ĠPack Class Library Writer Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġunsigned Manifest Ġ= ĠManifest (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġmain Attributes [ MAN IFEST _ VERSION ] Ġ= Ġ" 1 . 0 " ĊĠĠĠĠĠĠĠ Ġmain Attributes [ APPLICATION _ NAME ] Ġ= Ġconfig . game ĊĠĠĠĠĠĠĠ Ġmain Attributes [ PERMISSION S ] Ġ= Ġ" sandbox " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġsigned Manifest Ġ= ĠManifest (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġmain Attributes [ MAN IFEST _ VERSION ] Ġ= Ġ" 1 . 0 " ĊĠĠĠĠĠĠĠ Ġmain Attributes [ APPLICATION _ NAME ] Ġ= Ġconfig . game ĊĠĠĠĠĠĠĠ Ġmain Attributes [ PERMISSION S ] Ġ= Ġ" all - permissions " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġrun ( input : ĠPath , Ġoutput : ĠPath , Ġkey Store Path : ĠPath ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġread Ġinput Ġj ars / packs ĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Reading Ġinput Ġj ars " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġunpack er Ġ= ĠLibrary . read (" unpack class ", Ġinput . resolve (" unpack class . pack "), ĠJar Library Reader ) ĊĠĠĠĠĠĠĠ Ġval Ġloader Ġ= ĠLibrary . read (" loader _ sd ", Ġinput . resolve (" loader . jar "), ĠJar Library Reader ) ĊĠĠĠĠĠĠĠ Ġval Ġgl Loader Ġ= ĠLibrary . read (" loader _ hd ", Ġinput . resolve (" loader _ gl . jar "), ĠJar Library Reader ) ĊĠĠĠĠĠĠĠ Ġval Ġgl Ġ= ĠLibrary . read (" gl ", Ġinput . resolve (" j ag gl . pack 2 0 0 "), ĠPack 2 0 0 Library Reader ) ĊĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠLibrary . read (" client _ sd ", Ġinput . resolve (" run escape . jar "), ĠJar Library Reader ) ĊĠĠĠĠĠĠĠ Ġval Ġgl Client Ġ= ĠLibrary . read (" client _ hd ", Ġinput . resolve (" run escape _ gl . pack 2 0 0 "), ĠPack 2 0 0 Library Reader ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġbundle Ġlibraries Ġtogether Ġinto Ġa Ġcommon Ġclasspath ĊĠĠĠĠĠĠĠ Ġval Ġruntime Ġ= ĠClassLoader . get Platform ClassLoader () ĊĠĠĠĠĠĠĠ Ġval Ġclass Path Ġ= ĠClass Path ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġruntime , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies Ġ= ĠlistOf ( unpack er ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlibraries Ġ= ĠlistOf ( client , Ġloader ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġgl Class Path Ġ= ĠClass Path ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġruntime , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies Ġ= ĠlistOf ( gl , Ġunpack er ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlibraries Ġ= ĠlistOf ( gl Client , Ġgl Loader ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġrun Ġsimple Ġtransform ers ĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Transform ing Ġclient " Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( transformer Ġin Ġtransform ers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Running Ġtransformer Ġ${ transformer . java Class . simple Name }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransformer . transform ( class Path ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Transform ing Ġclient _ gl " Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( transformer Ġin Ġtransform ers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Running Ġtransformer Ġ${ transformer . java Class . simple Name }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransformer . transform ( gl Class Path ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġcompress Ġresources ĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Compress ing Ġresources " Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġunpack er Jar Ġ= ĠResource . compress Library ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" unpack class . pack ", Ġ" game _ unpack er . dat ", Ġclass Path , Ġunpack er , ĠJar Library Writer ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġclient Pack Ġ= ĠResource . compress Library ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" run escape . pack 2 0 0 ", Ġ" main _ file _ cache . dat 0 ", Ġclass Path , Ġclient , ĠPack 2 0 0 Library Writer ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġclient Js 5 Ġ= ĠResource . compress Library ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" run escape . js 5 ", Ġ" main _ file _ cache . dat 1 ", Ġclass Path , Ġclient , Ġpack Class Library Writer ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġgl Client Pack Ġ= ĠResource . compress Library ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" run escape _ gl . pack 2 0 0 ", Ġ" main _ file _ cache . dat 3 ", Ġgl Class Path , Ġgl Client , ĠPack 2 0 0 Library Writer ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġgl Client Js 5 Ġ= ĠResource . compress Library ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" run escape _ gl . js 5 ", Ġ" main _ file _ cache . dat 4 ", Ġgl Class Path , Ġgl Client , Ġpack Class Library Writer ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġgl Pack Ġ= ĠResource . compress Library ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" j ag gl . pack 2 0 0 ", Ġ" main _ file _ cache . dat 5 ", Ġgl Class Path , Ġgl , ĠPack 2 0 0 Library Writer ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġgl Js 5 Ġ= ĠResource . compress Library ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" j ag gl . js 5 ", Ġ" main _ file _ cache . dat 6 ", Ġgl Class Path , Ġgl , Ġpack Class Library Writer ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġgl N atives Ġ= ĠResource . compress Gl N atives () ĊĠĠĠĠĠĠĠ Ġval Ġmis cN atives Ġ= ĠResource . compress Mis cN atives () ĊĊĠĠĠĠĠĠĠ Ġ// Ġupdate Ġchecksum s Ġin Ġthe Ġloader ĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Updating Ġchecksum s " Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresource Transformer Ġ= ĠResource Transformer ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresources Ġ= ĠlistOf ( unpack er Jar , Ġclient Pack , Ġclient Js 5 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgl Resources Ġ= Ġgl N atives , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmisc Resources Ġ= Ġmis cN atives ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġresource Transformer . transform ( class Path ) ĊĊĠĠĠĠĠĠĠ Ġval Ġgl Resource Transformer Ġ= ĠResource Transformer ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresources Ġ= ĠlistOf ( unpack er Jar , Ġgl Client Pack , Ġgl Client Js 5 , Ġgl Pack , Ġgl Js 5 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgl Resources Ġ= Ġgl N atives , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmisc Resources Ġ= Ġmis cN atives ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġgl Resource Transformer . transform ( gl Class Path ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġwrite Ġall Ġresources Ġto Ġdisk ĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Writing Ġresources " Ġ} ĊĊĠĠĠĠĠĠĠ ĠFiles . create Directories ( output ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresources Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunpack er Jar , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient Pack , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient Js 5 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgl Client Pack , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgl Client Js 5 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgl Pack , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgl Js 5 ĊĠĠĠĠĠĠĠ Ġ) Ġ+ Ġgl N atives . flatten () Ġ+ Ġmis cN atives ĊĠĠĠĠĠĠĠ Ġfor Ġ( resource Ġin Ġresources ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresource . write ( output ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġwrite Ġunsigned Ġclient Ġand Ġload ers ĊĠĠĠĠĠĠĠ Ġclient . write ( output . resolve (" run escape . jar "), ĠManifest Jar Library Writer ( unsigned Manifest ), Ġclass Path ) ĊĊĠĠĠĠĠĠĠ Ġval Ġkey Store Ġ= ĠP k cs 1 2 KeyStore . open ( key Store Path , Ġconfig . game ) ĊĠĠĠĠĠĠĠ Ġloader . write ( output . resolve (" loader . jar "), ĠSigned Jar Library Writer ( signed Manifest , Ġkey Store ), Ġclass Path ) ĊĠĠĠĠĠĠĠ Ġgl Loader . write ( output . resolve (" loader _ gl . jar "), ĠSigned Jar Library Writer ( signed Manifest , Ġkey Store ), Ġgl Class Path ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠInline Logger () ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠAP PLICATION _ NAME Ġ= ĠAttributes . Name (" Application - Name ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPER MISSION S Ġ= ĠAttributes . Name (" Permissions ") ĊĠĠĠ Ġ} Ċ } Ċ