package Ġtest Sus pension s Ċ Ċ import Ġjust 4 fun . kot link it . Result Ċ import Ġjust 4 fun . kot link it . S af ely Ċ import Ġjust 4 fun . kot link it . Thread Info . info Ċ import Ġjust 4 fun . kot link it . async . AsyncResult Ċ import Ġjust 4 fun . kot link it . async . Result Task State Ċ import Ġjust 4 fun . kot link it . async . Suspend Task Ċ import Ġjust 4 fun . kot link it . now Ċ import Ġjust 4 fun . kot link it . startTime Ċ import Ġjust 4 fun . kot link it . log L Ċ import Ġjust 4 fun . kot link it . rnd 0 Ċ import Ġjust 4 fun . kot link it . rnd Chance Ċ import Ġjava . util . concurrent . ExecutorService Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlin . concurrent . thread Ċ import Ġkotlin . coroutines . experimental . Abstract Coroutine Context Element Ċ import Ġkotlin . coroutines . experimental . Continuation Ċ import Ġkotlin . coroutines . experimental . Continuation Interceptor Ċ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ Ċ ĉ S Interceptor . shared Executor Ġ= ĠExec utors . new Single Thread Executor ({ ĠThread ( it , Ġ" shared ") Ġ}) Ċ ĉ test () Ċ } Ċ Ċ var ĠNext ID Ġ= Ġ 0 Ċ val Ġmax level Ġ= Ġ 3 Ċ val ĠSleep Ġ= Ġ 1 0 0 L Ċ val Ġduration Sec Ġ= Ġ 6 0 Ġ* Ġ 6 0 Ġ* Ġ 8 Ċ val Ġdeadline Ġ= Ġnow () Ġ+ Ġduration Sec Ġ* Ġ 1 0 0 0 Ċ var Ġroot : ĠConfig ? Ġ= Ġnull Ċ Ċ fun Ġtest () Ġ{ Ċ ĉ startTime Ġ= ĠSystem . currentTimeMillis () Ċ ĉ root Ġ= ĠConfig () Ċ // ĉ ĉ root Ġ= Ġgen () Ċ ĉ val Ġcfg Ġ= Ġroot !! Ċ ĉ val Ġbuff Ġ= ĠStringBuilder () Ċ ĉ cfg . pr n ( buff ) Ċ ĉ println ("$ buff ") Ċ ĉ val Ġtask Ġ= ĠS Task ( cfg ) Ċ ĉ task . run (). onComplete Ġ{ Ċĉ ĉ val Ġtotal Ġ= Ġtask . config . total Ċĉ ĉ log L ( 2 , Ġtask , Ġ" RESULT = Ġ${ it . exception ?. pr n () Ġ?: Ġit . value } ĠĠĠ Ġfrom Ġ$ total ") Ċĉ ĉ Thread . sleep ( 6 0 0 ) Ċĉ ĉ val Ġexpect Ġ= Ġtask . config . result () Ċĉ ĉ if Ġ( expect Ġ!= Ġit . value Or ( 0 )) Ġ{ Ċĉĉ ĉ cfg . failed Ġ= Ġtrue Ċĉĉ ĉ log L ( 2 , Ġtask , Ġ" Expect Ġ= Ġ$ expect ĠVS Ġ ĠActual = Ġ${ it . value Or ( 0 )} ĠĠ Ġ!!! Ġ Ġ-------------------------------- ------- ") Ċĉ ĉ } Ċ // ĉ ĉ if Ġ( task . config . is Dirty Inter rupted ) Ġcfg . failed Ġ= Ġtrue Ċĉ ĉ println ( if Ġ( cfg . is Failed ) Ġ" O ops .. Ġ Ġ!!! Ġ ĠFAILED " Ġelse Ġ"\ n \ n \ n \ n \ n \ n \ n ") Ċĉ ĉ if Ġ( now () Ġ< Ġdeadline Ġ&& Ġ! cfg . is Failed ) Ġ{ Ċ // ĉĉ ĉ Thread . sleep ( 1 0 0 ) Ċĉĉ ĉ test () Ċĉ ĉ } Ġelse Ġ{ Ċĉĉ ĉ S Interceptor . shared Executor !!. shutdown () Ċĉĉ ĉ S Interceptor . shared Executor !!. await Termination ( 2 0 0 0 , ĠTimeUnit . MILLISECONDS ) Ċĉ ĉ } Ċ ĉ } Ċ } Ċ Ċ fun ĠThrowable . pr n () Ġ= Ġ"${ java Class . simple Name }${ if Ġ( message Ġ== Ġnull ) Ġ"" Ġelse Ġmessage }" ĊĊĊ Ċ class ĠS Task ( val Ġconfig : ĠConfig ): ĠS uspend Task < Int >() Ġ{ Ċ ĉ init Ġ{ Ċĉ ĉ config . task Ġ= Ġthis Ċĉ ĉ if Ġ( config . name Ġ== Ġ" x ") Ġconfig . init () Ċĉ ĉ log L ( 2 , Ġthis , Ġ"${ config . interceptor Id } Ġ Ġ${ config . child s . size } Ġx Ġ${ config . cancel }") Ċ ĉ } ĊĉĊ ĉ fun Ġrun (): ĠAsync Result < Int > Ġ= Ġstart ( config . interceptor ) Ġ{ Ġsuspend () Ġ} Ċ ĉ suspend Ġfun Ġrun Sus pended (): ĠResult < Int > Ġ{ Ċĉ ĉ var Ġexecuted Ġ= Ġfalse Ċĉ ĉ try Ġ{ Ċĉĉ ĉ return Ġstart Sus pended ( config . interceptor ) Ġ{ Ġexecuted Ġ= Ġtrue ; Ġsuspend () Ġ} Ċĉ ĉ } Ġfinally Ġ{ Ċĉĉ ĉ if Ġ(! executed ) Ġconfig . cancelled Ġ= Ġis Cancelled Ċĉ ĉ } Ċ ĉ } ĊĉĊ ĉ suspend Ġfun Ġsuspend (): ĠInt Ġ{ Ċĉ ĉ log L ( 2 , Ġthis , Ġ" âĹ ĭ Ġ Ġ${ if Ġ( is Cancelled ) Ġ" Ġ ĠCancel led " Ġelse Ġ"" }") Ċĉ ĉ config . check Intercept ( config . parent ) Ċĉ ĉ config . sum Ġ= Ġ 0 Ċĉ ĉ if Ġ( config . child s . isEmpty ()) Ġ{ Ċĉĉ ĉ if Ġ( config . cancel Ġ== Ġ 0 ) Ġdo Cancel ( null ) Ċĉĉ ĉ S af ely ({ ĠThread . sleep ( Sleep ) Ġ}, Ġ{ Ġlog L ( 2 , Ġthis , Ġ" inter rupted Ġ") Ġ}) Ċĉ ĉ } Ċĉ ĉ // Ċĉ ĉ config . child s . forEach Indexed Ġ{ Ġn , Ġchild Ġ-> Ċĉĉ ĉ if Ġ( config . cancel Ġ== Ġn ) Ġdo Cancel ( child ) Ċĉĉ ĉ S af ely ({ ĠThread . sleep ( Sleep ) Ġ}, Ġ{ Ġlog L ( 2 , Ġthis , Ġ" inter rupted Ġ") Ġ}) Ċĉĉ ĉ // Ċĉĉ ĉ val Ġtask Ġ= ĠS Task ( child ) Ċĉĉ ĉ val Ġres Ġ= ĠS af ely Ġ{ Ġtask . run Sus pended () Ġ} Ċĉĉ ĉ log L ( 2 , Ġtask , Ġ" Res = Ġ${ res ?. exception ?. pr n () Ġ?: Ġres ?. value Ġ?: Ġ" see Ġred Ġmessage Ġ!!! "} ") Ċĉĉ ĉ // ĉĉ ĉ check Inter rupted ( task ) Ċĉĉ ĉ config . check Intercept ( child ) Ċĉĉ ĉ // Ċĉĉ ĉ val Ġv Ġ= Ġres ?. value Or ( 0 ) Ġ?: Ġ 0 Ċĉĉ ĉ config . sum Ġ+= Ġv Ċĉ ĉ } Ċĉ ĉ // Ċĉ ĉ check Cancel () Ċĉ ĉ config . sum ++ Ċĉ ĉ if Ġ( config . interceptor Opt Ġ== Ġ 2 ) Ġconfig . interceptor ?. shutdown () Ċĉ ĉ return Ġconfig . sum Ċ ĉ } ĊĉĊ ĉ fun Ġdo Cancel ( child : ĠConfig ?) Ġ= Ġthread Ġ{ Ċĉ ĉ Thread . sleep ( Sleep Ġ/ Ġ 3 ) Ċĉ ĉ val Ġcancell er Ġ= Ġchoose C ancell er ( config , Ġ 1 0 ) Ċĉ ĉ synchron ize Ġ{ Ċĉĉ ĉ if Ġ( c ancell er . task !!. is Complete ) Ġreturn @ thread Ċĉĉ ĉ log L ( 2 , Ġcancell er , Ġ" cancel ") Ċĉĉ ĉ child ?. cancel Self And Child s ( null ) Ċĉĉ ĉ var Ġch Cfg : ĠConfig ? Ġ= Ġchild Ċĉĉ ĉ var Ġpar Cfg : ĠConfig ? Ġ= Ġconfig Ċĉĉ ĉ while Ġ( par Cfg Ġ!= Ġnull ) Ġ{ Ċĉĉĉ ĉ par Cfg !!. cancel Self And Child s ( ch Cfg ) Ċĉĉĉ ĉ if Ġ( par Cfg Ġ=== Ġcancell er ) Ġbreak Ċĉĉĉ ĉ ch Cfg Ġ= Ġpar Cfg Ċĉĉĉ ĉ par Cfg Ġ= Ġpar Cfg !!. parent Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ c ancell er . task !!. cancel ( O ops (), Ġtrue ) Ċĉ ĉ var Ġpar Cfg : ĠConfig ? Ġ= Ġconfig Ċĉ ĉ while Ġ( par Cfg Ġ!= Ġnull ) Ġ{ Ċĉĉ ĉ par Cfg !!. task !!. check Cancel () Ċĉĉ ĉ if Ġ( par Cfg Ġ=== Ġcancell er ) Ġbreak Ċĉĉ ĉ par Cfg Ġ= Ġpar Cfg !!. parent Ċĉ ĉ } Ċ ĉ } ĊĉĊ ĉ fun Ġchoose C ancell er ( curr : ĠConfig , Ġchance : ĠInt ): ĠConfig Ġ= ĊĉĠ Ġif Ġ( chance Ġ>= Ġ 2 Ġ&& Ġcurr . parent Ġ!= Ġnull Ġ&& Ġrnd Chance ( chance )) Ġchoose C ancell er ( curr . parent !! , Ġchance Ġ/ Ġ 2 ) ĊĉĠ Ġelse Ġcurr ĊĉĊ ĉ fun Ġcheck Cancel () Ġ{ Ċĉ ĉ if Ġ( config . cancelled Ġ!= Ġis Cancelled ) Ġ{ Ċĉĉ ĉ config . failed Ġ= Ġtrue Ċĉĉ ĉ log L ( 2 , Ġthis , Ġ" Should Ġ${ if Ġ( is Cancelled ) Ġ"" Ġelse Ġ" Ġnot "} Ġbe Ġcancelled Ġ!!! Ġ-------------------------------- -------------- ") Ċĉ ĉ } Ċ ĉ } ĊĉĊ ĉ fun Ġcheck Inter rupted () Ġ{ Ċĉ ĉ if Ġ( Thread . currentThread (). is Inter rupted Ġ!= Ġis Cancelled ) Ġ{ Ċĉĉ ĉ config . failed Ġ= Ġtrue Ċĉĉ ĉ log L ( 2 , Ġthis , Ġ" Should Ġ${ if Ġ( is Cancelled ) Ġ"" Ġelse Ġ" Ġnot "} Ġbe Ġinterrupted Ġ!!! Ġ-------------------------------- -------------- ") Ċĉ ĉ } Ċ ĉ } ĊĉĊ ĉ override Ġfun ĠtoString () Ġ= Ġconfig . toString () Ċ } ĊĊĊĊ Ċ class ĠConfig ( var Ġinterceptor Opt : ĠInt Ġ= Ġ- 1 , Ġvar Ġcancel : ĠInt Ġ= Ġ- 1 , Ġvar arg Ġchild s : ĠConfig ) Ġ{ Ċ ĉ var Ġparent : ĠConfig ? Ġ= Ġnull Ċ ĉ var Ġname : ĠString Ġ= Ġ" x " // Ġ= Ġid . pad End (( max level Ġ- Ġ 1 ) Ġ* Ġ 2 , Ġ'\ t ') Ċ ĉ var Ġinterceptor : ĠS Interceptor ? Ġ= Ġif Ġ( interceptor Opt Ġ< Ġ 0 ) Ġnull Ġelse Ġgen Interceptor ( interceptor Opt ) Ċ ĉ var Ġchild s : ĠArray < out ĠConfig > Ġ= Ġchild s Ċ ĉ var Ġtask : ĠS Task ? Ġ= Ġnull Ċ ĉ var Ġcancelled Ġ= Ġfalse Ċ ĉ var Ġthread : ĠThread Ġ= ĠThread . currentThread () Ċ ĉ var Ġthread Id Ġ= Ġ"" Ċ ĉ var Ġfailed Ġ= Ġfalse Ċ ĉ var Ġsum Ġ= Ġ- 1 ĊĉĊ ĉ fun Ġinit ( name : ĠString Ġ= Ġ" 0 ", Ġparent : ĠConfig ? Ġ= Ġnull ): ĠConfig Ġ{ Ċĉ ĉ this . name Ġ= Ġname Ċĉ ĉ this . parent Ġ= Ġparent Ċĉ ĉ if Ġ( interceptor Opt Ġ< Ġ 0 ) Ġrun Ġ{ Ġinterceptor Opt Ġ= Ġrnd 0 ( 2 ); interceptor Ġ= Ġgen Interceptor ( interceptor Opt ) Ġ} Ċĉ ĉ if Ġ( cancel Ġ< Ġ 0 Ġ&& Ġchild s . isEmpty ()) Ġ{ Ċĉĉ ĉ if Ġ( name . length Ġ<= Ġmax level ) Ġchild s Ġ= ĠArray ( rnd 0 ( 3 )) Ġ{ ĠConfig () Ġ} Ċĉĉ ĉ cancel Ġ= Ġif Ġ( child s . isEmpty ()) Ġrnd 0 ( max level ) Ġelse Ġrnd 0 ( child s . size Ġ* Ġ 2 Ġ+ Ġ 1 ) Ċĉ ĉ } Ċĉ ĉ child s . forEach Indexed Ġ{ Ġix , Ġch Ġ-> Ġch . init ( name Ġ+ Ġix , Ġthis ) Ġ} Ċĉ ĉ return Ġthis Ċ ĉ } ĊĉĊ ĉ fun Ġcancel Self And Child s ( after : ĠConfig ?) Ġ{ Ċĉ ĉ if Ġ( task Ġ!= Ġnull Ġ&& Ġtask !!. state Ġ== ĠResult Task State . EXECUT ED ) Ġreturn Ċĉ ĉ cancelled Ġ= Ġtrue Ċĉ ĉ if Ġ( child s . isEmpty ()) Ġreturn Ċĉ ĉ var Ġfound Ġ= Ġafter Ġ== Ġnull Ċĉ ĉ for Ġ( ch Ġin Ġchild s ) Ġ{ Ċĉĉ ĉ if Ġ( ch Ġ=== Ġafter ) Ġ{ Ċĉĉĉ ĉ found Ġ= Ġtrue ; Ġcontinue Ċĉĉ ĉ } Ċĉĉ ĉ if Ġ( found ) Ġch . cancel Self And Child s ( null ) Ċĉ ĉ } Ċ ĉ } ĊĉĊ ĉ val Ġis Cancelled Ġget (): ĠBoolean Ġ= Ġcancelled Ġ|| Ġparent ?. is Cancelled Ġ?: Ġfalse Ċ ĉ val Ġis Failed Ġget (): ĠBoolean Ġ= Ġfailed Ġ|| Ġchild s . any Ġ{ Ġit . is Failed Ġ} Ċ // ĉ val Ġis Dirty Inter rupted : ĠBoolean Ġget () Ġ{ Ċ // ĉ ĉ val Ġdirty Ġ= Ġtask Ġ!= Ġnull Ġ&& Ġtask !!. inter rupted Ċ // ĉ ĉ if Ġ( dirty ) Ġlog ( 2 , Ġthis , Ġ" Dirty Ġinter ruption ĠĠ Ġ!!! Ġ Ġ-------------------------------- ------- ") Ċ // ĉ ĉ return Ġdirty Ġ|| Ġchild s . any Ġ{ Ġit . is Dirty Inter rupted Ġ} Ċ // ĉ } ĊĉĊ ĉ val Ġtotal Ġget (): ĠInt Ġ= Ġ 1 Ġ+ Ġchild s . sum By Ġ{ Ġit . total Ġ} ĊĉĊ ĉ fun Ġresult (): ĠInt Ġ{ Ċĉ ĉ if Ġ( task Ġ!= Ġnull Ġ&& Ġcancelled Ġ!= Ġtask !!. is Cancelled ) Ġ{ Ċĉĉ ĉ failed Ġ= Ġtrue Ċĉĉ ĉ log L ( 2 , Ġthis , Ġ" Must Ġ${ if Ġ( task !!. is Cancelled ) Ġ"" Ġelse Ġ" Ġnot "} Ġbe Ġcancelled Ġ!!! Ġ-------------------------------- -------------- ") Ċĉ ĉ } Ċĉ ĉ return Ġ( if Ġ( is Cancelled ) Ġ 0 Ġelse Ġ 1 ) Ġ+ Ġchild s . sum By Ġ{ Ġit . result () Ġ} Ċ ĉ } ĊĉĊ ĉ fun Ġcheck Intercept ( success or : ĠConfig ?) Ġ{ Ċĉ ĉ thread Ġ= ĠThread . currentThread () Ċĉ ĉ thread Id Ġ= Ġinfo . get (). toString () Ċĉ ĉ if Ġ( success or Ġ== Ġnull Ġ|| Ġsuccess or . is Cancelled ) Ġreturn Ċĉ ĉ val Ġequal 1 Ġ= Ġsuccess or Ġ!= Ġparent Ġ&& Ġsuccess or . no Interceptor () ĊĉĉĠ Ġ|| Ġ( interceptor Opt Ġ!= Ġ 2 Ġ&& Ġ( interceptor Opt Ġ== Ġ 0 Ġ|| Ġinterceptor Opt Ġ== Ġsuccess or . interceptor Opt Ġ|| Ġ( success or . interceptor Opt Ġ== Ġ 0 Ġ&& Ġsuccess or . thread . name Ġ== Ġ" shared "))) Ċĉ ĉ val Ġequal 2 Ġ= Ġsuccess or . thread Ġ== Ġthread Ċĉ ĉ if Ġ( equal 1 Ġ!= Ġequal 2 ) Ġ{ Ċĉĉ ĉ failed Ġ= Ġtrue Ċĉĉ ĉ log L ( 2 , Ġthis , Ġ"$ thread Id Ġ[$ this ]: $ interceptor Id ĠĠ ĠVS ĠĠ Ġ${ success or . thread Id } Ġ[$ success or ]: ${ success or . interceptor Id }: Ġ Ġsame Ġic ps ? Ġ$ equal 1 ; Ġ Ġsame Ġth s ? Ġ$ equal 2 Ġ Ġ!!! Ġ-------------------------------- -------------- ") Ċĉ ĉ } Ċ ĉ } ĊĉĊ ĉ fun Ġno Interceptor (): ĠBoolean Ġ= Ġsum Ġ== Ġ- 1 Ġ|| Ġ( interceptor Opt Ġ== Ġ 0 Ġ&& Ġ( child s . isEmpty () Ġ|| Ġchild s . all Ġ{ Ġit . no Interceptor () Ġ})) ĊĉĊ ĉ val Ġinterceptor Id Ġget () Ġ= Ġif Ġ( interceptor Ġ== Ġnull ) Ġ"' X '" Ġelse Ġif Ġ( interceptor Ġ== ĠS Interceptor . shared ) Ġ"' S '" Ġelse Ġ"' N '" Ċ ĉ fun Ġgen Interceptor ( opt : ĠInt ): ĠS Interceptor ? Ġ= Ġwhen Ġ( opt ) Ġ{ Ċĉĉ 0 Ġ-> ĠS Interceptor . none Ċĉĉ 1 Ġ-> ĠS Interceptor . shared Ċĉ ĉ else Ġ-> ĠS Interceptor . new Ċ ĉ } ĊĉĊ ĉ fun Ġpr n ( buff : ĠStringBuilder ) Ġ{ Ċĉ ĉ if Ġ( name Ġ== Ġ" x ") Ġinit () Ċĉ ĉ buff . append (" ". pad Start ( name . length Ġ* Ġ 2 , Ġ'\ t ')). append (" [$ this ]: ĠĠ Ġ") Ċĉ ĉ buff . append ("$ interceptor Id Ġ Ġ${ child s . size } Ġx Ġ$ cancel ") Ċĉ ĉ buff . append ("\ n ") Ċĉ ĉ child s . forEach Ġ{ Ġit . pr n ( buff ) Ġ} Ċ ĉ } ĊĉĊ ĉ override Ġfun ĠtoString () Ġ= Ġname . pad End (( max level Ġ- Ġ 1 ) Ġ* Ġ 2 , Ġ'\ t ') Ċ } ĊĊĊĊ Ċ class ĠS Interceptor ( val Ġexecutor : ĠExecutor Service ): ĠAbstract Coroutine Context Element ( Continuation Interceptor ), ĠContinu ation Interceptor Ġ{ Ċ ĉ comp anion Ġobject Ġ{ Ċĉ ĉ var Ġshared Executor : ĠExecutor Service ? Ġ= Ġnull // Executors . new Cached ThreadPool () Ċĉ ĉ var Ġnone : ĠS Interceptor ? Ġ= Ġnull Ċĉ ĉ val Ġshared Ġby Ġlazy Ġ{ ĠS Interceptor ( shared Executor !! ) Ġ} Ċĉ ĉ val Ġnew Ġget () Ġ= ĠS Interceptor ( Executors . new Single Thread Executor ()) Ċ ĉ } ĊĉĊ ĉ fun Ġshutdown () Ġ= Ġexecutor . shutdown () Ċ ĉ override Ġfun Ġ< T > Ġintercept Continuation ( continu ation : ĠContinu ation < T >): ĠContinu ation < T > Ġ= Ġobject : ĠContinu ation < T > Ġ{ Ċĉ ĉ override Ġval Ġcontext Ġ= Ġcontinuation . context Ċĉ ĉ override Ġfun Ġresume ( value : ĠT ) Ġ= Ġexecutor . execute Ġ{ Ġcontinuation . resume ( value ) Ġ} Ċĉ ĉ override Ġfun Ġresume With Exception ( exception : ĠThrowable ) Ġ= Ġcontinuation . resume With Exception ( exception ) Ċ ĉ } Ċ } ĊĊ Ċ class ĠO ops : ĠException () Ċ Ċ fun Ġgen () Ġ= ĊĠ ĠConfig ( 0 , Ġ 1 0 , Ċ ĉ Config ( 0 , Ġ 1 0 , ĊĉĠ ĠConfig ( 0 , Ġ 0 , Ċĉ ĉ Config ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ) ĊĉĠ Ġ), ĊĉĠ ĠConfig ( 0 , Ġ 0 , Ċĉ ĉ Config ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ) ĊĉĠ Ġ), ĊĉĠ ĠConfig ( 0 , Ġ 0 , Ċĉ ĉ Config ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ) ĊĉĠ Ġ), ĊĉĠ ĠConfig ( 0 , Ġ 0 , Ċĉ ĉ Config ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ) ĊĉĠ Ġ) Ċ ĉ ), Ċ ĉ Config ( 0 , Ġ 1 0 , ĊĉĠ ĠConfig ( 0 , Ġ 0 , Ċĉ ĉ Config ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ) ĊĉĠ Ġ), ĊĉĠ ĠConfig ( 0 , Ġ 0 , Ċĉ ĉ Config ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ) ĊĉĠ Ġ), ĊĉĠ ĠConfig ( 0 , Ġ 0 , Ċĉ ĉ Config ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ) ĊĉĠ Ġ), ĊĉĠ ĠConfig ( 0 , Ġ 0 , Ċĉ ĉ Config ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ) ĊĉĠ Ġ) Ċ ĉ ), Ċ ĉ Config ( 0 , Ġ 1 0 , ĊĉĠ ĠConfig ( 0 , Ġ 0 , Ċĉ ĉ Config ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ) ĊĉĠ Ġ), ĊĉĠ ĠConfig ( 0 , Ġ 0 , Ċĉ ĉ Config ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ) ĊĉĠ Ġ), ĊĉĠ ĠConfig ( 0 , Ġ 0 , Ċĉ ĉ Config ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ) ĊĉĠ Ġ), ĊĉĠ ĠConfig ( 0 , Ġ 0 , Ċĉ ĉ Config ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ) ĊĉĠ Ġ) Ċ ĉ ), Ċ ĉ Config ( 0 , Ġ 1 0 , ĊĉĠ ĠConfig ( 0 , Ġ 0 , Ċĉ ĉ Config ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ) ĊĉĠ Ġ), ĊĉĠ ĠConfig ( 0 , Ġ 0 , Ċĉ ĉ Config ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ) ĊĉĠ Ġ), ĊĉĠ ĠConfig ( 0 , Ġ 0 , Ċĉ ĉ Config ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ) ĊĉĠ Ġ), ĊĉĠ ĠConfig ( 0 , Ġ 0 , Ċĉ ĉ Config ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ), ĠConfig ( 0 , Ġ 1 0 ) ĊĉĠ Ġ) Ċ ĉ ) ĊĠ Ġ) Ċ Ċ /** ĊĠĊ Ġ*/ Ċ