package Ġnet . jsp iner . ep ub stream Ċ Ċ import Ġio . reactivex . Comp letable Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . functions . Bi Function Ċ import Ġnet . jsp iner . ep ub stream . dto . Container Ċ import Ġnet . jsp iner . ep ub stream . dto . MimeType Ċ import Ġnet . jsp iner . ep ub stream . dto . N cx Ċ import Ġnet . jsp iner . ep ub stream . dto . Package Ċ import Ġnet . jsp iner . ep ub stream . parser . parse Container Ċ import Ġnet . jsp iner . ep ub stream . parser . parse N cx Ċ import Ġnet . jsp iner . ep ub stream . parser . parse Package Ċ import Ġjava . io . Buffered OutputStream Ċ import Ġjava . io . File Ċ import Ġjava . io . FileInputStream Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . lang . RuntimeException Ċ import Ġjava . nio . file . Files Ċ import Ġjava . util . zip . Zip Entry Ċ import Ġjava . util . zip . Zip InputStream Ċ Ċ class ĠE pub Stream ( val Ġfile : ĠFile ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠMIME TYPE _ FILE _ NAME Ġ= Ġ" mime type " ĊĠĠĠ Ġprivate Ġval ĠCON TAIN ER _ FILE _ NAME Ġ= Ġ" META - INF / container . xml " ĊĊĠĠĠ Ġprivate Ġvar Ġextracted Directory : ĠFile ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar ĠmimeType : ĠMime Type ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcontainer : ĠContainer ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġop f : ĠPackage ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġn cx : ĠN cx ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġunzip ( output Path : ĠString Ġ= Ġ"./ " Ġ+ Ġfile . name Without Extension ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( file . exists (). not ()) Ġreturn ĠComp letable . error ( NoSuch File Exception ( file )) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( extract ed Directory Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComp letable . create Ġ{ Ġemitter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠinputStream Ġ= ĠZip InputStream ( FileInputStream ( file )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry : ĠZip Entry Ġ= ĠinputStream . next Entry Ġ?: Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew File Ġ= ĠFile ( output Path Ġ+ ĠFile . separator Ġ+ Ġentry . name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew File . mkdir () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( new File . parent ). mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextract File ( inputStream , Ġnew File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream . close Entry () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream . close () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextracted Directory Ġ= ĠFile ( output Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onComplete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComp letable . complete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġextract File ( zip In : ĠZip InputStream , Ġnew File : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠoutputStream Ġ= ĠBuffered OutputStream ( File OutputStream ( new File )) ĊĠĠĠĠĠĠĠ Ġval Ġbytes In Ġ= ĠByteArray ( 2 0 4 8 ) ĊĠĠĠĠĠĠĠ Ġvar Ġread Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ(( zip In . read ( bytes In ). also Ġ{ Ġread Ġ= Ġit Ġ}) Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream . write ( bytes In , Ġ 0 , Ġread ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠoutputStream . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Extract ed Directory (): ĠSingle < File > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( extract ed Directory Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSingle . just ( extract ed Directory ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunzip (). to Single Ġ{ Ġextracted Directory Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget MimeType (): ĠSingle < MimeType > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( mime Type Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSingle . just ( mime Type ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Extract ed Directory () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . to Path (). resolve ( MIME TYPE _ FILE _ NAME ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠFiles . read All Lines ( it ). join ToString () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠMime Type ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Success Ġ{ Ġthis @ E pub Stream . mime Type Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Container (): ĠSingle < Container > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( container Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSingle . just ( container ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget MimeType () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġget Extract ed Directory () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . resolve ( CONTAINER _ FILE _ NAME ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġparse To Document ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġparse Container ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Success Ġ{ Ġthis @ E pub Stream . container Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Op f (): ĠSingle < Package > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( op f Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSingle . just ( op f ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Container () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. zip With ( get Extract ed Directory (), ĠBi Function Ġ{ Ġcontainer : ĠContainer , Ġfile : ĠFile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . resolve ( container . root Files [ 0 ]. fullPath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġparse To Document ( it ) Ġto Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġparse Package ( it . first , Ġit . second . parent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Success Ġ{ Ġthis @ E pub Stream . op f Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget T oc (): ĠSingle < N cx > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( nc x Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSingle . just ( nc x ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Op f () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġop f Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoc Id Ġ= Ġop f . sp ine . toc ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġop f . manifest . items ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item . id . equals ( toc Id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map Ġitem . href ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ("$ toc Id Ġnot Ġexist Ġin Ġsp ine ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠFile ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġparse To Document ( it ) Ġto Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġparse N cx ( it . first , Ġit . second . parent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Success Ġ{ Ġthis @ E pub Stream . nc x Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetFile (): ĠSingle < Any > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSingle . just ( 1 ) ĊĠĠĠ Ġ} Ċ }