package Ġio Ċ Ċ import Ġcanvas . data . Agent Item Ċ import Ġcanvas . data . Edge . Companion . make Edge Between Ċ import Ġcanvas . data . Model Ċ import Ġcanvas . data . State Ċ import Ġside panels . property panel . Pro position Item Ċ import Ġjava . io .* ĊĊ Ċ object ĠModel Serializer Ġ{ ĊĊĠĠĠ Ġfun Ġserialize Model ( model : ĠModel , Ġfile : ĠFile ){ ĊĠĠĠĠĠĠĠ Ġval Ġserial izable Model Ġ= Ġmake Serializable ( model ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfile Output Ġ= ĠFileOutputStream ( file ) ĊĠĠĠĠĠĠĠ Ġval Ġout Stream Ġ= ĠObject OutputStream ( file Output ) ĊĊĠĠĠĠĠĠĠ Ġout Stream . write Object ( serial izable Model ) ĊĊĠĠĠĠĠĠĠ Ġfile Output . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdeserialize Model ( file : ĠFile ) Ġ: ĠModel Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Input Ġ= ĠFileInputStream ( file ) ĊĠĠĠĠĠĠĠ Ġval Ġin Stream Ġ= ĠObject InputStream ( file Input ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdeserialized Model Ġ= Ġin Stream . read Object () Ġas ĠSerializable Model ĊĊĠĠĠĠĠĠĠ Ġfile Input . close () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġconvert Serializable Model ( de serialized Model ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Copy ( input : ĠModel ): ĠModel Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġconvert Serializable Model ( make Serializable ( input )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmake Serializable ( model : ĠModel ): ĠSerializable Model Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġserial izable Props Ġ= Ġmodel . props . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSerializable Prop ( it . prop String , Ġit . isSelected ) ĊĠĠĠĠĠĠĠ Ġ}. associate By { Ġit . prop String Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġserial izable Agents Ġ= Ġmodel . agents . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSerializable Agent ( it . name , Ġit . isSelected ) ĊĠĠĠĠĠĠĠ Ġ}. associate By Ġ{ Ġit . name Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġserial izable States Ġ= Ġmodel . states . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSerializable State ( it . name , Ġit . x Pos , Ġit . y Pos , Ġit . props . map Ġ{ Ġserial izable Props . get ( it . prop String ) !! Ġ}) ĊĠĠĠĠĠĠĠ Ġ}. associate By Ġ{ Ġit . name Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġserial izable Edges Ġ= Ġmodel . edges . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSerializable Edge ( serial izable States [ it . out Parent . name ] !! , Ġserial izable States [ it . in Parent . name ] !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . id , Ġit . agents . map Ġ{ Ġserial izable Agents [ it . name ] !! Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSerializable Model ( serial izable States . values . toList (), Ġserial izable Edges , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserial izable Agents . values . toList (), Ġserial izable Props . values . toList ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconvert Serializable Model ( de serialized Model : ĠSerializable Model ): ĠModel Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprops Ġ= Ġdeserialized Model . props . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPro position Item ( it . prop String , Ġit . isSelected ) ĊĠĠĠĠĠĠĠ Ġ}. associate By Ġ{ Ġit . prop String Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġagents Ġ= Ġdeserialized Model . agents . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAgent Item ( it . name , Ġit . isSelected ) ĊĠĠĠĠĠĠĠ Ġ}. associate By Ġ{ Ġit . name Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġstates Ġ= Ġdeserialized Model . states . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState ( it . name , Ġit . x Pos , Ġit . y Pos , Ġit . props . map Ġ{ Ġprops [ it . prop String ] !! Ġ}) ĊĠĠĠĠĠĠĠ Ġ}. associate By Ġ{ Ġit . name Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġedges Ġ= Ġdeserialized Model . edges . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmake Edge Between ( states [ it . parent 1 . name ] !! , Ġstates [ it . parent 2 . name ] !! , Ġit . agents . map Ġ{ Ġagents [ it . name ] !! Ġ}) ĊĠĠĠĠĠĠĠ Ġ}. to Mutable List () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠModel ( states . values . to Mutable List (), Ġedges , Ġagents . values . to Mutable List (), Ġprops . values . to Mutable List ()) ĊĠĠĠ Ġ} Ċ }