functor (KeyS : StringOf->
  functor (ImgS : StringOf->
    functor (SCustom : Custom->
      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