sig
  module ISet :
    sig
      type t = (int * int) AvlTree.tree
      type elt = int
      val empty : Main.Type.ISet.t
      val is_empty : Main.Type.ISet.t -> bool
      val mem : int -> Main.Type.ISet.t -> bool
      val add : int -> Main.Type.ISet.t -> Main.Type.ISet.t
      val add_range : int -> int -> Main.Type.ISet.t -> Main.Type.ISet.t
      val singleton : int -> Main.Type.ISet.t
      val remove : int -> Main.Type.ISet.t -> Main.Type.ISet.t
      val remove_range : int -> int -> Main.Type.ISet.t -> Main.Type.ISet.t
      val union : Main.Type.ISet.t -> Main.Type.ISet.t -> Main.Type.ISet.t
      val inter : Main.Type.ISet.t -> Main.Type.ISet.t -> Main.Type.ISet.t
      val diff : Main.Type.ISet.t -> Main.Type.ISet.t -> Main.Type.ISet.t
      val compl : Main.Type.ISet.t -> Main.Type.ISet.t
      val compare : Main.Type.ISet.t -> Main.Type.ISet.t -> int
      val equal : Main.Type.ISet.t -> Main.Type.ISet.t -> bool
      val subset : Main.Type.ISet.t -> Main.Type.ISet.t -> bool
      val from : int -> Main.Type.ISet.t -> Main.Type.ISet.t
      val after : int -> Main.Type.ISet.t -> Main.Type.ISet.t
      val until : int -> Main.Type.ISet.t -> Main.Type.ISet.t
      val before : int -> Main.Type.ISet.t -> Main.Type.ISet.t
      val iter : (int -> unit) -> Main.Type.ISet.t -> unit
      val iter_range : (int -> int -> unit) -> Main.Type.ISet.t -> unit
      val fold : (int -> '-> 'a) -> Main.Type.ISet.t -> '-> 'a
      val fold_range :
        (int -> int -> '-> 'a) -> Main.Type.ISet.t -> '-> 'a
      val for_all : (int -> bool) -> Main.Type.ISet.t -> bool
      val exists : (int -> bool) -> Main.Type.ISet.t -> bool
      val filter : (int -> bool) -> Main.Type.ISet.t -> Main.Type.ISet.t
      val partition :
        (int -> bool) ->
        Main.Type.ISet.t -> Main.Type.ISet.t * Main.Type.ISet.t
      val cardinal : Main.Type.ISet.t -> int
      val elements : Main.Type.ISet.t -> int list
      val ranges : Main.Type.ISet.t -> (int * int) list
      val min_elt : Main.Type.ISet.t -> int
      val max_elt : Main.Type.ISet.t -> int
      val choose : Main.Type.ISet.t -> int
    end
  module IMap :
    sig
      type 'a t = (int * int * 'a) AvlTree.tree
      type key = int
      val empty : 'Main.Type.IMap.t
      val is_empty : 'Main.Type.IMap.t -> bool
      val add :
        ?eq:('-> '-> bool) ->
        int -> '-> 'Main.Type.IMap.t -> 'Main.Type.IMap.t
      val add_range :
        ?eq:('-> '-> bool) ->
        int -> int -> '-> 'Main.Type.IMap.t -> 'Main.Type.IMap.t
      val find : int -> 'Main.Type.IMap.t -> 'a
      val remove : int -> 'Main.Type.IMap.t -> 'Main.Type.IMap.t
      val remove_range :
        int -> int -> 'Main.Type.IMap.t -> 'Main.Type.IMap.t
      val from : int -> 'Main.Type.IMap.t -> 'Main.Type.IMap.t
      val after : int -> 'Main.Type.IMap.t -> 'Main.Type.IMap.t
      val until : int -> 'Main.Type.IMap.t -> 'Main.Type.IMap.t
      val before : int -> 'Main.Type.IMap.t -> 'Main.Type.IMap.t
      val mem : int -> 'Main.Type.IMap.t -> bool
      val iter : (int -> '-> unit) -> 'Main.Type.IMap.t -> unit
      val iter_range :
        (int -> int -> '-> unit) -> 'Main.Type.IMap.t -> unit
      val map :
        ?eq:('-> '-> bool) ->
        ('-> 'a) -> 'Main.Type.IMap.t -> 'Main.Type.IMap.t
      val mapi :
        ?eq:('-> '-> bool) ->
        (int -> '-> 'a) -> 'Main.Type.IMap.t -> 'Main.Type.IMap.t
      val fold : (int -> '-> '-> 'b) -> 'Main.Type.IMap.t -> '-> 'b
      val fold_range :
        (int -> int -> '-> '-> 'b) -> 'Main.Type.IMap.t -> '-> 'b
      val set_to_map : Main.Type.ISet.t -> '-> 'Main.Type.IMap.t
      val domain : 'Main.Type.IMap.t -> Main.Type.ISet.t
      val map_to_set :
        ('-> bool) -> 'Main.Type.IMap.t -> Main.Type.ISet.t
    end
  module XArray :
    sig
      type 'a xarray
      type 'a t = 'Main.Type.XArray.xarray
      val init :
        ?bufsize:int ->
        int -> '-> (int -> 'a) -> 'Main.Type.XArray.xarray
      val make : ?bufsize:int -> int -> '-> 'Main.Type.XArray.xarray
      val length : 'Main.Type.XArray.xarray -> int
      val get : 'Main.Type.XArray.xarray -> int -> 'a
      val set : 'Main.Type.XArray.xarray -> int -> '-> unit
      type index
      val nth : 'Main.Type.XArray.xarray -> int -> Main.Type.XArray.index
      val first : 'Main.Type.XArray.xarray -> Main.Type.XArray.index
      val last : 'Main.Type.XArray.xarray -> Main.Type.XArray.index
      val look : 'Main.Type.XArray.xarray -> Main.Type.XArray.index -> 'a
      val next :
        'Main.Type.XArray.t ->
        Main.Type.XArray.index -> Main.Type.XArray.index
      val prev :
        'Main.Type.XArray.t ->
        Main.Type.XArray.index -> Main.Type.XArray.index
      val move :
        'Main.Type.XArray.t ->
        Main.Type.XArray.index -> int -> Main.Type.XArray.index
      val out_of_range :
        'Main.Type.XArray.xarray -> Main.Type.XArray.index -> bool
      val compare_index :
        'Main.Type.XArray.xarray ->
        Main.Type.XArray.index -> Main.Type.XArray.index -> int
      val clear : 'Main.Type.XArray.xarray -> unit
      val reset : 'Main.Type.XArray.xarray -> unit
      val copy : 'Main.Type.XArray.xarray -> 'Main.Type.XArray.xarray
      val sub :
        'Main.Type.XArray.xarray ->
        int -> int -> 'Main.Type.XArray.xarray
      val add_element : 'Main.Type.XArray.xarray -> '-> unit
      val add_array : 'Main.Type.XArray.xarray -> 'a array -> unit
      val add_xarray :
        'Main.Type.XArray.xarray -> 'Main.Type.XArray.xarray -> unit
      val append :
        'Main.Type.XArray.xarray ->
        'Main.Type.XArray.xarray -> 'Main.Type.XArray.xarray
      val iter : ('-> unit) -> 'Main.Type.XArray.xarray -> unit
      val array_of : 'Main.Type.XArray.xarray -> 'a array
      val shrink : 'Main.Type.XArray.xarray -> int -> unit
    end
  module OOChannel :
    sig
      class type ['a] obj_input_channel =
        object method close_in : unit -> unit method get : unit -> 'end
      class type ['a] obj_output_channel =
        object
          method close_out : unit -> unit
          method flush : unit -> unit
          method put : '-> unit
        end
      class ['a] channel_of_stream : 'Stream.t -> ['a] obj_input_channel
      val stream_of_channel :
        '#Main.Type.OOChannel.obj_input_channel -> 'Stream.t
      class type char_input_channel =
        object
          method close_in : unit -> unit
          method input : string -> int -> int -> int
        end
      class type char_output_channel =
        object
          method close_out : unit -> unit
          method flush : unit -> unit
          method output : string -> int -> int -> int
        end
      class char_input_channel_of :
        char #Main.Type.OOChannel.obj_input_channel -> char_input_channel
      class char_obj_input_channel_of :
        Main.Type.OOChannel.char_input_channel -> [char] obj_input_channel
      class char_output_channel_of :
        char #Main.Type.OOChannel.obj_output_channel -> char_output_channel
      class char_obj_output_channel_of :
        Main.Type.OOChannel.char_output_channel -> [char] obj_output_channel
      class of_in_channel : Pervasives.in_channel -> char_input_channel
      class of_out_channel : Pervasives.out_channel -> char_output_channel
    end
  module UChar :
    sig
      type t
      exception Out_of_range
      val char_of : Main.Type.UChar.t -> char
      val of_char : char -> Main.Type.UChar.t
      val code : Main.Type.UChar.t -> int
      val chr : int -> Main.Type.UChar.t
      external uint_code : Main.Type.UChar.t -> int = "%identity"
      val chr_of_uint : int -> Main.Type.UChar.t
      val eq : Main.Type.UChar.t -> Main.Type.UChar.t -> bool
      val compare : Main.Type.UChar.t -> Main.Type.UChar.t -> int
      type uchar = Main.Type.UChar.t
      val int_of : Main.Type.UChar.uchar -> int
      val of_int : int -> Main.Type.UChar.uchar
    end
  module USet :
    sig
      type t
      val empty : Main.Type.USet.t
      val is_empty : Main.Type.USet.t -> bool
      val mem : Main.Type.UChar.t -> Main.Type.USet.t -> bool
      val add : Main.Type.UChar.t -> Main.Type.USet.t -> Main.Type.USet.t
      val add_range :
        Main.Type.UChar.t ->
        Main.Type.UChar.t -> Main.Type.USet.t -> Main.Type.USet.t
      val singleton : Main.Type.UChar.t -> Main.Type.USet.t
      val remove : Main.Type.UChar.t -> Main.Type.USet.t -> Main.Type.USet.t
      val remove_range :
        Main.Type.UChar.t ->
        Main.Type.UChar.t -> Main.Type.USet.t -> Main.Type.USet.t
      val union : Main.Type.USet.t -> Main.Type.USet.t -> Main.Type.USet.t
      val inter : Main.Type.USet.t -> Main.Type.USet.t -> Main.Type.USet.t
      val diff : Main.Type.USet.t -> Main.Type.USet.t -> Main.Type.USet.t
      val compl : Main.Type.USet.t -> Main.Type.USet.t
      val compare : Main.Type.USet.t -> Main.Type.USet.t -> int
      val equal : Main.Type.USet.t -> Main.Type.USet.t -> bool
      val subset : Main.Type.USet.t -> Main.Type.USet.t -> bool
      val from : Main.Type.UChar.t -> Main.Type.USet.t -> Main.Type.USet.t
      val after : Main.Type.UChar.t -> Main.Type.USet.t -> Main.Type.USet.t
      val until : Main.Type.UChar.t -> Main.Type.USet.t -> Main.Type.USet.t
      val before : Main.Type.UChar.t -> Main.Type.USet.t -> Main.Type.USet.t
      val iter : (Main.Type.UChar.t -> unit) -> Main.Type.USet.t -> unit
      val iter_range :
        (Main.Type.UChar.t -> Main.Type.UChar.t -> unit) ->
        Main.Type.USet.t -> unit
      val fold :
        (Main.Type.UChar.t -> '-> 'a) -> Main.Type.USet.t -> '-> 'a
      val fold_range :
        (Main.Type.UChar.t -> Main.Type.UChar.t -> '-> 'a) ->
        Main.Type.USet.t -> '-> 'a
      val for_all : (Main.Type.UChar.t -> bool) -> Main.Type.USet.t -> bool
      val exists : (Main.Type.UChar.t -> bool) -> Main.Type.USet.t -> bool
      val filter :
        (Main.Type.UChar.t -> bool) -> Main.Type.USet.t -> Main.Type.USet.t
      val partition :
        (Main.Type.UChar.t -> bool) ->
        Main.Type.USet.t -> Main.Type.USet.t * Main.Type.USet.t
      val cardinal : Main.Type.USet.t -> int
      val elements : Main.Type.USet.t -> Main.Type.UChar.t list
      val ranges :
        Main.Type.USet.t -> (Main.Type.UChar.t * Main.Type.UChar.t) list
      val min_elt : Main.Type.USet.t -> Main.Type.UChar.t
      val max_elt : Main.Type.USet.t -> Main.Type.UChar.t
      val choose : Main.Type.USet.t -> Main.Type.UChar.t
      val uset_of_iset : Main.Type.ISet.t -> Main.Type.USet.t
      val iset_of_uset : Main.Type.USet.t -> Main.Type.ISet.t
    end
  module UMap :
    sig
      type 'a t
      val empty : 'Main.Type.UMap.t
      val is_empty : 'Main.Type.UMap.t -> bool
      val add :
        ?eq:('-> '-> bool) ->
        Main.Type.UChar.t -> '-> 'Main.Type.UMap.t -> 'Main.Type.UMap.t
      val add_range :
        ?eq:('-> '-> bool) ->
        Main.Type.UChar.t ->
        Main.Type.UChar.t -> '-> 'Main.Type.UMap.t -> 'Main.Type.UMap.t
      val find : Main.Type.UChar.t -> 'Main.Type.UMap.t -> 'a
      val remove :
        Main.Type.UChar.t -> 'Main.Type.UMap.t -> 'Main.Type.UMap.t
      val remove_range :
        Main.Type.UChar.t ->
        Main.Type.UChar.t -> 'Main.Type.UMap.t -> 'Main.Type.UMap.t
      val from :
        Main.Type.UChar.t -> 'Main.Type.UMap.t -> 'Main.Type.UMap.t
      val after :
        Main.Type.UChar.t -> 'Main.Type.UMap.t -> 'Main.Type.UMap.t
      val until :
        Main.Type.UChar.t -> 'Main.Type.UMap.t -> 'Main.Type.UMap.t
      val before :
        Main.Type.UChar.t -> 'Main.Type.UMap.t -> 'Main.Type.UMap.t
      val mem : Main.Type.UChar.t -> 'Main.Type.UMap.t -> bool
      val iter :
        (Main.Type.UChar.t -> '-> unit) -> 'Main.Type.UMap.t -> unit
      val iter_range :
        (Main.Type.UChar.t -> Main.Type.UChar.t -> '-> unit) ->
        'Main.Type.UMap.t -> unit
      val map :
        ?eq:('-> '-> bool) ->
        ('-> 'a) -> 'Main.Type.UMap.t -> 'Main.Type.UMap.t
      val mapi :
        ?eq:('-> '-> bool) ->
        (Main.Type.UChar.t -> '-> 'a) ->
        'Main.Type.UMap.t -> 'Main.Type.UMap.t
      val fold :
        (Main.Type.UChar.t -> '-> '-> 'b) ->
        'Main.Type.UMap.t -> '-> 'b
      val fold_range :
        (Main.Type.UChar.t -> Main.Type.UChar.t -> '-> '-> 'b) ->
        'Main.Type.UMap.t -> '-> 'b
      val set_to_map : Main.Type.USet.t -> '-> 'Main.Type.UMap.t
      val domain : 'Main.Type.UMap.t -> Main.Type.USet.t
      val map_to_set :
        ('-> bool) -> 'Main.Type.UMap.t -> Main.Type.USet.t
      val umap_of_imap : 'Main.Type.IMap.t -> 'Main.Type.UMap.t
      val imap_of_umap : 'Main.Type.UMap.t -> 'Main.Type.IMap.t
    end
  module UCharTbl :
    sig
      type 'a tbl
      type 'a t = 'Main.Type.UCharTbl.tbl
      val get : 'Main.Type.UCharTbl.tbl -> Main.Type.UChar.t -> 'a
      module type Type =
        sig
          type elt
          type t = Main.Type.UCharTbl.Type.elt Main.Type.UCharTbl.tbl
          val get :
            Main.Type.UCharTbl.Type.elt Main.Type.UCharTbl.tbl ->
            Main.Type.UChar.t -> Main.Type.UCharTbl.Type.elt
          val of_map :
            Main.Type.UCharTbl.Type.elt ->
            Main.Type.UCharTbl.Type.elt Main.Type.UMap.t ->
            Main.Type.UCharTbl.Type.t
        end
      module Make :
        functor (H : Hashtbl.HashedType->
          sig
            type elt = H.t
            type t = elt tbl
            val get : elt tbl -> UChar.t -> elt
            val of_map : elt -> elt UMap.t -> t
          end
      module Bool :
        sig
          type t
          val get : Main.Type.UCharTbl.Bool.t -> Main.Type.UChar.t -> bool
          val of_set : Main.Type.USet.t -> Main.Type.UCharTbl.Bool.t
        end
      module Bits :
        sig
          type t
          val of_map :
            int -> int Main.Type.UMap.t -> Main.Type.UCharTbl.Bits.t
          val get : Main.Type.UCharTbl.Bits.t -> Main.Type.UChar.t -> int
        end
      module Bytes :
        sig
          type t
          val of_map :
            int -> int Main.Type.UMap.t -> Main.Type.UCharTbl.Bytes.t
          val get : Main.Type.UCharTbl.Bytes.t -> Main.Type.UChar.t -> int
        end
      module Char :
        sig
          type t
          val of_map :
            char -> char Main.Type.UMap.t -> Main.Type.UCharTbl.Char.t
          val get : Main.Type.UCharTbl.Char.t -> Main.Type.UChar.t -> char
        end
    end
  module UnicodeString :
    sig
      module type Type =
        sig
          type t
          val get :
            Main.Type.UnicodeString.Type.t -> int -> Main.Type.UChar.t
          val init :
            int ->
            (int -> Main.Type.UChar.t) -> Main.Type.UnicodeString.Type.t
          val length : Main.Type.UnicodeString.Type.t -> int
          type index
          val look :
            Main.Type.UnicodeString.Type.t ->
            Main.Type.UnicodeString.Type.index -> Main.Type.UChar.t
          val nth :
            Main.Type.UnicodeString.Type.t ->
            int -> Main.Type.UnicodeString.Type.index
          val next :
            Main.Type.UnicodeString.Type.t ->
            Main.Type.UnicodeString.Type.index ->
            Main.Type.UnicodeString.Type.index
          val prev :
            Main.Type.UnicodeString.Type.t ->
            Main.Type.UnicodeString.Type.index ->
            Main.Type.UnicodeString.Type.index
          val out_of_range :
            Main.Type.UnicodeString.Type.t ->
            Main.Type.UnicodeString.Type.index -> bool
          val iter :
            (Main.Type.UChar.t -> unit) ->
            Main.Type.UnicodeString.Type.t -> unit
          val compare :
            Main.Type.UnicodeString.Type.t ->
            Main.Type.UnicodeString.Type.t -> int
          val first :
            Main.Type.UnicodeString.Type.t ->
            Main.Type.UnicodeString.Type.index
          val last :
            Main.Type.UnicodeString.Type.t ->
            Main.Type.UnicodeString.Type.index
          val move :
            Main.Type.UnicodeString.Type.t ->
            Main.Type.UnicodeString.Type.index ->
            int -> Main.Type.UnicodeString.Type.index
          val compare_index :
            Main.Type.UnicodeString.Type.t ->
            Main.Type.UnicodeString.Type.index ->
            Main.Type.UnicodeString.Type.index -> int
          module Buf :
            sig
              type buf
              val create : int -> Main.Type.UnicodeString.Type.Buf.buf
              val contents :
                Main.Type.UnicodeString.Type.Buf.buf ->
                Main.Type.UnicodeString.Type.t
              val clear : Main.Type.UnicodeString.Type.Buf.buf -> unit
              val reset : Main.Type.UnicodeString.Type.Buf.buf -> unit
              val add_char :
                Main.Type.UnicodeString.Type.Buf.buf ->
                Main.Type.UChar.t -> unit
              val add_string :
                Main.Type.UnicodeString.Type.Buf.buf ->
                Main.Type.UnicodeString.Type.t -> unit
              val add_buffer :
                Main.Type.UnicodeString.Type.Buf.buf ->
                Main.Type.UnicodeString.Type.Buf.buf -> unit
            end
        end
    end
  module UText :
    sig
      type mutability = [ `Immutable | `Mutable ]
      type 'a text
      type utext = [ `Immutable ] Main.Type.UText.text
      type ustring = [ `Mutable ] Main.Type.UText.text
      type t = Main.Type.UText.utext
      val utext_of_ustring : Main.Type.UText.ustring -> Main.Type.UText.utext
      val ustring_of_utext : Main.Type.UText.utext -> Main.Type.UText.ustring
      val get : 'Main.Type.UText.text -> int -> Main.Type.UChar.t
      val set : Main.Type.UText.ustring -> int -> Main.Type.UChar.t -> unit
      type index
      val look :
        'Main.Type.UText.text -> Main.Type.UText.index -> Main.Type.UChar.t
      val nth : 'Main.Type.UText.text -> int -> Main.Type.UText.index
      val first : 'Main.Type.UText.text -> Main.Type.UText.index
      val last : 'Main.Type.UText.text -> Main.Type.UText.index
      val out_of_range :
        'Main.Type.UText.text -> Main.Type.UText.index -> bool
      val compare_index :
        'Main.Type.UText.text ->
        Main.Type.UText.index -> Main.Type.UText.index -> int
      val next :
        'Main.Type.UText.text ->
        Main.Type.UText.index -> Main.Type.UText.index
      val prev :
        'Main.Type.UText.text ->
        Main.Type.UText.index -> Main.Type.UText.index
      val move :
        'Main.Type.UText.text ->
        Main.Type.UText.index -> int -> Main.Type.UText.index
      val length : 'Main.Type.UText.text -> int
      val of_string : string -> Main.Type.UText.utext
      val init : int -> (int -> Main.Type.UChar.t) -> Main.Type.UText.utext
      val init_ustring :
        int -> (int -> Main.Type.UChar.t) -> Main.Type.UText.ustring
      val make : int -> Main.Type.UChar.t -> Main.Type.UText.ustring
      val copy : Main.Type.UText.ustring -> Main.Type.UText.ustring
      val sub :
        'Main.Type.UText.text -> int -> int -> 'Main.Type.UText.text
      val fill :
        Main.Type.UText.ustring -> int -> int -> Main.Type.UChar.t -> unit
      val blit :
        'Main.Type.UText.text ->
        int -> Main.Type.UText.ustring -> int -> int -> unit
      val append :
        'Main.Type.UText.text ->
        'Main.Type.UText.text -> 'Main.Type.UText.text
      val iter :
        (Main.Type.UChar.t -> unit) -> 'Main.Type.UText.text -> unit
      val compare : 'Main.Type.UText.text -> 'Main.Type.UText.text -> int
      module Buf :
        sig
          type buf
          val create : int -> Main.Type