package Ġorg . k store . demo . stars Ċ Ċ import Ġj line . console . Console Reader Ċ import Ġorg . k store . demo . stars . game play . Game play Module Ċ import Ġorg . k store . demo . stars . menu . Menu Module Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . boot . Spring Application Ċ import Ġorg . springframework . context . ApplicationContext Ċ import Ġorg . springframework . context . annotation .* Ċ import Ġjava . util . concurrent . Count DownLatch Ċ import Ġjavax . annotation . Post Construct ĊĊ Ċ @ Configuration Ċ class ĠApplication Ġ{ ĊĊĠĠĠ Ġ@ Bean ĊĠĠĠ Ġfun Ġconsole Reader () Ġ= ĠConsole Reader ( System .` in `, ĠSystem . out ) ĊĊĠĠĠ Ġ@ Bean ĊĠĠĠ Ġfun Ġui Render Service ( console Reader : ĠConsole Reader ) Ġ= ĠUI Render Service ( console Reader ) ĊĊĠĠĠ Ġ@ Bean ĊĠĠĠ Ġfun Ġclose Latch () Ġ= ĠCount DownLatch ( 1 ) ĊĊĠĠĠ Ġ@ Bean ĊĠĠĠ Ġfun Ġerror Consumer () Ġ= ĠError Action Logger () ĊĊĠĠĠ Ġ@ Bean ĊĠĠĠ Ġfun Ġexit Consumer ( console Reader : ĠConsole Reader , Ġapplication Context : ĠApplication Context ) Ġ= ĠExit By Q Key Processor ( console Reader , Ġapplication Context ) ĊĊĠĠĠ Ġ@ Bean ĊĠĠĠ Ġfun Ġui Input Service ( console Reader : ĠConsole Reader ) Ġ= ĠUI Input Service ( console Reader ) ĊĊĠĠĠ Ġ@ Bean ĊĠĠĠ Ġfun Ġmenu Module ( application Context : ĠApplication Context ) Ġ= ĠMenu Module ( application Context ) ĊĊĠĠĠ Ġ@ Bean ĊĠĠĠ Ġfun Ġgame play Module ( application Context : ĠApplication Context ) Ġ= ĠGame play Module ( application Context ) ĊĊĠĠĠ Ġ@ Bean ĊĠĠĠ Ġfun Ġstart Game Processor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgame play Module : ĠGame play Module , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmenu Module : ĠMenu Module ĊĠĠĠ Ġ) Ġ= ĠStart Game Processor ( game play Module , Ġmenu Module ) ĊĊĠĠĠ Ġ@ Bean ĊĠĠĠ Ġfun Ġexit To Menu Processor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgame play Module : ĠGame play Module , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmenu Module : ĠMenu Module ĊĠĠĠ Ġ) Ġ= ĠExit To Menu Processor ( game play Module , Ġmenu Module ) ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġlateinit Ġvar Ġmenu Module : ĠMenu Module ĊĊĠĠĠ Ġ@ Post Construct ĊĠĠĠ Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ Ġmenu Module . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠSpring Application . run ( Application :: class . java , Ġ* args ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . register Shutdown Hook () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclose Latch Ġ= Ġcontext . getBean ( Count DownLatch :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRuntime . get Runtime (). add Shutdown Hook ( object Ġ: ĠThread () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose Latch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose Latch . await () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊĊ