@ file : Suppress (" NOTH ING _ TO _ INLINE ") Ċ Ċ package Ġdev . bin club . bin sc ure Ċ Ċ import Ġdev . bin club . bin sc ure . utils . cast Ċ import Ġjava . io . File Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* Ġ@ author Ġcook Ġ 1 5 / Nov / 2 0 2 0 Ċ Ġ*/ Ċ object ĠLic en ser Ġ{ Ċ ĉ const Ġval ĠM ILL IS _ PER _ MONTH Ġ= Ġ 2 6 2 9 8 0 0 0 0 0 Ċ ĉ const Ġval ĠNUM _ MONTH S Ġ= Ġ 2 Ċ ĉ const Ġval ĠLICENSE _ EXPI RY _ M ILL IS Ġ= ĠM ILL IS _ PER _ MONTH Ġ* ĠNUM _ MONTH S Ċ ĉ val ĠcurrentTime Ġ= ĠSystem . currentTimeMillis () ĊĉĊ ĉ val Ġhome Ġ= ĠFile ( System . getProperty (" user . home ")) Ċ ĉ val Ġconfig Ġ= ĠFile ( home , Ġ". config "). also ( File :: mkdir ) Ċ ĉ val Ġbin sc ure Ġ= ĠFile ( config , Ġ". bin sc ure "). also ( File :: mkdir ) Ċ ĉ val Ġlicense File Ġ= ĠFile ( bin sc ure , Ġ" license . txt "). also ( File :: createNew File ) ĊĉĊ ĉ val Ġlicense Ġ= Ġtry Ġ{ Ċĉ ĉ val Ġlicense Ġ= Ġlicense File . read Text ( Charsets . UTF _ 8 ) Ċĉ ĉ if Ġ( license . isEmpty ()) Ġnull Ġelse Ġvalidate License ( license ) Ċ ĉ } Ġcatch Ġ( t : ĠThrowable ) Ġ{ Ċĉ ĉ null Ċ ĉ } Ġ?: Ġvalidate License ( gen License ()) ĊĉĊĉĊ ĉ private Ġinline Ġfun Ġgen License (): ĠString Ġ{ Ċĉ ĉ println ("\ r Please Ġvisit Ġhttps :// bin club . dev / license / gen Ġand Ġcopy Ġthe Ġlicense Ġhere :") Ċĉ ĉ val Ġinput Ġ= Ġ( readLine () Ġ?: Ġerror (" Couldn 't Ġread Ġinput ")). cast < java . lang . String >(). trim () Ċĉ ĉ val Ġlicense Ġ= ĠBase 6 4 . get Decoder (). decode ( input ). toString ( Charsets . UTF _ 8 ) Ċĉ ĉ license File . delete () Ċĉ ĉ license File . createNew File () Ċĉ ĉ license File . write Text ( license , ĠChar sets . UTF _ 8 ) Ċĉ ĉ return Ġlicense Ċ ĉ } ĊĉĊ ĉ private Ġinline Ġfun Ġvalidate License ( text : ĠString ): ĠLicense File ? Ġ{ Ċĉ ĉ try Ġ{ Ċĉĉ ĉ val Ġsplit Ġ= Ġtext . split ('\ n ') Ċĉĉ ĉ if Ġ( split . size Ġ!= Ġ 7 ) Ġ{ Ċĉĉĉ ĉ println (" Malformed Ġlicense Ġsize ") Ċĉĉĉ ĉ return Ġnull Ċĉĉ ĉ } Ċĉĉ ĉ val Ġversion Ġ= Ġsplit [ 0 ]. toInt () Ċĉĉ ĉ if Ġ( version Ġ!= Ġ 1 ) Ġ{ Ċĉĉĉ ĉ println (" Unsupported Ġlicense Ġversion Ġ($ version ), Ġplease Ġdownload Ġthe Ġlatest Ġbin sc ure Ġupdate ") Ċĉĉĉ ĉ return Ġnull Ċĉĉ ĉ } Ċĉĉ ĉ // val Ġproduct Ġ= Ġsplit [ 1 ]. toInt () Ċĉĉ ĉ val Ġproduct Ġ= Ġ 1 Ġ// Ġassume Ġproduct Ġ== Ġ 1 Ġfor Ġthe Ġhashing Ċĉĉ ĉ // Ġif Ġit Ġ!= Ġ 1 Ġthen Ġthe Ġhash Ġchecks Ġwill Ġfail Ċĉĉ ĉ val Ġusername Ġ= Ġsplit [ 2 ] Ċĉĉ ĉ val Ġpassword Ġ= Ġsplit [ 3 ] Ċĉĉ ĉ val Ġtimestamp Ġ= Ġsplit [ 4 ]. to Long () Ċĉĉ ĉ val Ġchecksum Ġ= Ġsplit [ 5 ]. toInt () Ċĉĉ ĉ val Ġhash Ġ= Ġsplit [ 6 ] Ċĉĉ ĉ val Ġhash Parts Ġ= Ġint ArrayOf ( Ċĉĉĉĉ 0 x 9 1 2 2 , Ċĉĉĉĉ 0 x 4 2 3 , Ċĉĉĉĉ 0 x 9 2 1 9 , Ċĉĉĉĉ 0 , Ċĉĉĉĉ 0 x 7 2 1 AB , Ċĉĉĉĉ 0 xFFFF , Ċĉĉĉ ĉ (- 0 xFF F ), Ċĉĉĉĉ 0 x 9 1 2 ED , Ċĉĉĉĉ 0 x 9 1 BCD , Ċĉĉĉ ĉ (- 0 x 1 2 8 D ), Ċĉĉĉĉ 0 x 9 9 E 9 9 , Ċĉĉĉĉ 0 x 9 8 1 2 , Ċĉĉ ĉ ) Ċĉĉ ĉ if Ġ( hash Parts . size Ġ!= Ġ 1 2 ) Ġ{ Ċĉĉĉ ĉ println (" Malformed Ġhash Ġpart ") Ċĉĉĉ ĉ return Ġnull Ċĉĉ ĉ } ĊĉĉĉĊĉĉ ĉ val Ġlicense Ġ= ĠLicense File ( version , Ġproduct , Ġusername , Ġpassword , Ġtimestamp , Ġhash Parts ) ĊĉĉĉĊĉĉ ĉ if Ġ( checksum Ġ!= Ġlicense . hashCode ()) Ġ{ Ċĉĉĉ ĉ println (" Mis matched Ġchecksum ") Ċĉĉĉ ĉ return Ġnull Ċĉĉ ĉ } ĊĉĉĉĊĉĉ ĉ if Ġ( currentTime Ġ- Ġtimestamp Ġ> ĠLICENSE _ EXPI RY _ M ILL IS ) Ġ{ Ċĉĉĉ ĉ println (" Out dated Ġlicense , Ġplease Ġgenerate Ġa Ġnew Ġone ") Ċĉĉĉ ĉ return Ġnull Ċĉĉ ĉ } ĊĉĉĉĊĉĉ ĉ val Ġusername Hash Ġ= Ġusername . hashCode () Ċĉĉ ĉ val Ġpassword Hash Ġ= Ġpassword . hashCode () Ċĉĉ ĉ val Ġtimestamp Hash Ġ= Ġtimestamp . hashCode () Ċĉĉ ĉ license . hash Parts . indices . forEach Ġ{ Ġi Ġ-> Ċĉĉĉ ĉ license . hash Parts [ i ] Ġ= Ġlicense . hash Parts [ i ] Ġxor Ġproduct Ġxor Ġusername Hash Ġxor Ġpassword Hash Ġxor Ġtimestamp Hash Ċĉĉ ĉ } ĊĉĉĉĊĉĉ ĉ return Ġlicense Ċĉ ĉ } Ġcatch Ġ( t : ĠThrowable ) Ġ{ Ċĉĉ ĉ t . printStackTrace () Ċĉĉ ĉ return Ġnull Ċĉ ĉ } Ċ ĉ } ĊĉĊ ĉ data Ġclass ĠLicense File ( Ċĉ ĉ val Ġversion : ĠInt , Ċĉ ĉ val Ġproduct : ĠInt , Ċĉ ĉ val Ġusername : ĠString , Ċĉ ĉ val Ġpassword : ĠString , Ċĉ ĉ val Ġtimestamp : ĠLong , Ċĉ ĉ /** Ċĉĉ Ġ* Ġlength Ġ= Ġ 1 2 Ċĉĉ Ġ* Ġ 0 Ġ= Ġ 0 x 9 1 2 2 Ċĉĉ Ġ* Ġ 1 Ġ= Ġ- 0 x 4 2 3 Ċĉĉ Ġ* Ġ 2 Ġ= Ġ 0 x 9 2 1 9 Ċĉĉ Ġ* Ġ 3 Ġ= Ġ 0 Ċĉĉ Ġ* Ġ 4 Ġ= Ġ 0 x 7 2 1 AB Ċĉĉ Ġ* Ġ 5 Ġ= Ġ 0 xFFFF Ċĉĉ Ġ* Ġ 6 Ġ= Ġ- 0 xFF F Ċĉĉ Ġ* Ġ 7 Ġ= Ġ 0 x 9 1 2 ED Ċĉĉ Ġ* Ġ 8 Ġ= Ġ 0 x 9 1 BCD Ċĉĉ Ġ* Ġ 9 Ġ= Ġ- 0 x 1 2 8 D Ċĉĉ Ġ* Ġ 1 0 Ġ= Ġ 0 x 9 9 E 9 9 Ċĉĉ Ġ* Ġ 1 1 Ġ= Ġ 0 x 9 8 1 2 Ċĉĉ Ġ*/ Ċĉ ĉ val Ġhash Parts : ĠInt Array Ċ ĉ ) Ġ{ Ċĉ ĉ override Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ Ċĉĉ ĉ if Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue Ċĉĉ ĉ if Ġ( java Class Ġ!= Ġother ?. java Class ) Ġreturn Ġfalse ĊĉĉĉĊĉĉ ĉ other Ġas ĠLicense File ĊĉĉĉĊĉĉ ĉ if Ġ( version Ġ!= Ġother . version ) Ġreturn Ġfalse Ċĉĉ ĉ if Ġ( product Ġ!= Ġother . product ) Ġreturn Ġfalse Ċĉĉ ĉ if Ġ( username Ġ!= Ġother . username ) Ġreturn Ġfalse Ċĉĉ ĉ if Ġ( password Ġ!= Ġother . password ) Ġreturn Ġfalse Ċĉĉ ĉ if Ġ( timestamp Ġ!= Ġother . timestamp ) Ġreturn Ġfalse Ċĉĉ ĉ if Ġ(! hash Parts . content Equals ( other . hash Parts )) Ġreturn Ġfalse ĊĉĉĉĊĉĉ ĉ return Ġtrue Ċĉ ĉ } ĊĉĉĊĉ ĉ override Ġinline Ġfun ĠhashCode (): ĠInt Ġ{ Ċĉĉ ĉ var Ġresult Ġ= Ġversion Ċĉĉ ĉ result Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġusername . hashCode () Ċĉĉ ĉ result Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġproduct . hashCode () Ċĉĉ ĉ result Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġpassword . hashCode () Ċĉĉ ĉ result Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġtimestamp . hashCode () Ċĉĉ ĉ result Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġhash Parts . content HashCode () Ċĉĉ ĉ return Ġresult Ċĉ ĉ } Ċ ĉ } Ċ } Ċ