package Ġcom . t ent ium . sensor stream Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . content .* Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . location . Location Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Battery Manager Ċ import Ġandroid . support . v 7 . app . AppCompatActivity Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . Text Watcher Ċ import Ġandroid . widget .* Ċ import Ġcom . github . kit tin un f . fuel . Fuel Ċ import Ġcom . google . android . gms . location . F used Location Provider Client Ċ import Ġcom . google . android . gms . location . Location Services Ċ import Ġorg . jetbrains . ank o . do Async Ċ import Ġjava . lang . Exception Ċ import Ġjava . util .* Ċ import Ġkotlin . concurrent . schedule At Fixed Rate Ċ Ċ class ĠStream Ġ: ĠAppCompatActivity () Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġis Streaming Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġf used Location Client : ĠF used Location Provider Client ĊĠĠĠ Ġprivate Ġvar Ġtimer : ĠTimer Ġ= ĠTimer () ĊĠĠĠ Ġvar Ġprefs : ĠP refs ? Ġ= Ġnull ĊĊĠĠĠ Ġclass ĠP refs Ġ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠP REF S _ FILENAME Ġ= Ġ" com . t ent ium . sensor stream . prefs " ĊĠĠĠĠĠĠĠ Ġval Ġshared Prefs : ĠSharedPreferences Ġ= Ġcontext . get SharedPreferences ( PRE FS _ FILENAME , Ġ 0 ); ĊĊĠĠĠĠĠĠĠ Ġval ĠINTER VAL Ġ= Ġ" interval " ĊĠĠĠĠĠĠĠ Ġval ĠHOST Ġ= Ġ" host " ĊĠĠĠĠĠĠĠ Ġval ĠGPS Ġ= Ġ" gps " ĊĠĠĠĠĠĠĠ Ġval ĠB ATTER Y Ġ= Ġ" battery " ĊĠĠĠĠĠĠĠ Ġval ĠCLIENT ID Ġ= Ġ" deviceId " ĊĊĠĠĠĠĠĠĠ Ġvar Ġinterval : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġshared Prefs . getString ( INTERVAL , Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ( value ) Ġ= Ġshared Prefs . edit (). putString ( INTERVAL , Ġvalue ). apply () ĊĠĠĠĠĠĠĠ Ġvar Ġhost : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġshared Prefs . getString ( HOST , Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ( value : ĠString ) Ġ= Ġshared Prefs . edit (). putString ( HOST , Ġvalue ). apply () ĊĠĠĠĠĠĠĠ Ġvar Ġgps : ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġshared Prefs . getBoolean ( GPS , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ( value ) Ġ= Ġshared Prefs . edit (). put Boolean ( GPS , Ġvalue ). apply () ĊĠĠĠĠĠĠĠ Ġvar Ġbattery : ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġshared Prefs . getBoolean ( B ATTER Y , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ( value ) Ġ= Ġshared Prefs . edit (). put Boolean ( B ATTER Y , Ġvalue ). apply () ĊĠĠĠĠĠĠĠ Ġvar ĠdeviceId : ĠString ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġshared Prefs . getString ( CLIENT ID , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ( value ) Ġ= Ġshared Prefs . edit (). putString ( CLIENT ID , Ġvalue ). apply () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġget Salt String (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠS ALT CHARS Ġ= Ġ" abcdefgh ijkl mnopqrst uv xyz 1 2 3 4 5 6 7 8 9 0 " ĊĠĠĠĠĠĠĠ Ġval Ġsalt Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġval Ġrnd Ġ= ĠRandom () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( salt . length Ġ< Ġ 8 ) Ġ{ Ġ// Ġlength Ġof Ġthe Ġrandom Ġstring . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġ( rnd . next Float () Ġ* ĠS ALT CHARS . length ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsalt . append ( SAL T CHARS [ index ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsalt Str Ġ= Ġsalt . toString () ĊĠĠĠĠĠĠĠ Ġreturn Ġsalt Str ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ stream ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠINITIAL IZE ĠSHARE D - PREFER ENCES ĊĠĠĠĠĠĠĠ Ġprefs Ġ= ĠP refs ( this ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠINITIAL IZE ĠLOC ATION ĠPRO VIDER ĊĠĠĠĠĠĠĠ Ġf used Location Client Ġ= ĠLocation Services . getF used Location Provider Client ( this ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSET ĠTENT IUM ĠLOG O ĠAS ĠWEB ĠLINK ĊĠĠĠĠĠĠĠ Ġval Ġimg Ġ= ĠfindViewById ( R . id . t ent ium ) Ġas ĠImageView ĊĠĠĠĠĠĠĠ Ġimg . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ VIEW , ĠUri . parse (" http :// t ent ium . se / ")) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠBUTTON ĠC LIC K ĠLIST ENER ĊĠĠĠĠĠĠĠ Ġval Ġbtn Ġ= ĠfindViewById ( R . id . toggle Stream ) Ġas ĠButton ĊĠĠĠĠĠĠĠ Ġbtn . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Streaming ) Ġstop Streaming () Ġelse Ġstart Streaming () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSET ĠDEVICE ĠID : ĊĠĠĠĠĠĠĠ Ġvar ĠdeviceId Ġ= Ġprefs !!. deviceId ĊĠĠĠĠĠĠĠ Ġif Ġ( deviceId Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠdeviceId Ġ= Ġget Salt String () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefs !!. deviceId Ġ= ĠdeviceId ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠfindViewById < TextView >( R . id . deviceId ). text Ġ= Ġ" Device ĠID : Ġ$ deviceId " ĊĊĠĠĠĠĠĠĠ Ġ// ĠSET ĠSW ITCH ĠSTAT ES Ġ& ĠLIST EN ERS ĊĠĠĠĠĠĠĠ Ġval Ġgps Ġ= ĠfindViewById ( R . id . send G ps ) Ġas ĠSwitch ĊĠĠĠĠĠĠĠ Ġgps . isChecked Ġ= Ġprefs !!. gps ĊĠĠĠĠĠĠĠ Ġval Ġbattery Ġ= ĠfindViewById ( R . id . send Battery ) Ġas ĠSwitch ĊĠĠĠĠĠĠĠ Ġbattery . isChecked Ġ= Ġprefs !!. battery ĊĠĠĠĠĠĠĠ Ġgps . setOn Checked ChangeListener Ġ{ Ġ_, Ġis Checked Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefs !!. gps Ġ= Ġis Checked ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbattery . setOn Checked ChangeListener Ġ{ Ġ_, Ġis Checked Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefs !!. battery Ġ= Ġis Checked ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSET ĠINTER VAL Ġ& ĠHOST ĠTEXT ĠINPUT S Ġand ĠLIST EN ERS ĊĠĠĠĠĠĠĠ Ġval Ġinterval EditText Ġ= ĠfindViewById ( R . id . interval ) Ġas ĠEditText ĊĠĠĠĠĠĠĠ Ġinterval EditText . setText ( prefs !!. interval ) ĊĠĠĠĠĠĠĠ Ġval Ġhost EditText Ġ= ĠfindViewById ( R . id . host ) Ġas ĠEditText ĊĠĠĠĠĠĠĠ Ġhost EditText . setText ( prefs !!. host ) ĊĠĠĠĠĠĠĠ Ġhost EditText . add TextChanged Listener ( object : ĠText Watcher Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġcount : ĠInt , Ġafter : ĠInt ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġbefore : ĠInt , Ġcount : ĠInt ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( s : ĠEdit able ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs !!. host Ġ= Ġs . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġinterval EditText . add TextChanged Listener ( object : ĠText Watcher Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġcount : ĠInt , Ġafter : ĠInt ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġbefore : ĠInt , Ġcount : ĠInt ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( s : ĠEdit able ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs !!. interval Ġ= Ġs . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġstart Streaming () Ġ{ ĊĠĠĠĠĠĠĠ Ġis Streaming Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġval Ġbtn : ĠButton Ġ= ĠfindViewById ( R . id . toggle Stream ) Ġas ĠButton ĊĠĠĠĠĠĠĠ Ġbtn . text Ġ= Ġ" Stop Ġstreaming " ĊĊĠĠĠĠĠĠĠ Ġval Ġhost EditText Ġ= ĠfindViewById ( R . id . host ) Ġas ĠEditText ĊĠĠĠĠĠĠĠ Ġval Ġhost Ġ= Ġhost EditText . text . toString () ĊĊĠĠĠĠĠĠĠ Ġval Ġgps Ġ= ĠfindViewById ( R . id . send G ps ) Ġas ĠSwitch ĊĠĠĠĠĠĠĠ Ġval Ġbattery Ġ= ĠfindViewById ( R . id . send Battery ) Ġas ĠSwitch ĊĊĠĠĠĠĠĠĠ Ġif Ġ( gps . isChecked ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( check Self Permission ( Manifest . permission . ACCESS _ F INE _ LOCATION ) Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permissions ( array Of ( Manifest . permission . ACCESS _ F INE _ LOCATION , ĠManifest . permission . ACCESS _ CO AR SE _ LOCATION ), Ġ 4 4 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġinterval EditText Ġ= ĠfindViewById ( R . id . interval ) Ġas ĠEditText ĊĠĠĠĠĠĠĠ Ġval Ġinterval String Ġ= Ġinterval EditText . text . toString () ĊĊĠĠĠĠĠĠĠ Ġprefs !!. interval Ġ= Ġinterval String ĊĊĠĠĠĠĠĠĠ Ġvar Ġinterval Ġ= Ġinterval String . to Long OrNull () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( interval Ġ== Ġnull Ġ|| Ġinterval Ġ< Ġ 1 ) Ġinterval Ġ= Ġ 1 0 0 0 ĊĊĠĠĠĠĠĠĠ Ġprefs !!. host Ġ= Ġhost ĊĊĠĠĠĠĠĠĠ Ġval ĠdeviceId Ġ= Ġprefs !!. deviceId Ġas ĠString ĊĊĠĠĠĠĠĠĠ Ġdo Async Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRun Ġtimer Ġin Ġasync Ġto Ġenable Ġbackground Ġ( i Ġthink ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Ġ= ĠTimer () Ġ// ĠInitialize Ġnew Ġtimer Ġfor Ġsome Ġreason ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimer . schedule At Fixed Rate ( 0 , Ġinterval ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRun Ġthis Ġevery ĠN Ġms : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Post ( host , Ġgps . isChecked , Ġbattery . isChecked , ĠdeviceId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġstop Streaming () Ġ{ ĊĠĠĠĠĠĠĠ Ġis Streaming Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġbtn : ĠButton Ġ= ĠfindViewById ( R . id . toggle Stream ) Ġas ĠButton ĊĠĠĠĠĠĠĠ Ġbtn . text Ġ= Ġ" Start Ġstreaming " ĊĊĠĠĠĠĠĠĠ Ġtimer . cancel () ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġbool ToInt ( boolean : ĠBoolean ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġret Ġ= Ġif Ġ( boolean ) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġreturn Ġret ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġsend Post ( host : ĠString , Ġgps : ĠBoolean , Ġbattery : ĠBoolean , ĠdeviceId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmillis : ĠLong Ġ= ĠCalendar . getInstance (). time In Millis ĊĊĠĠĠĠĠĠĠ Ġvar Ġbody Ġ= Ġ""" { Ġ" timestamp ": Ġ$ millis , Ġ" deviceId ": Ġ"$ deviceId ", """ ĊĊĠĠĠĠĠĠĠ Ġvar Ġto Finish Ġ= Ġbool ToInt ( gps ) Ġ+ Ġbool ToInt ( battery ) ĊĠĠĠĠĠĠĠ Ġvar Ġis Finished Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġfun Ġproceed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Finished ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( to Finish Ġ<= Ġis Finished ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġ( body . drop Last ( 1 ) Ġ+ Ġ"} "). trim Indent () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF uel . post (" http :// $ host "). body ( body ). header (" Content - Type " Ġto Ġ" application / json "). response Ġ{ Ġrequest , Ġresponse , Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( to Finish Ġ== Ġ 0 ) Ġreturn Ġproceed () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( gps ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf used Location Client . last Location . add On Success Listener Ġ{ Ġlocation : ĠLocation ? Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlat Ġ= Ġlocation ?. latitude ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlong Ġ= Ġlocation ?. longitude ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalt Ġ= Ġlocation ?. altitude ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ+= Ġ""" " gps ": Ġ{ Ġ" lat " Ġ: Ġ$ lat , Ġ" long ": Ġ$ long , Ġ" alt ": Ġ$ alt Ġ}, """ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproceed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. add On Failure Listener Ġ{ Ġexception : ĠException Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ+= Ġ""" " gps ": Ġ{}, """ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproceed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSecurity Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproceed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( battery ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbattery Status : ĠIntent ? Ġ= ĠIntent Filter ( Intent . ACTION _ B ATTER Y _ CHANGED ). let Ġ{ Ġif ilter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister Receiver ( null , Ġif ilter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbattery Pct : ĠFloat ? Ġ= Ġbattery Status ?. let Ġ{ Ġintent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlevel : ĠInt Ġ= Ġintent . getInt Extra ( Battery Manager . EXTRA _ LEVEL , Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale : ĠInt Ġ= Ġintent . getInt Extra ( Battery Manager . EXTRA _ SCALE , Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlevel Ġ/ Ġscale . toFloat () Ġ* Ġ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatus : ĠInt Ġ= Ġbattery Status ?. getInt Extra ( Battery Manager . EXTRA _ STATUS , Ġ- 1 ) Ġ?: Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Ch arging : ĠBoolean Ġ= Ġstatus Ġ== ĠB attery Manager . B ATTER Y _ STATUS _ CHAR GING Ġ|| Ġstatus Ġ== ĠB attery Manager . B ATTER Y _ STATUS _ FULL ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ+= Ġ""" " battery ": Ġ{ Ġ" level ": Ġ$ battery Pct , Ġ" is Ch arging ": Ġ$ is Ch arging Ġ}, """ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġproceed () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }