/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 - present ĠM ik ha el ĠS oko lov Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġru . so kom ish al ov . sk raper . provider . flickr Ċ Ċ import Ġcom . fasterxml . jackson . databind . JsonNode Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġorg . js oup . J soup Ċ import Ġorg . js oup . nodes . Document Ċ import Ġorg . js oup . nodes . Element Ċ import Ġru . so kom ish al ov . sk raper . Sk raper Ċ import Ġru . so kom ish al ov . sk raper . Sk rap ers Ċ import Ġru . so kom ish al ov . sk raper . client . HttpRequest Ċ import Ġru . so kom ish al ov . sk raper . client . Sk raper Client Ċ import Ġru . so kom ish al ov . sk raper . client . fetch Document Ċ import Ġru . so kom ish al ov . sk raper . client . fetch Open Graph Media Ċ import Ġru . so kom ish al ov . sk raper . internal . iterable . emit Batch Ċ import Ġru . so kom ish al ov . sk raper . internal . js oup . get Background ImageUrl Ċ import Ġru . so kom ish al ov . sk raper . internal . js oup . getFirst Element By Class Ċ import Ġru . so kom ish al ov . sk raper . internal . js oup . getStyle Ċ import Ġru . so kom ish al ov . sk raper . internal . net . host Ċ import Ġru . so kom ish al ov . sk raper . internal . number . div Ċ import Ġru . so kom ish al ov . sk raper . internal . serialization .* Ċ import Ġru . so kom ish al ov . sk raper . internal . string . un escape Html Ċ import Ġru . so kom ish al ov . sk raper . internal . string . un escape Url Ċ import Ġru . so kom ish al ov . sk raper . model .* Ċ import Ġjava . time . Instant ĊĊ Ċ /** Ċ Ġ* Ġ@ author Ġs ok om ish al ov Ċ Ġ*/ Ċ open Ġclass ĠF lickr Sk raper Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġoverride Ġval Ġclient : ĠSk raper Client Ġ= ĠSk rap ers . client Ċ ) Ġ: ĠSk raper Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġget Posts ( path : ĠString ): ĠFlow < Post > Ġ= Ġflow Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpage Ġ= Ġget Page ( path Ġ= Ġpath ) ĊĊĠĠĠĠĠĠĠ Ġval Ġraw Posts Ġ= Ġpage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . getElementsBy Class (" photo - list - photo - view ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. or Empty () ĊĊĠĠĠĠĠĠĠ Ġval Ġjson Posts Ġ= Ġpage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. parse Model Json () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . find Path ("_ data ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . associate Ġ{ Ġit . getString (" id "). or Empty () Ġto Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. or Empty () ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġraw Posts . isNotEmpty () Ġ-> Ġemit Batch ( raw Posts ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġget Background Image (). or Empty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġurl . substring After Last ("/ "). substring Before ("_ ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Post Ġ= Ġjson Posts [ id ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPost ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġjson Post ?. extract Post Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublished At Ġ= Ġjson Post ?. extract Post Publish Date (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatistics Ġ= ĠPost Statistics ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlikes Ġ= Ġjson Post ?. extract Post Lik es (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomments Ġ= Ġjson Post ?. extract Post Comments Count (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġviews Ġ= Ġjson Post ?. extract Post Views Count (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġurl , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaspect Ratio Ġ= Ġextract Post AspectRatio () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġjson Posts . isNotEmpty () Ġ-> Ġjson Posts . forEach Ġ{ Ġ( key , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPost ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġkey , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġvalue ?. extract Post Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublished At Ġ= Ġvalue ?. extract Post Publish Date (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatistics Ġ= ĠPost Statistics ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlikes Ġ= Ġvalue ?. extract Post Lik es (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomments Ġ= Ġvalue ?. extract Post Comments Count (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġviews Ġ= Ġvalue ?. extract Post Views Count (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġvalue . extract Post Attachment Url (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaspect Ratio Ġ= Ġvalue . extract Post AspectRatio () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Page Info ( path : ĠString ): ĠPage Info ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpage Ġ= Ġget Page ( path Ġ= Ġpath ) ĊĠĠĠĠĠĠĠ Ġval Ġjson Ġ= Ġpage . parse Model Json () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġjson ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPage Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnick Ġ= Ġextract Page Nick (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġextract Page Name (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġextract Page Description (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatistics Ġ= ĠPage Statistics ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfollow ers Ġ= Ġextract Follow ers Count (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfollowing Ġ= Ġextract Following Count (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposts Ġ= Ġextract Posts Count (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavatar Ġ= Ġextract Page Logo (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcover Ġ= Ġextract Page Cover () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsupports ( media : ĠMedia ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" flickr . com " Ġin Ġmedia . url . host ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġresolve ( media : ĠMedia ): ĠMedia Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( media ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠImage Ġ-> Ġclient . fetch Open Graph Media ( media ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġmedia ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġget Page ( path : ĠString ): ĠDocument ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġclient . fetch Document ( HttpRequest ( url Ġ= ĠBASE _ URL . build Full URL ( path Ġ= Ġpath ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠDocument ?. parse Model Json (): ĠJsonNode ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfull Json Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . getFirst Element By Class (" model Export ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . html () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . substring After (" Y . Client App . init (" ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . substring Before (". then ( function () ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . substring Before Last (" )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . replace (" auth : Ġauth ,", Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . replace (" req Id : Ġreq Id ,", Ġ"") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfull Json ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . read Json Nodes () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . getBy Path (" model Export . main ") ĊĠĠĠĠĠĠĠ Ġ}. get OrNull () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠElement ?. get Background Image (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . get Background ImageUrl () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġ" https :$ it " Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠElement ?. extract Post AspectRatio (): ĠDouble ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Dimension (" width ") Ġ/ Ġget Dimension (" height ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠElement ?. get Dimension ( style Name : ĠString ): ĠDouble ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . getStyle ( style Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . trim () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . remove Suffix (" px ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . toDouble OrNull () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠJsonNode . extract Post Text (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġget (" title "). un escape Node () ĊĠĠĠĠĠĠĠ Ġval Ġdescription Ġ= Ġget (" description "). un escape Node () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ"${ title }\ n \ n ${ description }" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠJsonNode . extract Post Publish Date (): ĠInstant ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Long (" stats . date Posted ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĠInstant . of Epoch Second ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠJsonNode . extract Post Lik es (): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget First By Path (" eng agement . f ave Count ", Ġ" f ave Count ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . as Int () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠJsonNode . extract Post Comments Count (): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget First By Path (" eng agement . comment Count ", Ġ" comment Count ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . as Int () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠJsonNode . extract Post Views Count (): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget First By Path (" eng agement . view Count ", Ġ" view Count ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . as Int () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠJsonNode . extract Post Attachment Url (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget First By Path (" sizes . l ", Ġ" sizes . m ", Ġ" sizes . s ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . getString (" url ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġ" https :${ it }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. or Empty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠJsonNode . extract Post AspectRatio (): ĠDouble ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget First By Path (" sizes . l ", Ġ" sizes . m ", Ġ" sizes . s ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . run Ġ{ Ġget Double (" width ") Ġ/ Ġget Double (" height ") Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠJsonNode . extract Page Description (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get (" person - public - profile - models . 0 . profile Description Expanded ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . un escape Node () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĠJ soup . parse ( it ). whole Text () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠJsonNode . extract Page Nick (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget First By Path (" phot ostream - models . 0 . owner . path Alias ", Ġ" person - models . 0 . path Alias ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . un escape Node () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠJsonNode . extract Page Name (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget First By Path (" phot ostream - models . 0 . owner . username ", Ġ" person - models . 0 . username ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . un escape Node () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠJsonNode . extract Follow ers Count (): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Int (" person - contacts - count - models . 0 . follow er Count ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠJsonNode . extract Following Count (): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Int (" person - contacts - count - models . 0 . following Count ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠJsonNode . extract Posts Count (): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Int (" person - profile - models . 0 . photo Count ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠJsonNode . extract Page Cover (): ĠImage ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠgetBy Path (" person - profile - models . 0 . cover Photo Urls ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . getFirst By Path (" h ", Ġ" l ", Ġ" s ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . as Text () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . convertTo Image () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠJsonNode . extract Page Logo (): ĠImage ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget First By Path (" phot ostream - models . 0 . owner . buddy icon ", Ġ" person - models . 0 . buddy icon ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . getFirst By Path (" large ", Ġ" medium ", Ġ" small ", Ġ" default ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . as Text () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . convertTo Image () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠString ?. convertTo Image (): ĠImage Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ?. let Ġ{ Ġ" https :${ it }" Ġ}. or Empty (). to Image () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠJsonNode ?. un escape Node (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ?. as Text ()?. un escape Url ()?. un escape Html (). or Empty () ĊĠĠĠĠĠĠĠ Ġ}. getOrElse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ?. as Text (). or Empty () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBASE _ URL : ĠString Ġ= Ġ" https :// flickr . com " ĊĠĠĠ Ġ} Ċ } Ċ