package Ġy uk u . alk it ab . base . ac . base Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . drawable . Color Drawable Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . provider . Settings Ċ import Ġandroid . util . Typed Value Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġandroidx . annotation . Call Super Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġandroidx . core . app . Nav Utils Ċ import Ġandroidx . core . app . Task Stack Builder Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . core . content . res . Resources Compat Ċ import Ġcom . af ol le st ad . material dialogs . Material Dialog Ċ import Ġy uk u . af w . storage . Preferences Ċ import Ġy uk u . alk it ab . base . storage . Pref key Ċ import Ġy uk u . alk it ab . base . util . App Log Ċ import Ġy uk u . alk it ab . base . util . Request Codes Ċ import Ġy uk u . alk it ab . base . widget . Configuration Wrapper Ċ import Ġy uk u . alk it ab . base . widget . Localized Ċ import Ġy uk u . alk it ab . debug . R Ċ Ċ private Ġconst Ġval ĠTAG Ġ= Ġ" Base Activity " Ċ Ċ abstract Ġclass ĠBase Activity Ġ: ĠAppCompatActivity (), ĠActivity Compat . On Request Permissions Result Callback Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġwill Need Storage Permission : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġvar Ġlast Known Configuration SerialNumber Ġ= Ġ 0 ĊĊĠĠĠ Ġoverride Ġfun Ġattach Base Context ( base : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . attach Base Context ( Configuration Wrapper . wrap ( base )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĊĠĠĠĠĠĠĠ Ġapply Night Mode Colors () ĊĊĠĠĠĠĠĠĠ Ġval Ġcurrent Configuration SerialNumber Ġ= ĠConfiguration Wrapper . get Serial Counter () ĊĠĠĠĠĠĠĠ Ġif Ġ( last Known Configuration SerialNumber Ġ!= Ġcurrent Configuration SerialNumber ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApp Log . d ( TAG , Ġ" Re starting Ġactivity Ġ${ java Class . name } Ġbecause Ġof Ġconfiguration Ġchange Ġ$ last Known Configuration SerialNumber Ġ-> Ġ$ current Configuration SerialNumber ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Known Configuration SerialNumber Ġ= Ġcurrent Configuration SerialNumber ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecreate () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġapply Night Mode Colors () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġaction Ġbar Ġcolor , Ġstatus Ġbar Ġcolor , Ġback forward Ġbuttons Ġcolor ĊĠĠĠĠĠĠĠ Ġval Ġis Night Mode Ġ= ĠPreferences . getBoolean ( Pref key . is _ night _ mode , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġval Ġprimary Color Ġ= Ġif Ġ( is Night Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResources Compat . getColor ( resources , ĠR . color . primary _ night _ mode , Ġtheme ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTyped Value (). apply Ġ{ Ġtheme . resolve Attribute ( R . attr . color Primary , Ġthis , Ġtrue ) Ġ}. data ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġstatus Bar Color Ġ= Ġif Ġ( is Night Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠColor . BLACK ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResources Compat . getColor ( resources , ĠR . color . primary _ dark , Ġtheme ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsupport ActionBar ?. setBackground Drawable ( Color Drawable ( primary Color )) ĊĊĠĠĠĠĠĠĠ ĠfindViewById < View >( R . id . panel Back Forward List )?. background Ġ= ĠColor Drawable ( primary Color ) ĊĊĠĠĠĠĠĠĠ Ġwindow . status Bar Color Ġ= Ġstatus Bar Color ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCall Ġthis Ġfrom Ġsubclasses Ġbefore Ġsuper . onCreate () Ġto Ġmake ĊĠĠĠĠ Ġ* Ġthe Ġactivity Ġask Ġfor Ġstorage Ġpermission Ġand Ġdo Ġnot Ġproceed ĊĠĠĠĠ Ġ* Ġif Ġthe Ġpermission Ġis Ġnot Ġgranted . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġwill Need Storage Permission () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . will Need Storage Permission Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġlast Known Configuration SerialNumber Ġ= ĠConfiguration Wrapper . get Serial Counter () ĊĊĠĠĠĠĠĠĠ Ġ// ĠForce Ġlocale Ġthat Ġis Ġneeded Ġafter Ġandroidx Ġactivity Ġ 1 . 2 . 0 ĊĠĠĠĠĠĠĠ Ġ// ĠReference : Ġhttps :// stackoverflow . com / a / 4 0 7 0 4 0 7 7 / 1 1 2 3 8 ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠConfiguration Wrapper . wrap ( this ) ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠĠĠĠĠ Ġresources . update Configuration ( context . resources . configuration , Ġcontext . resources . display Metrics ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( will Need Storage Permission ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġask Storage Permission () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġto Ġensure Ġthat Ġtitle Ġis Ġlocalized ĊĠĠĠĠĠĠĠ Ġval Ġactivity Info Ġ= Ġpackage Manager . getActivity Info ( component Name , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( activity Info . label Res Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= ĠLocal ized . text ( activity Info . label Res ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġask Storage Permission () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(!( Context Compat . check Self Permission ( this , ĠManifest . permission . WRITE _ EXTERNAL _ STORAGE ) Ġ== ĠPackage Manager . PERMISSION _ GRAN TED Ġ&& ĠContext Compat . check Self Permission ( this , ĠManifest . permission . READ _ EXTERNAL _ STORAGE ) Ġ== ĠPackage Manager . PERMISSION _ GRAN TED )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Activity Compat . should Show Request Permission R ationale ( this , ĠManifest . permission . WRITE _ EXTERNAL _ STORAGE ) Ġ|| ĠActivity Compat . should Show Request Permission R ationale ( this , ĠManifest . permission . READ _ EXTERNAL _ STORAGE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġok ed Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial Dialog . Builder ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. content ( R . string . storage _ permission _ ration ale ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. positive Text ( R . string . ok ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Positive Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġok ed Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( this , ĠarrayOf ( Manifest . permission . WRITE _ EXTERNAL _ STORAGE , ĠManifest . permission . READ _ EXTERNAL _ STORAGE ), ĠRequest Codes . Permission From Activity . Storage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. dismiss Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! oked ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( this , ĠarrayOf ( Manifest . permission . WRITE _ EXTERNAL _ STORAGE , ĠManifest . permission . READ _ EXTERNAL _ STORAGE ), ĠRequest Codes . Permission From Activity . Storage ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Needed Permissions Granted ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOverride Ġthis Ġto Ġdo Ġsomething Ġafter Ġwe Ġconfirm Ġthat Ġall Ġneeded Ġpermissions Ġare Ġgranted . ĊĠĠĠĠ Ġ* ĠThis Ġis Ġonly Ġcalled Ġif Ġ[. will Need Storage Permission ] Ġwas Ġcalled . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġimmediately Granted Ġwhether Ġthe Ġpermission Ġis Ġgranted Ġimmediately Ġwithout Ġleaving Ġthe Ġfirst ĠonCreate (). ĊĠĠĠĠ Ġ* ĠUse Ġthis Ġto Ġdetermine Ġwhether Ġwe Ġneed Ġto Ġdo Ġinitialization Ġ( e . g . Ġload Ġdir Ġcontents ) ĊĠĠĠĠ Ġ* Ġand Ġto Ġdetermine Ġwhether Ġit Ġis Ġsafe Ġto Ġinit Ġnow . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġfun Ġon Needed Permissions Granted ( immediate ly Granted : ĠBoolean ) Ġ{} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( request Code : ĠInt , Ġpermissions : ĠArray < String >, Ġgrant Results : ĠInt Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠRequest Codes . Permission From Activity . Storage ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġall Ġmust Ġbe Ġgranted ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Granted Ġ= Ġgrant Results . all Ġ{ Ġit Ġ== ĠPackage Manager . PERMISSION _ GRAN TED Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( all Granted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Needed Permissions Granted ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Activity Compat . should Show Request Permission R ationale ( this , ĠManifest . permission . WRITE _ EXTERNAL _ STORAGE ) Ġ|| Ġ! Activity Compat . should Show Request Permission R ationale ( this , ĠManifest . permission . READ _ EXTERNAL _ STORAGE )) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġuser Ġselects Ġdo Ġnot Ġask Ġagain ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġok ed Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial Dialog . Builder ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. content (" You Ġneed Ġto Ġhave Ġthe ĠStorage Ġpermission Ġenabled Ġto Ġcontinue , Ġbecause Ġwe Ġneed Ġto Ġstore Ġshared Ġmedia Ġsuch Ġas ĠBible Ġversions Ġand Ġfonts .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. positive Text ( R . string . ok ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Positive Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġok ed Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Settings . ACTION _ APPLICATION _ DETAILS _ SETTINGS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setData ( Uri . from Parts (" package ", ĠpackageName , Ġnull )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity For Result ( intent , ĠRequest Codes . From Activity . Permission Settings ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. negative Text ( R . string . cancel ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. dismiss Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! oked ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsuper . on Request Permissions Result ( request Code , Ġpermissions , Ġgrant Results ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠRequest Codes . From Activity . Permission Settings ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġask Storage Permission () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Call Super ĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( item . itemId Ġ== Ġandroid . R . id . home ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigate Up () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġnavigate Up () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġup Intent Ġ= ĠNav Utils . getParent Activity Intent ( this ) ĊĠĠĠĠĠĠĠ Ġif Ġ( up Intent Ġ== Ġnull ) Ġ{ Ġ// Ġnot Ġdefined Ġin Ġmanifest , Ġlet Ġus Ġfinish () Ġinstead . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Nav Utils . should Up Re create Task ( this , Ġup Intent ) Ġ|| Ġis Task Root ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTask Stack Builder . create ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Next Intent With Parent Stack ( up Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. start Activities () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNav Utils . navigate Up To ( this , Ġup Intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġdump Intent ( intent : ĠIntent , Ġvia : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApp Log . d ( TAG , Ġ" Got Ġintent Ġvia Ġ$ via ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApp Log . d ( TAG , Ġ" Ġ Ġaction : Ġ${ intent . action }") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApp Log . d ( TAG , Ġ" Ġ Ġdata Ġuri : Ġ${ intent . data }") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApp Log . d ( TAG , Ġ" Ġ Ġcomponent : Ġ${ intent . component }") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApp Log . d ( TAG , Ġ" Ġ Ġflags : Ġ 0 x ${ Integer . to HexString ( intent . flags )} ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApp Log . d ( TAG , Ġ" Ġ Ġmime : Ġ${ intent . type }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextras Ġ= Ġintent . extras ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApp Log . d ( TAG , Ġ" Ġ Ġextras : Ġ${ extras ?. size () Ġ?: Ġ" null "} ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( extras Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( key Ġin Ġextras . keySet ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Log . d ( TAG , Ġ" ĠĠĠ Ġ$ key Ġ= Ġ${ extras . get ( key )} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ