package Ġcom . je ff pd avid son . cross word sc raper . sources Ċ Ċ import Ġbrowser . permissions . Permissions Ċ import Ġkotlinx . coroutines . await Ċ import Ġorg . w 3 c . dom . url . URL Ċ Ċ /** ĠSource Ġof Ġp uzz les Ġthat Ġcan Ġbe Ġscrap ed . Ġ*/ Ċ interface ĠSource Ġ{ ĊĊĠĠĠ Ġ/** ĠThe Ġname Ġof Ġthe Ġsource . ĠUsed Ġto Ġidentify Ġit Ġfor Ġpermission Ġrequests Ġor Ġif Ġno Ġpuzzle Ġtitle Ġis Ġavailable . Ġ*/ ĊĠĠĠ Ġval Ġsource Name : ĠString ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhether Ġthe Ġpage Ġat Ġthe Ġgiven ĠURL Ġmay Ġcontain Ġa Ġpuzzle Ġfor Ġthis Ġsource . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġis Ġused Ġas Ġan Ġinitial Ġpre condition Ġto Ġprevent Ġusers Ġfrom Ġseeing Ġunnecessary Ġpermission Ġpromp ts Ġfor ĊĠĠĠĠ Ġ* Ġpages Ġthat Ġare Ġunlikely Ġto Ġcontain Ġp uzz les . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġmatches Url ( url : ĠURL ): ĠBoolean ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSc rape Ġthe Ġcontents Ġof Ġthe Ġpage Ġand Ġreturn Ġthe Ġresult . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠOnly Ġcalled Ġwhen Ġ[ matches Url ] Ġreturns Ġtrue . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġhost Ġpermissions Ġare Ġneeded , Ġreturn Ġa Ġ[ Sc rape Result . Need Permissions ] Ġindicating Ġwhich Ġpermissions Ġare ĊĠĠĠĠ Ġ* Ġnecessary . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġsc rape P uzz les ( url : ĠURL , Ġframe Id : ĠInt , Ġis TopLevel : ĠBoolean ): ĠSc rape Result ĊĊĠĠĠ Ġ/** ĠWhether Ġthe Ġgiven Ġpermissions Ġhave Ġbeen Ġgranted . Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġhas Permissions ( needed Permissions : ĠList < String >): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġbrowser . permissions . contains ( Permissions Ġ{ Ġorig ins Ġ= Ġneeded Permissions . to Typed Array () Ġ}). await () ĊĊĠĠĠ Ġfun Ġget Permissions For Urls ( urls : ĠList < URL >): ĠList < String > Ġ= ĊĠĠĠĠĠĠĠ Ġurls . flatMap Ġ{ Ġurl Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( url . protocol Ġ== Ġ" http :") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAlso Ġrequest Ġpermission Ġfor Ġ" https :" Ġin Ġcase Ġwe 're Ġredirected Ġthere . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalternate Url Ġ= ĠURL ( url . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalternate Url . protocol Ġ= Ġif Ġ( url . protocol Ġ== Ġ" http :") Ġ" https :" Ġelse Ġ" http :" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( url , Ġalternate Url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. map Ġ{ Ġ"${ it . origin } /* " Ġ}. distinct () ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĠWhether Ġthis ĠURL 's Ġhost Ġis Ġthis Ġdomain , Ġor Ġa Ġsubdomain Ġof Ġthis Ġdomain . Ġ*/ ĊĠĠĠĠĠĠĠ Ġinternal Ġfun ĠURL . host Is Domain Or Sub domain Of ( domain : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhost Ġ== Ġdomain Ġ|| Ġhost . endsWith (" .$ domain ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }