/* Ċ Ġ* ĠTencent Ġis Ġplease d Ġto Ġsupport Ġthe Ġopen Ġsource Ġcommunity Ġby Ġmaking ĠB K - CI Ġ èĵĿ é² ¸ æĮģ ç»Ń éĽĨ æĪĲ å¹³åı° Ġavailable . Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 9 ĠTH L ĠA 2 9 ĠLimited , Ġa ĠTencent Ġcompany . Ġ ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠB K - CI Ġ èĵĿ é² ¸ æĮģ ç»Ń éĽĨ æĪĲ å¹³åı° Ġis Ġlicensed Ġunder Ġthe ĠMIT Ġlicense . Ċ Ġ* Ċ Ġ* ĠA Ġcopy Ġof Ġthe ĠMIT ĠLicense Ġis Ġincluded Ġin Ġthis Ġfile . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠTerms Ġof Ġthe ĠMIT ĠLicense : Ċ Ġ* Ġ------------------------------------------------ --- Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ġof Ġthis Ġsoftware Ġand Ġassociated Ċ Ġ* Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ċ Ġ* Ġrights Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ċ Ġ* Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ċ Ġ* Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT Ċ Ġ* ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN Ċ Ġ* ĠNO ĠEVENT ĠSHALL ĠTHE ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER ĠLIABILITY , Ċ Ġ* ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE Ċ Ġ* ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġcom . tencent . devops . common . webhook . service . code Ċ Ċ import Ġcom . tencent . devops . common . api . enums . Sc m Type Ċ import Ġcom . tencent . devops . common . api . exception . ErrorCode Exception Ċ import Ġcom . tencent . devops . common . api . util . DH Util Ċ import Ġcom . tencent . devops . common . client . Client Ċ import Ġcom . tencent . devops . repository . api . Service Oauth Resource Ċ import Ġcom . tencent . devops . repository . api . scm . Service Sc m Oauth Resource Ċ import Ġcom . tencent . devops . repository . api . scm . Service Sc m Resource Ċ import Ġcom . tencent . devops . repository . pojo . Code Git Repository Ċ import Ġcom . tencent . devops . repository . pojo . Code Git lab Repository Ċ import Ġcom . tencent . devops . repository . pojo . Code T Git Repository Ċ import Ġcom . tencent . devops . repository . pojo . Repository Ċ import Ġcom . tencent . devops . repository . pojo . enums . Repo Auth Type Ċ import Ġcom . tencent . devops . repository . pojo . enums . TokenType Enum Ċ import Ġcom . tencent . devops . scm . pojo . Git Mr Change Info Ċ import Ġcom . tencent . devops . scm . pojo . Git Mr Info Ċ import Ġcom . tencent . devops . scm . pojo . Git Mr Review Info Ċ import Ġcom . tencent . devops . ticket . api . Service Credential Resource Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġjava . util . Base 6 4 Ċ Ċ @ Suppress (" ALL ") Ċ @ Service Ċ class ĠGit Sc m Service Ġ@ Autowired Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġclient : ĠClient Ċ ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( Git Sc m Service :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Merge Request Review ers Info ( ĊĠĠĠĠĠĠĠ ĠprojectId : ĠString , ĊĠĠĠĠĠĠĠ Ġmr Id : ĠLong ?, ĊĠĠĠĠĠĠĠ Ġrepo : ĠRepository ĊĠĠĠ Ġ): ĠGit Mr Review Info ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= ĠgetType ( repo ) ĊĠĠĠĠĠĠĠ Ġif Ġ( mr Id Ġ== Ġnull Ġ|| Ġtype Ġ== Ġnull ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Type Ġ= Ġif Ġ( type . first Ġ== ĠRepo Auth Type . O AUTH ) ĠToken TypeEnum . O AUTH Ġelse ĠToken TypeEnum . PRIVATE _ KEY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= ĠgetToken ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= ĠprojectId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcredential Id Ġ= Ġrepo . credential Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserName Ġ= Ġrepo . userName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauth Type Ġ= Ġtoken Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type . first Ġ== ĠRepo Auth Type . O AUTH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . get ( Service Sc m Oauth Resource :: class ). getM r Review Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectName Ġ= Ġrepo . projectName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġrepo . url , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype . second , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġtoken , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmr Id Ġ= Ġmr Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . get ( Service Sc m Resource :: class ). getM r Review Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectName Ġ= Ġrepo . projectName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġrepo . url , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype . second , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġtoken , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmr Id Ġ= Ġmr Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" fail Ġto Ġget Ġmr Ġreviews Ġinfo ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Merge Request Info ( ĊĠĠĠĠĠĠĠ ĠprojectId : ĠString , ĊĠĠĠĠĠĠĠ Ġmr Id : ĠLong ?, ĊĠĠĠĠĠĠĠ Ġrepo : ĠRepository ĊĠĠĠ Ġ): ĠGit Mr Info ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= ĠgetType ( repo ) ĊĠĠĠĠĠĠĠ Ġif Ġ( mr Id Ġ== Ġnull Ġ|| Ġtype Ġ== Ġnull ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Type Ġ= Ġif Ġ( type . first Ġ== ĠRepo Auth Type . O AUTH ) ĠToken TypeEnum . O AUTH Ġelse ĠToken TypeEnum . PRIVATE _ KEY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= ĠgetToken ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= ĠprojectId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcredential Id Ġ= Ġrepo . credential Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserName Ġ= Ġrepo . userName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauth Type Ġ= Ġtoken Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type . first Ġ== ĠRepo Auth Type . O AUTH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . get ( Service Sc m Oauth Resource :: class ). getM r Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectName Ġ= Ġrepo . projectName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġrepo . url , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype . second , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġtoken , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmr Id Ġ= Ġmr Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . get ( Service Sc m Resource :: class ). getM r Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectName Ġ= Ġrepo . projectName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġrepo . url , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype . second , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġtoken , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmr Id Ġ= Ġmr Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" fail Ġto Ġget Ġmr Ġinfo ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Merge Request Change Info ( ĊĠĠĠĠĠĠĠ ĠprojectId : ĠString , ĊĠĠĠĠĠĠĠ Ġmr Id : ĠLong ?, ĊĠĠĠĠĠĠĠ Ġrepo : ĠRepository ĊĠĠĠ Ġ): ĠGit Mr Change Info ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= ĠgetType ( repo ) ĊĠĠĠĠĠĠĠ Ġif Ġ( mr Id Ġ== Ġnull Ġ|| Ġtype Ġ== Ġnull ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Type Ġ= Ġif Ġ( type . first Ġ== ĠRepo Auth Type . O AUTH ) ĠToken TypeEnum . O AUTH Ġelse ĠToken TypeEnum . PRIVATE _ KEY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= ĠgetToken ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= ĠprojectId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcredential Id Ġ= Ġrepo . credential Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserName Ġ= Ġrepo . userName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauth Type Ġ= Ġtoken Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type . first Ġ== ĠRepo Auth Type . O AUTH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . get ( Service Sc m Oauth Resource :: class ). get Merge Request Change Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectName Ġ= Ġrepo . projectName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġrepo . url , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype . second , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġtoken , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmr Id Ġ= Ġmr Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . get ( Service Sc m Resource :: class ). get Merge Request Change Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectName Ġ= Ġrepo . projectName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġrepo . url , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype . second , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġtoken , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmr Id Ġ= Ġmr Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" fail Ġto Ġget Ġmr Ġinfo ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetToken ( projectId : ĠString , Ġcredential Id : ĠString , ĠuserName : ĠString , Ġauth Type : ĠToken TypeEnum ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( auth Type Ġ== ĠToken TypeEnum . O AUTH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . get ( Service Oauth Resource :: class ). git Get ( userName ). data ?. accessToken Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpair Ġ= ĠDH Util . init Key () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencoder Ġ= ĠBase 6 4 . get Encoder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdecoder Ġ= ĠBase 6 4 . get Decoder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcredential Result Ġ= Ġclient . get ( Service Credential Resource :: class ). get ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= ĠprojectId , Ġcredential Id Ġ= Ġcredential Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpublicKey Ġ= Ġencoder . encode ToString ( pair . publicKey ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( credential Result . isNot Ok () Ġ|| Ġcredential Result . data Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠErrorCode Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorCode Ġ= Ġcredential Result . status . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Message Ġ= Ġcredential Result . message ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcredential Ġ= Ġcredential Result . data !! ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠString ( DH Util . decrypt ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġdecoder . decode ( credential . v 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpart B PublicKey Ġ= Ġdecoder . decode ( credential . publicKey ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpart AP rivate Key Ġ= Ġpair . privateKey ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetType ( repo : ĠRepository ): ĠPair < Repo Auth Type ?, ĠS cm Type >? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( repo ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCode Git Repository Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( repo . auth Type , ĠS cm Type . CODE _ GIT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCode T Git Repository Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( repo . auth Type , ĠS cm Type . CODE _ T GIT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCode Git lab Repository Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( Repo Auth Type . HTTP , ĠS cm Type . CODE _ GIT LAB ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ