functor (KeyS : StringOf->
  functor (ImgS : StringOf->
    functor
      (Map : sig
               type key = KeyS.t
               type img = ImgS.t
               type t
               val empty : t
               val is_empty : t -> bool
               val add : key -> img -> t -> t
               val find : key -> t -> img
               val remove : key -> t -> t
               val mem : key -> t -> bool
               val iter : (key -> img -> unit) -> t -> unit
               val map : (img -> img) -> t -> t
               val mapi : (key -> img -> img) -> t -> t
               val fold : (key -> img -> '-> 'a) -> t -> '-> 'a
               val compare : t -> t -> int
               val equal : t -> t -> bool
               val add' : key -> img option -> t -> t
               val find' : key -> t -> img option
               val add_list : (key * img) list -> t -> t
               val to_list : t -> (key * img) list
               val from_list : (key * img) list -> t
               val map_to_list : (key -> img -> 'a) -> t -> 'a list
               val mapi_and_map_to_list :
                 (key -> img -> img * 'a) -> t -> t * 'a list
               val domain : t -> key list
               val fold_two :
                 (key -> img option -> img option -> '-> 'a) ->
                 '-> t -> t -> 'a
               val restrict : key list -> t -> t
               val iter_all : ?rev:bool -> (key -> img -> unit) -> t -> unit
               val map_all : ?rev:bool -> (img -> img) -> t -> t
               val mapi_all : ?rev:bool -> (key -> img -> img) -> t -> t
               val fold_all :
                 ?rev:bool -> (key -> img -> '-> 'a) -> t -> '-> 'a
               val to_list_all : ?rev:bool -> t -> (key * img) list
               val compare_all : t -> t -> int
               val equal_all : t -> t -> bool
             end->
      sig
        type key = Map.key
        type img = Map.img
        type t
        val empty : t
        val is_empty : t -> bool
        val add : key -> img -> t -> t
        val find : key -> t -> img
        val remove : key -> t -> t
        val mem : key -> t -> bool
        val iter : (key -> img -> unit) -> t -> unit
        val map : (img -> img) -> t -> t
        val mapi : (key -> img -> img) -> t -> t
        val fold : (key -> img -> '-> 'a) -> t -> '-> 'a
        val compare : t -> t -> int
        val equal : t -> t -> bool
        val add' : key -> img option -> t -> t
        val find' : key -> t -> img option
        val add_list : (key * img) list -> t -> t
        val to_list : t -> (key * img) list
        val from_list : (key * img) list -> t
        val map_to_list : (key -> img -> 'a) -> t -> 'a list
        val mapi_and_map_to_list :
          (key -> img -> img * 'a) -> t -> t * 'a list
        val domain : t -> key list
        val fold_two :
          (key -> img option -> img option -> '-> 'a) -> '-> t -> t -> 'a
        val restrict : key list -> t -> t
        val iter_all : ?rev:bool -> (key -> img -> unit) -> t -> unit
        val map_all : ?rev:bool -> (img -> img) -> t -> t
        val mapi_all : ?rev:bool -> (key -> img -> img) -> t -> t
        val fold_all : ?rev:bool -> (key -> img -> '-> 'a) -> t -> '-> 'a
        val to_list_all : ?rev:bool -> t -> (key * img) list
        val compare_all : t -> t -> int
        val equal_all : t -> t -> bool
        val string_of : t -> string
      end