package Ġcom . nic op asso . kotlin playground Ċ Ċ import Ġandroid . graphics . Type face Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . support . annotation . Color Res Ċ import Ġandroid . support . v 7 . app . AppCompatActivity Ċ import Ġandroid . text . Sp ann able String Ċ import Ġandroid . text . Sp anned Ċ import Ġandroid . text . style . Relative Size Span Ċ import Ġandroid . text . style . Style Span Ċ import Ġandroid . util . Log Ċ import Ġandroid . widget . Button Ċ import Ġandroid . widget . RadioButton Ċ import Ġandroid . widget . TextView Ċ import Ġcom . nic op asso . kotlin playground . con ventions . Fraction Ċ import Ġcom . nic op asso . kotlin playground . con ventions . get Ċ import Ġcom . nic op asso . kotlin playground . con ventions . inc Ċ import Ġjava . util .* Ċ Ċ // ************************************************ **** Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEXT ENSION ĠFUNCTIONS Ċ // ************************************************ **** Ċ infix Ġfun ĠInt . divide By ( number : ĠInt ) Ġ= Ġthis Ġ/ Ġnumber Ċ Ċ fun Ġ< T > ĠArray < T >. drop First () Ġ= Ġdrop ( 0 ) Ċ Ċ fun ĠAppCompatActivity . debug Log ( message : ĠString ) Ġ= ĠLog . d ( this :: java Class . name , Ġmessage ) Ċ Ċ operator Ġfun ĠString . get ( range : ĠInt Range ): ĠString ? Ġ{ ĊĠĠĠ Ġvar Ġsubstring : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġif Ġ( range . first Ġ>= Ġ 0 Ġ&& Ġrange . end Inclusive Ġ< Ġlength ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsubstring Ġ= Ġthis . substring ( range ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġsubstring Ċ } Ċ Ċ operator Ġfun ĠClosed Range < Fraction >. iterator () Ġ= ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠIterator < Fraction > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurr : ĠFraction Ġ= Ġstart ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Next () Ġ= Ġcurr Ġ<= Ġend Inclusive ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext () Ġ= Ġcurr ++ ĊĠĠĠĠĠĠĠ Ġ} Ċ // ******************************************************** ĊĊ Ċ // ******************************************************** Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRE IFI ED ĠIN ĠACTION Ċ // ******************************************************** Ċ /** In Ġan Ġordinary Ġgeneric Ġfunction Ġwe Ġcan 't Ġaccess Ġthe Ġtype ĠT Ġbecause Ġit 's ĠER ASE D Ġat Ġruntime Ġand Ċ it Ġis ĠONLY ĠA VA IL ABLE ĠAT ĠCOMPI LE ĠTIME ! ĠTherefore , Ġif Ġwe Ġwant Ġto Ġuse Ġthe Ġgeneric Ġtype Ġas Ġa Ġnormal ĠClass Ċ in Ġthe Ġfunction Ġbody , Ġwe Ġneed Ġto ĠEX PL IC IT LY ĠPASS ĠTHE ĠCLASS ĠAS ĠA ĠPARAMETER Ġlike Ġc : ĠClass < T > Ġin Ġthe Ġexample Ċ If Ġwe Ġuse Ġan Ġinline Ġfunction Ġwith Ġa Ġre ified Ġgeneric Ġtype ĠT , Ġthe Ġvalue Ġof ĠT Ġcan Ġbe Ġaccessed Ġeven Ġat Ġruntime .*/ Ċ fun Ġ< T > Ġmy Generic Fun ( c : ĠClass < T >) Ġ{} Ċ Ċ /** ĠThe Ġre ified Ġtypes Ġcan Ġonly Ġbe Ġused Ġin Ġcombination Ġwith Ġinline Ġfunctions : Ġinline Ġmakes Ġthe Ġcompiler Ġcopy Ċ the Ġfunction 's ĠBYTE CODE Ġinto Ġevery Ġplace Ġwhere Ġthe Ġfunction Ġis Ġbeing Ġcalled . ĠWhen Ġwe Ġcall Ġan Ġinline Ġfunction Ġwith Ġre ified Ġtype , Ċ the Ġcompiler Ġknows Ġthe Ġactual Ġtype Ġused Ġas Ġa Ġtype Ġargument Ġand ĠMO DI FI ES ĠTHE ĠGENERATED ĠBYTE CODE Ġto Ċ Ġuse Ġthe Ġcorresponding Ġclass Ġdirectly . Ġ*/ Ċ inline Ġfun Ġ< re ified ĠE > Ġmy Re ified Generic Fun () Ġ{} Ċ Ċ /* Ġfun Ġ< T > ĠString . to Kotlin Object (): ĠT Ġ{ ĊĠĠĠ Ġval Ġmapper Ġ= Ġj ack son ObjectMapper () ĊĠĠĠ Ġ// does Ġnot Ġcompile ĊĠĠĠ Ġreturn Ġmapper . readValue ( JsonObject ( this ). encode (), ĠT :: class . java ) Ġ// Error : ĠCannot Ġuse Ġ' T ' Ġas Ġre ified Ġparameter . Ċ }*/ Ċ Ċ /* ĠNO ĠMO RE ĠERR ORS ĠAT ĠCOMPI LE ĠTIME ! Ċ Ċ inline Ġfun Ġ< re ified ĠT > ĠString . to Kotlin Object (): ĠT Ġ{ ĊĠĠĠ Ġval Ġmapper Ġ= Ġj ack son ObjectMapper () ĊĠĠĠ Ġreturn Ġmapper . readValue ( JsonObject ( this ). encode (), ĠT :: class . java ) Ċ } Ċ Ċ usage : Ġ"{} ". to Kotlin Object < My Json Type >() Ċ */ Ċ Ċ // IMPORTANT : Ġinline Ġre ified Ġfunctions Ġare Ġnot Ġcallable Ġfrom ĠJava , Ġwhereas Ġnom ral Ġinline Ġfunctions Ġare . Ċ // ******************************************************** Ċ Ċ interface ĠClick able Ġ{ ĊĠĠĠ Ġfun Ġclick () ĊĠĠĠ Ġfun Ġshow Off () Ġ= Ġprintln (" I 'm Ġclick able ") Ġ// so - called Ġ" default " Ġimplementation Ċ } Ċ Ċ interface ĠFocus able Ġ{ ĊĠĠĠ Ġfun Ġset Focus ( b : ĠBoolean ) Ġ= Ġprintln (" I Ġ${ if Ġ( b ) Ġ" got " Ġelse Ġ" lost "} Ġfocus .") ĊĠĠĠ Ġfun Ġshow Off () Ġ= Ġprintln (" I 'm Ġfocus able ") Ċ } Ċ Ċ // It 's Ġpossible Ġto Ġextend Ġa Ġclass Ġthat Ġimplements Ġa Ġspecific Ġinterface Ċ fun Ġ< T Ġ: ĠClick able > ĠT . double Click () Ġ= Ġprintln (" Double Ġclick Ġ${ this :: java Class }") Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity (), ĠClick able , ĠFocus able Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġshow Off () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper < Clickable >. show Off () ĊĠĠĠĠĠĠĠ Ġsuper < Focus able >. show Off () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġmap Of ( 1 Ġto Ġ" one ", Ġ 7 Ġto Ġ" se ven ") ĊĠĠĠĠĠĠĠ Ġval Ġ( number , Ġname ) Ġ= Ġ 1 Ġto Ġ" one " ĊĠĠĠĠĠĠĠ Ġval Ġnew Number Ġ= Ġ 7 Ġdivide By Ġrandom Num () ĊĊĠĠĠĠĠĠĠ Ġval Ġchars Ġ= ĠarrayOf ( 1 , Ġ 2 , Ġ 3 ) ĊĠĠĠĠĠĠĠ Ġchars . drop First (). all Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ== Ġchars . first () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/ **************************************************************** *** ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġwith : ĠLog ically Ġgrouped Ġcalls Ġon Ġan Ġobject ĊĠĠĠĠĠĠĠĠ Ġ* Ġapply : Ġinitialization Ġor Ġconfiguration ĊĠĠĠĠĠĠĠĠ Ġ* Ġlet : Ġnull ability Ġcheck Ġ+ Ġconversion Ġof Ġsingle Ġobjects Ġ( instead Ġof Ġmap ) ĊĠĠĠĠĠĠĠĠ Ġ* Ġalso : Ġanc iliary / side Ġeffect - y Ġcode Ġin Ġchains ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ***************************************************************** **/ ĊĠĠĠĠĠĠĠ Ġwith ( new Number ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// replacement Ġfor Ġthe ĠBuilder Ġpattern Ġ( when Ġthe Ġclass Ġhas Ġno Ġbuilder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdivide By ( 7 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdivided By Se ven : ĠInt Ġ= Ġnew Number . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġdivide By Ġ 7 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdivided By E ight : ĠInt Ġ= Ġnew Number . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġdivide By Ġ 7 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġdivide By Ġ 8 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcurrent Repo : ĠString ? Ġ= Ġ" hello " ĊĠĠĠĠĠĠĠ Ġ// Do Ġsomething Ġwhen Ġrepo Ġis Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġrepo Ġ= Ġcurrent Repo Ġ?: Ġrun Ġ{ Ġinitialize Repo () Ġ} Ġ// nice Ġuse Ġof Ġrun ĊĊĠĠĠĠĠĠĠ Ġval Ġradio Button Ġ= ĠRadio Button ( this ) ĊĠĠĠĠĠĠĠ Ġradio Button Ġcreate Chip With Color ĠR . color . abc _ color _ highlight _ material ĊĊĠĠĠĠĠĠĠ Ġ/* launch ( UI ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpost Ġ= Ġsubmit Post ( 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġradio Button . text Ġ= Ġpost ĊĠĠĠĠĠĠĠ Ġ}*/ ĊĊĊĠĠĠĠĠĠĠ Ġ// range ĊĠĠĠĠĠĠĠ Ġvar Ġg reeting Ġ= Ġ" Hello , Ġworld !" ĊĠĠĠĠĠĠĠ Ġval Ġcomma Ġ= Ġg reeting . indexOf (",") ĊĠĠĠĠĠĠĠ Ġval Ġrange : ĠInt Range Ġ= Ġcomma .. greeting . last Index ĊĠĠĠĠĠĠĠ Ġcomma . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg reeting Ġ= Ġg reeting . replace Range ( range , Ġ" again ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdebug Log ( greeting ) ĊĊĠĠĠĠĠĠĠ Ġ// Index ĊĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġ" abcdef " ĊĠĠĠĠĠĠĠ Ġfor Ġ(( i , Ġc ) Ġin Ġs . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("$ i : Ġ$ c ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ************************************************ ******* ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFr actions ĊĠĠĠĠĠĠĠ Ġ// ************************************************ ******* ĊĠĠĠĠĠĠĠ Ġval Ġsum Ġ= ĠFraction ( 2 , Ġ 3 ) Ġ+ ĠFraction ( 3 , Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġprintln (" Sum Ġnum erator : Ġ${ sum [ 0 ]} ") ĊĊĠĠĠĠĠĠĠ Ġval Ġfrac Range Ġ= ĠFraction ( 1 , Ġ 5 ) .. Fraction ( 5 , Ġ 7 ) ĊĠĠĠĠĠĠĠ Ġprintln ( Fraction ( 3 , Ġ 5 ) Ġin Ġfrac Range ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġfrac Range ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Next : Ġ$ i ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Dest ruct ing Ġdeclarations Ġ( it Ġcomes Ġby Ġdefault Ġwith Ġa Ġdata Ġclass ) ĊĠĠĠĠĠĠĠ Ġval Ġf Ġ= ĠFraction ( 2 , Ġ 3 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( a , Ġb ) Ġ= Ġf ĊĠĠĠĠĠĠĠ Ġprintln (" Dest ruct ed Ġf Ġto : Ġ($ a , Ġ$ b )") Ġ// prints Ġ" Dest ruct ed Ġf Ġto : Ġ( 2 , Ġ 3 ) Ġ! !!!! ! ĊĊĠĠĠĠĠĠĠ Ġ// Invoke ĊĠĠĠĠĠĠĠ Ġval Ġfrac Ġ= ĠFraction ( 2 , Ġ 4 ) ĊĠĠĠĠĠĠĠ Ġfrac (" My Ġinvoke Ġprefix : Ġ") Ġ// prints Ġ" My Ġinvoke Ġprefix : Ġ 2 / 3 ĊĠĠĠĠĠĠĠ Ġ// Translated Ġby Ġthe Ġcompiler Ġto Ġfrac . invoke (" My Ġinvoke Ġprefix : Ġ") ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/ ************************************************************************ *** ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWH ICH ĠONE ĠIS ĠB ET TER ? ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ************************************************************************* **/ ĊĠĠĠ Ġ// 1 ĊĠĠĠ Ġdata Ġclass ĠPin ( val Ġcreator : ĠString ?) ĊĠĠĠ Ġfun Ġupdate Avatar ( pin : ĠPin , Ġbutton : ĠButton ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcreator Ġ= Ġpin . creator ĊĠĠĠĠĠĠĠ Ġif Ġ( creator Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbutton . text Ġ= Ġcreator ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ/* Generated Ġcode ĊĠĠĠ Ġpublic Ġstatic Ġfinal Ġvoid Ġupdate Avatar (@ NotNull ĠPin Ġpin , Ġ@ NotNull ĠButton Ġbutton ) Ġ{ ĊĠĠĠĠĠĠĠ ĠIntr insics . check Parameter IsNotNull ( pin , Ġ" pin "); ĊĠĠĠĠĠĠĠ ĠIntr insics . check Parameter IsNotNull ( button , Ġ" button "); ĊĠĠĠĠĠĠĠ ĠString Ġcreator Ġ= Ġpin . get Creator (); ĊĠĠĠĠĠĠĠ Ġif Ġ( creator Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbutton . setText ( creator ); ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}*/ ĊĊĊĠĠĠ Ġ// 2 ĊĠĠĠ Ġfun Ġupdate Avatar 2 ( pin : ĠPin , Ġbutton : ĠButton ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpin . creator ?. let Ġ{ Ġ// let Ġdoesn 't Ġhave Ġa ĠJava Ġequivalent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbutton . text Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ/* Generated Ġcode ĊĠĠĠ Ġpublic Ġstatic Ġfinal Ġvoid Ġupdate Avatar (@ NotNull ĠPin Ġpin , Ġ@ NotNull ĠButton Ġbutton ) Ġ{ ĊĠĠĠĠĠĠĠ ĠIntr insics . check Parameter IsNotNull ( pin , Ġ" pin "); ĊĠĠĠĠĠĠĠ ĠIntr insics . check Parameter IsNotNull ( button , Ġ" button "); ĊĠĠĠĠĠĠĠ ĠString Ġvar 1 0 0 0 0 Ġ= Ġpin . get Creator (); ĊĠĠĠĠĠĠĠ Ġif Ġ( var 1 0 0 0 0 Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠString Ġvar 2 Ġ= Ġvar 1 0 0 0 0 ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbutton . setText ( var 2 ); ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}*/ ĊĊĠĠĠ Ġ// If Ġwe 're Ġusing Ġan Ġoptimization Ġtool Ġlike ĠPro guard , Ġwe Ġactually Ġdon 't Ġcare . ĊĠĠĠ Ġ// For Ġus , Ġthose Ġ 2 Ġversions Ġare Ġequivalent ĊĊĠĠĠ Ġ/ ************************************************************************ *****/ ĊĊĊĠĠĠ Ġfun Ġinitialize Repo () Ġ{} ĊĊĠĠĠ Ġfun Ġtodo Test (): ĠList < List < Pair < String , ĠString >>> Ġ{ ĠTODO () Ġ} ĊĊĠĠĠ Ġfun Ġrandom Num (): ĠInt Ġ= ĠRandom (). nextInt () ĊĊĠĠĠ Ġoverride Ġfun Ġclick () Ġ= Ġprintln (" Click !") ĊĊĠĠĠ Ġval Ġis Hello Ġ= Ġ" hello " ĠIS Ġ" hello " ĊĊĠĠĠ Ġ/* // region ĠCO U ROUT IN ES ĊĠĠĠ Ġsuspend Ġfun Ġsubmit Post ( number : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsuspend Coroutine Ġ{ Ġcont Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmake Request ( number ) Ġ{ Ġresult , Ġerror Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( error Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcont . resume With Exception ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcont . resume ( result !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// the Ġsuspend Ġfunction Ġis Ġconverted Ġby Ġthe ĠJVM Ġinto : ĊĠĠĠ Ġ// ĠObject Ġsubmit Post ( int Ġnumber , ĠContinu ation < String > Ġcont ) Ġ{ Ġ... Ġ} ĊĊĠĠĠ Ġpublic Ġinterface ĠContinu ation < in ĠT > Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġval Ġcontext : ĠCor outine Context ĊĠĠĠĠĠĠĠ Ġpublic Ġfun Ġresume ( value : ĠT ) ĊĠĠĠĠĠĠĠ Ġpublic Ġfun Ġresume With Exception ( exc Throwable : ĠThrowable ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// endregion */ ĊĊĠĠĠ Ġ// region ĠIn fix Ġmethods ĊĠĠĠ Ġin fix Ġfun ĠString . IS ( some String : ĠString ) Ġ= Ġequals ( some String ) ĊĊĠĠĠ Ġin fix Ġfun ĠRadio Button . create Chip With Color (@ Color Res Ġbg Color : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Text ( Sp ann able String ( text . toString (). toUpperCase ()) Ġapply Span Chip Ġthis , ĠTextView . Buffer Type . SPAN N ABLE ) ĊĊĊĠĠĠ Ġin fix Ġfun ĠSp ann able String . apply Span Chip ( radioButton : ĠRadio Button ) Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġset Span ( Style Span ( Type face . BOLD ), Ġ 0 , Ġradio Button . text . length , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġset Span ( Relative Size Span ( 0 . 8 f ), Ġ 0 , Ġradio Button . text . length , ĠSp anned . SPAN _ EXCL USIVE _ EXCL USIVE ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// endregion Ċ } ĊĊ