sig
  module Oid :
    sig
      type t
      val of_string : string -> Ldap_schema.Oid.t
      val to_string : Ldap_schema.Oid.t -> string
      val compare : Ldap_schema.Oid.t -> Ldap_schema.Oid.t -> int
    end
  module Oidset :
    sig
      type elt = Ldap_schema.Oid.t
      type t = Set.Make(Oid).t
      val empty : Ldap_schema.Oidset.t
      val is_empty : Ldap_schema.Oidset.t -> bool
      val mem : Ldap_schema.Oidset.elt -> Ldap_schema.Oidset.t -> bool
      val add :
        Ldap_schema.Oidset.elt ->
        Ldap_schema.Oidset.t -> Ldap_schema.Oidset.t
      val singleton : Ldap_schema.Oidset.elt -> Ldap_schema.Oidset.t
      val remove :
        Ldap_schema.Oidset.elt ->
        Ldap_schema.Oidset.t -> Ldap_schema.Oidset.t
      val union :
        Ldap_schema.Oidset.t -> Ldap_schema.Oidset.t -> Ldap_schema.Oidset.t
      val inter :
        Ldap_schema.Oidset.t -> Ldap_schema.Oidset.t -> Ldap_schema.Oidset.t
      val diff :
        Ldap_schema.Oidset.t -> Ldap_schema.Oidset.t -> Ldap_schema.Oidset.t
      val compare : Ldap_schema.Oidset.t -> Ldap_schema.Oidset.t -> int
      val equal : Ldap_schema.Oidset.t -> Ldap_schema.Oidset.t -> bool
      val subset : Ldap_schema.Oidset.t -> Ldap_schema.Oidset.t -> bool
      val iter :
        (Ldap_schema.Oidset.elt -> unit) -> Ldap_schema.Oidset.t -> unit
      val fold :
        (Ldap_schema.Oidset.elt -> '-> 'a) ->
        Ldap_schema.Oidset.t -> '-> 'a
      val for_all :
        (Ldap_schema.Oidset.elt -> bool) -> Ldap_schema.Oidset.t -> bool
      val exists :
        (Ldap_schema.Oidset.elt -> bool) -> Ldap_schema.Oidset.t -> bool
      val filter :
        (Ldap_schema.Oidset.elt -> bool) ->
        Ldap_schema.Oidset.t -> Ldap_schema.Oidset.t
      val partition :
        (Ldap_schema.Oidset.elt -> bool) ->
        Ldap_schema.Oidset.t -> Ldap_schema.Oidset.t * Ldap_schema.Oidset.t
      val cardinal : Ldap_schema.Oidset.t -> int
      val elements : Ldap_schema.Oidset.t -> Ldap_schema.Oidset.elt list
      val min_elt : Ldap_schema.Oidset.t -> Ldap_schema.Oidset.elt
      val max_elt : Ldap_schema.Oidset.t -> Ldap_schema.Oidset.elt
      val choose : Ldap_schema.Oidset.t -> Ldap_schema.Oidset.elt
      val split :
        Ldap_schema.Oidset.elt ->
        Ldap_schema.Oidset.t ->
        Ldap_schema.Oidset.t * bool * Ldap_schema.Oidset.t
    end
  module Oidmap :
    sig
      type key = Ldap_schema.Oid.t
      type 'a t = 'Map.Make(Oid).t
      val empty : 'Ldap_schema.Oidmap.t
      val is_empty : 'Ldap_schema.Oidmap.t -> bool
      val add :
        Ldap_schema.Oidmap.key ->
        '-> 'Ldap_schema.Oidmap.t -> 'Ldap_schema.Oidmap.t
      val find : Ldap_schema.Oidmap.key -> 'Ldap_schema.Oidmap.t -> 'a
      val remove :
        Ldap_schema.Oidmap.key ->
        'Ldap_schema.Oidmap.t -> 'Ldap_schema.Oidmap.t
      val mem : Ldap_schema.Oidmap.key -> 'Ldap_schema.Oidmap.t -> bool
      val iter :
        (Ldap_schema.Oidmap.key -> '-> unit) ->
        'Ldap_schema.Oidmap.t -> unit
      val map :
        ('-> 'b) -> 'Ldap_schema.Oidmap.t -> 'Ldap_schema.Oidmap.t
      val mapi :
        (Ldap_schema.Oidmap.key -> '-> 'b) ->
        'Ldap_schema.Oidmap.t -> 'Ldap_schema.Oidmap.t
      val fold :
        (Ldap_schema.Oidmap.key -> '-> '-> 'b) ->
        'Ldap_schema.Oidmap.t -> '-> 'b
      val compare :
        ('-> '-> int) ->
        'Ldap_schema.Oidmap.t -> 'Ldap_schema.Oidmap.t -> int
      val equal :
        ('-> '-> bool) ->
        'Ldap_schema.Oidmap.t -> 'Ldap_schema.Oidmap.t -> bool
    end
  val format_oid : Ldap_schema.Oid.t -> unit
  val format_oidset : Ldap_schema.Oidset.t -> unit
  module Lcstring :
    sig
      type t
      val of_string : string -> Ldap_schema.Lcstring.t
      val to_string : Ldap_schema.Lcstring.t -> string
      val compare : Ldap_schema.Lcstring.t -> Ldap_schema.Lcstring.t -> int
    end
  module Lcmap :
    sig
      type key = Ldap_schema.Lcstring.t
      type 'a t = 'Map.Make(Lcstring).t
      val empty : 'Ldap_schema.Lcmap.t
      val is_empty : 'Ldap_schema.Lcmap.t -> bool
      val add :
        Ldap_schema.Lcmap.key ->
        '-> 'Ldap_schema.Lcmap.t -> 'Ldap_schema.Lcmap.t
      val find : Ldap_schema.Lcmap.key -> 'Ldap_schema.Lcmap.t -> 'a
      val remove :
        Ldap_schema.Lcmap.key ->
        'Ldap_schema.Lcmap.t -> 'Ldap_schema.Lcmap.t
      val mem : Ldap_schema.Lcmap.key -> 'Ldap_schema.Lcmap.t -> bool
      val iter :
        (Ldap_schema.Lcmap.key -> '-> unit) ->
        'Ldap_schema.Lcmap.t -> unit
      val map :
        ('-> 'b) -> 'Ldap_schema.Lcmap.t -> 'Ldap_schema.Lcmap.t
      val mapi :
        (Ldap_schema.Lcmap.key -> '-> 'b) ->
        'Ldap_schema.Lcmap.t -> 'Ldap_schema.Lcmap.t
      val fold :
        (Ldap_schema.Lcmap.key -> '-> '-> 'b) ->
        'Ldap_schema.Lcmap.t -> '-> 'b
      val compare :
        ('-> '-> int) ->
        'Ldap_schema.Lcmap.t -> 'Ldap_schema.Lcmap.t -> int
      val equal :
        ('-> '-> bool) ->
        'Ldap_schema.Lcmap.t -> 'Ldap_schema.Lcmap.t -> bool
    end
  val format_lcstring : Ldap_schema.Lcstring.t -> unit
  type octype = Abstract | Structural | Auxiliary
  type objectclass = {
    oc_name : string list;
    oc_oid : Ldap_schema.Oid.t;
    oc_desc : string;
    oc_obsolete : bool;
    oc_sup : string list;
    oc_must : string list;
    oc_may : string list;
    oc_type : Ldap_schema.octype;
    oc_xattr : string list;
  }
  type attribute = {
    at_name : string list;
    at_desc : string;
    at_oid : Ldap_schema.Oid.t;
    at_equality : Ldap_schema.Oid.t option;
    at_ordering : Ldap_schema.Oid.t option;
    at_substr : Ldap_schema.Oid.t option;
    at_syntax : Ldap_schema.Oid.t;
    at_length : Int64.t;
    at_obsolete : bool;
    at_single_value : bool;
    at_collective : bool;
    at_no_user_modification : bool;
    at_usage : string;
    at_sup : string list;
    at_xattr : string list;
  }
  type schema = {
    objectclasses : Ldap_schema.objectclass Ldap_schema.Lcmap.t;
    objectclasses_byoid : Ldap_schema.objectclass Ldap_schema.Oidmap.t;
    attributes : Ldap_schema.attribute Ldap_schema.Lcmap.t;
    attributes_byoid : Ldap_schema.attribute Ldap_schema.Oidmap.t;
  }
  val schema_print_depth : int Pervasives.ref
  val format_schema : Ldap_schema.schema -> unit
  exception Parse_error_oc of Lexing.lexbuf * Ldap_schema.objectclass *
              string
  exception Parse_error_at of Lexing.lexbuf * Ldap_schema.attribute * string
  exception Syntax_error_oc of Lexing.lexbuf * Ldap_schema.objectclass *
              string
  exception Syntax_error_at of Lexing.lexbuf * Ldap_schema.attribute * string
  exception Invalid_objectclass of string
  exception Non_unique_objectclass_alias of string
  exception Invalid_attribute of string
  exception Non_unique_attribute_alias of string
  val readSchema : string list -> string list -> Ldap_schema.schema
  val attrNameToOid : Ldap_schema.schema -> string -> Ldap_schema.Oid.t
  val oidToAttr :
    Ldap_schema.schema -> Ldap_schema.Oid.t -> Ldap_schema.attribute
  val oidToAttrName : Ldap_schema.schema -> Ldap_schema.Oid.t -> string
  val attrNameToAttr : Ldap_schema.schema -> string -> Ldap_schema.attribute
  val ocNameToOc : Ldap_schema.schema -> string -> Ldap_schema.objectclass
  val ocNameToOid : Ldap_schema.schema -> string -> Ldap_schema.Oid.t
  val oidToOc :
    Ldap_schema.schema -> Ldap_schema.Oid.t -> Ldap_schema.objectclass
  val oidToOcName : Ldap_schema.schema -> Ldap_schema.Oid.t -> string
  val compareAttrs : Ldap_schema.schema -> string -> string -> int
  val compareOcs : Ldap_schema.schema -> string -> string -> int
  val lookupMatchingRule :
    Ldap_schema.schema ->
    [< `Equality | `Ordering | `Substring ] ->
    Ldap_schema.attribute -> Ldap_schema.Oid.t option
end