module Result = struct type ('a, 'b) result = Ok of 'a | Error of 'b end open Result
module Eol_detect
= struct
#1 "eol_detect.ml"
type eol =
  | LF 
  | CRLF 
let show eol = match eol with | LF -> "lf" | CRLF -> "crlf"
let default_eol = match Sys.win32 with | true -> CRLF | _ -> LF
let get_eol_for_file filename =
  let ic = open_in_bin filename in
  let line = ref "" in
  let c = ref ' ' in
  let prev = ref None in
  try
    while (!c) <> '\n' do
      (prev := (Some (!c));
       c := (input_char ic);
       line := ((!line) ^ (String.make 1 (!c))))
      done;
    (match !prev with
     | None -> default_eol
     | Some '\r' -> CRLF
     | Some _ -> LF)
  with | End_of_file -> (close_in ic; default_eol)
end
module Eol_convert
= struct
#1 "eol_convert.ml"
open Eol_detect

let lf_to_crlf s =
  let rec loop sz =
    match String.index sz '\n' with
    | exception Not_found -> sz
    | idx ->
        let l = (String.sub sz 0 idx) ^ "\r\n" in
        let length = String.length sz in
        l ^ (loop (String.sub sz (idx + 1) ((length - idx) - 1))) in
  loop s

let get_formatter output_channel eol =
  let f = Format.formatter_of_out_channel output_channel in
  let out_functions = Format.pp_get_formatter_out_functions f () in
  let out_string s p n =
    match eol with
    | LF -> out_functions.out_string s p n
    | CRLF ->
        let str = String.sub s p n in
        let str = lf_to_crlf str in
        out_functions.out_string str 0 (String.length str) in
  let new_functions = { out_functions with out_string } in
  Format.pp_set_formatter_out_functions f new_functions; f

end
module Package
= struct
#1 "package.ml"

let version = "3.4.2"
let git_version = "3c6a9ca981f8c4902cc48c2ac9fb4d2bdb25f79a"
let git_short_version = "3c6a9ca9"

end
module Ast_402
= struct
#1 "ast_402.ml"
# 1 "src/ast_402.ml"
(**************************************************************************)
(*                                                                        *)
(*                         OCaml Migrate Parsetree                        *)
(*                                                                        *)
(*                             Frédéric Bour                              *)
(*            Jérémie Dimino and Leo White, Jane Street Europe            *)
(*            Xavier Leroy, projet Cristal, INRIA Rocquencourt            *)
(*                         Alain Frisch, LexiFi                           *)
(*       Daniel de Rauglaudre, projet Cristal, INRIA Rocquencourt         *)
(*                                                                        *)
(*   Copyright 2017 Institut National de Recherche en Informatique et     *)
(*     en Automatique (INRIA).                                            *)
(*                                                                        *)
(*   All rights reserved.  This file is distributed under the terms of    *)
(*   the GNU Lesser General Public License version 2.1, with the          *)
(*   special exception on linking described in the file LICENSE.          *)
(*                                                                        *)
(**************************************************************************)

module Location = Location
module Longident = Longident

module Asttypes = struct
  (* Auxiliary a.s.t. types used by parsetree and typedtree. *)

  type constant (*IF_CURRENT = Asttypes.constant *) =
      Const_int of int
    | Const_char of char
    | Const_string of string * string option
    | Const_float of string
    | Const_int32 of int32
    | Const_int64 of int64
    | Const_nativeint of nativeint

  type rec_flag (*IF_CURRENT = Asttypes.rec_flag *) = Nonrecursive | Recursive

  type direction_flag (*IF_CURRENT = Asttypes.direction_flag *) = Upto | Downto

  type private_flag (*IF_CURRENT = Asttypes.private_flag *) = Private | Public

  type mutable_flag (*IF_CURRENT = Asttypes.mutable_flag *) = Immutable | Mutable

  type virtual_flag (*IF_CURRENT = Asttypes.virtual_flag *) = Virtual | Concrete

  type override_flag (*IF_CURRENT = Asttypes.override_flag *) = Override | Fresh

  type closed_flag (*IF_CURRENT = Asttypes.closed_flag *) = Closed | Open

  type label = string

  type 'a loc = 'a Location.loc = {
    txt : 'a;
    loc : Location.t;
  }


  type variance (*IF_CURRENT = Asttypes.variance *) =
    | Covariant
    | Contravariant
    | Invariant
end

module Parsetree = struct
  (** Abstract syntax tree produced by parsing *)

  open Asttypes

  (** {2 Extension points} *)

  type attribute = string loc * payload
         (* [@id ARG]
            [@@id ARG]

            Metadata containers passed around within the AST.
            The compiler ignores unknown attributes.
         *)

  and extension = string loc * payload
        (* [%id ARG]
           [%%id ARG]

           Sub-language placeholder -- rejected by the typechecker.
        *)

  and attributes = attribute list

  and payload (*IF_CURRENT = Parsetree.payload *) =
    | PStr of structure
    | PTyp of core_type  (* : T *)
    | PPat of pattern * expression option  (* ? P  or  ? P when E *)

  (** {2 Core language} *)

  (* Type expressions *)

  and core_type (*IF_CURRENT = Parsetree.core_type *) =
      {
       ptyp_desc: core_type_desc;
       ptyp_loc: Location.t;
       ptyp_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and core_type_desc (*IF_CURRENT = Parsetree.core_type_desc *) =
    | Ptyp_any
          (*  _ *)
    | Ptyp_var of string
          (* 'a *)
    | Ptyp_arrow of label * core_type * core_type
          (* T1 -> T2       (label = "")
             ~l:T1 -> T2    (label = "l")
             ?l:T1 -> T2    (label = "?l")
           *)
    | Ptyp_tuple of core_type list
          (* T1 * ... * Tn

             Invariant: n >= 2
          *)
    | Ptyp_constr of Longident.t loc * core_type list
          (* tconstr
             T tconstr
             (T1, ..., Tn) tconstr
           *)
    | Ptyp_object of (string * attributes * core_type) list * closed_flag
          (* < l1:T1; ...; ln:Tn >     (flag = Closed)
             < l1:T1; ...; ln:Tn; .. > (flag = Open)
           *)
    | Ptyp_class of Longident.t loc * core_type list
          (* #tconstr
             T #tconstr
             (T1, ..., Tn) #tconstr
           *)
    | Ptyp_alias of core_type * string
          (* T as 'a *)
    | Ptyp_variant of row_field list * closed_flag * label list option
          (* [ `A|`B ]         (flag = Closed; labels = None)
             [> `A|`B ]        (flag = Open;   labels = None)
             [< `A|`B ]        (flag = Closed; labels = Some [])
             [< `A|`B > `X `Y ](flag = Closed; labels = Some ["X";"Y"])
           *)
    | Ptyp_poly of string list * core_type
          (* 'a1 ... 'an. T

             Can only appear in the following context:

             - As the core_type of a Ppat_constraint node corresponding
               to a constraint on a let-binding: let x : 'a1 ... 'an. T
               = e ...

             - Under Cfk_virtual for methods (not values).

             - As the core_type of a Pctf_method node.

             - As the core_type of a Pexp_poly node.

             - As the pld_type field of a label_declaration.

             - As a core_type of a Ptyp_object node.
           *)

    | Ptyp_package of package_type
          (* (module S) *)
    | Ptyp_extension of extension
          (* [%id] *)

  and package_type = Longident.t loc * (Longident.t loc * core_type) list
        (*
          (module S)
          (module S with type t1 = T1 and ... and tn = Tn)
         *)

  and row_field (*IF_CURRENT = Parsetree.row_field *) =
    | Rtag of label * attributes * bool * core_type list
          (* [`A]                   ( true,  [] )
             [`A of T]              ( false, [T] )
             [`A of T1 & .. & Tn]   ( false, [T1;...Tn] )
             [`A of & T1 & .. & Tn] ( true,  [T1;...Tn] )

            - The 2nd field is true if the tag contains a
              constant (empty) constructor.
            - '&' occurs when several types are used for the same constructor
              (see 4.2 in the manual)

            - TODO: switch to a record representation, and keep location
          *)
    | Rinherit of core_type
          (* [ T ] *)

  (* Patterns *)

  and pattern (*IF_CURRENT = Parsetree.pattern *) =
      {
       ppat_desc: pattern_desc;
       ppat_loc: Location.t;
       ppat_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and pattern_desc (*IF_CURRENT = Parsetree.pattern_desc *) =
    | Ppat_any
          (* _ *)
    | Ppat_var of string loc
          (* x *)
    | Ppat_alias of pattern * string loc
          (* P as 'a *)
    | Ppat_constant of constant
          (* 1, 'a', "true", 1.0, 1l, 1L, 1n *)
    | Ppat_interval of constant * constant
          (* 'a'..'z'

             Other forms of interval are recognized by the parser
             but rejected by the type-checker. *)
    | Ppat_tuple of pattern list
          (* (P1, ..., Pn)

             Invariant: n >= 2
          *)
    | Ppat_construct of Longident.t loc * pattern option
          (* C                None
             C P              Some P
             C (P1, ..., Pn)  Some (Ppat_tuple [P1; ...; Pn])
           *)
    | Ppat_variant of label * pattern option
          (* `A             (None)
             `A P           (Some P)
           *)
    | Ppat_record of (Longident.t loc * pattern) list * closed_flag
          (* { l1=P1; ...; ln=Pn }     (flag = Closed)
             { l1=P1; ...; ln=Pn; _}   (flag = Open)

             Invariant: n > 0
           *)
    | Ppat_array of pattern list
          (* [| P1; ...; Pn |] *)
    | Ppat_or of pattern * pattern
          (* P1 | P2 *)
    | Ppat_constraint of pattern * core_type
          (* (P : T) *)
    | Ppat_type of Longident.t loc
          (* #tconst *)
    | Ppat_lazy of pattern
          (* lazy P *)
    | Ppat_unpack of string loc
          (* (module P)
             Note: (module P : S) is represented as
             Ppat_constraint(Ppat_unpack, Ptyp_package)
           *)
    | Ppat_exception of pattern
          (* exception P *)
    | Ppat_extension of extension
          (* [%id] *)

  (* Value expressions *)

  and expression (*IF_CURRENT = Parsetree.expression *) =
      {
       pexp_desc: expression_desc;
       pexp_loc: Location.t;
       pexp_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and expression_desc (*IF_CURRENT = Parsetree.expression_desc *) =
    | Pexp_ident of Longident.t loc
          (* x
             M.x
           *)
    | Pexp_constant of constant
          (* 1, 'a', "true", 1.0, 1l, 1L, 1n *)
    | Pexp_let of rec_flag * value_binding list * expression
          (* let P1 = E1 and ... and Pn = EN in E       (flag = Nonrecursive)
             let rec P1 = E1 and ... and Pn = EN in E   (flag = Recursive)
           *)
    | Pexp_function of case list
          (* function P1 -> E1 | ... | Pn -> En *)
    | Pexp_fun of label * expression option * pattern * expression
          (* fun P -> E1                          (lab = "", None)
             fun ~l:P -> E1                       (lab = "l", None)
             fun ?l:P -> E1                       (lab = "?l", None)
             fun ?l:(P = E0) -> E1                (lab = "?l", Some E0)

             Notes:
             - If E0 is provided, lab must start with '?'.
             - "fun P1 P2 .. Pn -> E1" is represented as nested Pexp_fun.
             - "let f P = E" is represented using Pexp_fun.
           *)
    | Pexp_apply of expression * (label * expression) list
          (* E0 ~l1:E1 ... ~ln:En
             li can be empty (non labeled argument) or start with '?'
             (optional argument).

             Invariant: n > 0
           *)
    | Pexp_match of expression * case list
          (* match E0 with P1 -> E1 | ... | Pn -> En *)
    | Pexp_try of expression * case list
          (* try E0 with P1 -> E1 | ... | Pn -> En *)
    | Pexp_tuple of expression list
          (* (E1, ..., En)

             Invariant: n >= 2
          *)
    | Pexp_construct of Longident.t loc * expression option
          (* C                None
             C E              Some E
             C (E1, ..., En)  Some (Pexp_tuple[E1;...;En])
          *)
    | Pexp_variant of label * expression option
          (* `A             (None)
             `A E           (Some E)
           *)
    | Pexp_record of (Longident.t loc * expression) list * expression option
          (* { l1=P1; ...; ln=Pn }     (None)
             { E0 with l1=P1; ...; ln=Pn }   (Some E0)

             Invariant: n > 0
           *)
    | Pexp_field of expression * Longident.t loc
          (* E.l *)
    | Pexp_setfield of expression * Longident.t loc * expression
          (* E1.l <- E2 *)
    | Pexp_array of expression list
          (* [| E1; ...; En |] *)
    | Pexp_ifthenelse of expression * expression * expression option
          (* if E1 then E2 else E3 *)
    | Pexp_sequence of expression * expression
          (* E1; E2 *)
    | Pexp_while of expression * expression
          (* while E1 do E2 done *)
    | Pexp_for of
        pattern *  expression * expression * direction_flag * expression
          (* for i = E1 to E2 do E3 done      (flag = Upto)
             for i = E1 downto E2 do E3 done  (flag = Downto)
           *)
    | Pexp_constraint of expression * core_type
          (* (E : T) *)
    | Pexp_coerce of expression * core_type option * core_type
          (* (E :> T)        (None, T)
             (E : T0 :> T)   (Some T0, T)
           *)
    | Pexp_send of expression * string
          (*  E # m *)
    | Pexp_new of Longident.t loc
          (* new M.c *)
    | Pexp_setinstvar of string loc * expression
          (* x <- 2 *)
    | Pexp_override of (string loc * expression) list
          (* {< x1 = E1; ...; Xn = En >} *)
    | Pexp_letmodule of string loc * module_expr * expression
          (* let module M = ME in E *)
    | Pexp_assert of expression
          (* assert E
             Note: "assert false" is treated in a special way by the
             type-checker. *)
    | Pexp_lazy of expression
          (* lazy E *)
    | Pexp_poly of expression * core_type option
          (* Used for method bodies.

             Can only be used as the expression under Cfk_concrete
             for methods (not values). *)
    | Pexp_object of class_structure
          (* object ... end *)
    | Pexp_newtype of string * expression
          (* fun (type t) -> E *)
    | Pexp_pack of module_expr
          (* (module ME)

             (module ME : S) is represented as
             Pexp_constraint(Pexp_pack, Ptyp_package S) *)
    | Pexp_open of override_flag * Longident.t loc * expression
          (* let open M in E
             let! open M in E
          *)
    | Pexp_extension of extension
          (* [%id] *)

  and case (*IF_CURRENT = Parsetree.case *) =   (* (P -> E) or (P when E0 -> E) *)
      {
       pc_lhs: pattern;
       pc_guard: expression option;
       pc_rhs: expression;
      }

  (* Value descriptions *)

  and value_description (*IF_CURRENT = Parsetree.value_description *) =
      {
       pval_name: string loc;
       pval_type: core_type;
       pval_prim: string list;
       pval_attributes: attributes;  (* ... [@@id1] [@@id2] *)
       pval_loc: Location.t;
      }

  (*
    val x: T                            (prim = [])
    external x: T = "s1" ... "sn"       (prim = ["s1";..."sn"])

    Note: when used under Pstr_primitive, prim cannot be empty
  *)

  (* Type declarations *)

  and type_declaration (*IF_CURRENT = Parsetree.type_declaration *) =
      {
       ptype_name: string loc;
       ptype_params: (core_type * variance) list;
             (* ('a1,...'an) t; None represents  _*)
       ptype_cstrs: (core_type * core_type * Location.t) list;
             (* ... constraint T1=T1'  ... constraint Tn=Tn' *)
       ptype_kind: type_kind;
       ptype_private: private_flag;   (* = private ... *)
       ptype_manifest: core_type option;  (* = T *)
       ptype_attributes: attributes;   (* ... [@@id1] [@@id2] *)
       ptype_loc: Location.t;
      }

  (*
    type t                     (abstract, no manifest)
    type t = T0                (abstract, manifest=T0)
    type t = C of T | ...      (variant,  no manifest)
    type t = T0 = C of T | ... (variant,  manifest=T0)
    type t = {l: T; ...}       (record,   no manifest)
    type t = T0 = {l : T; ...} (record,   manifest=T0)
    type t = ..                (open,     no manifest)
  *)

  and type_kind (*IF_CURRENT = Parsetree.type_kind *) =
    | Ptype_abstract
    | Ptype_variant of constructor_declaration list
          (* Invariant: non-empty list *)
    | Ptype_record of label_declaration list
          (* Invariant: non-empty list *)
    | Ptype_open

  and label_declaration (*IF_CURRENT = Parsetree.label_declaration *) =
      {
       pld_name: string loc;
       pld_mutable: mutable_flag;
       pld_type: core_type;
       pld_loc: Location.t;
       pld_attributes: attributes; (* l [@id1] [@id2] : T *)
      }

  (*  { ...; l: T; ... }            (mutable=Immutable)
      { ...; mutable l: T; ... }    (mutable=Mutable)

      Note: T can be a Ptyp_poly.
  *)

  and constructor_declaration (*IF_CURRENT = Parsetree.constructor_declaration *) =
      {
       pcd_name: string loc;
       pcd_args: core_type list;
       pcd_res: core_type option;
       pcd_loc: Location.t;
       pcd_attributes: attributes; (* C [@id1] [@id2] of ... *)
      }
  (*
    | C of T1 * ... * Tn     (res = None)
    | C: T0                  (args = [], res = Some T0)
    | C: T1 * ... * Tn -> T0 (res = Some T0)
  *)

  and type_extension (*IF_CURRENT = Parsetree.type_extension *) =
      {
       ptyext_path: Longident.t loc;
       ptyext_params: (core_type * variance) list;
       ptyext_constructors: extension_constructor list;
       ptyext_private: private_flag;
       ptyext_attributes: attributes;   (* ... [@@id1] [@@id2] *)
      }
  (*
    type t += ...
  *)

  and extension_constructor (*IF_CURRENT = Parsetree.extension_constructor *) =
      {
       pext_name: string loc;
       pext_kind : extension_constructor_kind;
       pext_loc : Location.t;
       pext_attributes: attributes; (* C [@id1] [@id2] of ... *)
      }

  and extension_constructor_kind (*IF_CURRENT = Parsetree.extension_constructor_kind *) =
      Pext_decl of core_type list * core_type option
        (*
           | C of T1 * ... * Tn     ([T1; ...; Tn], None)
           | C: T0                  ([], Some T0)
           | C: T1 * ... * Tn -> T0 ([T1; ...; Tn], Some T0)
         *)
    | Pext_rebind of Longident.t loc
        (*
           | C = D
         *)

  (** {2 Class language} *)

  (* Type expressions for the class language *)

  and class_type (*IF_CURRENT = Parsetree.class_type *) =
      {
       pcty_desc: class_type_desc;
       pcty_loc: Location.t;
       pcty_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and class_type_desc (*IF_CURRENT = Parsetree.class_type_desc *) =
    | Pcty_constr of Longident.t loc * core_type list
          (* c
             ['a1, ..., 'an] c *)
    | Pcty_signature of class_signature
          (* object ... end *)
    | Pcty_arrow of label * core_type * class_type
          (* T -> CT       (label = "")
             ~l:T -> CT    (label = "l")
             ?l:T -> CT    (label = "?l")
           *)
    | Pcty_extension of extension
          (* [%id] *)

  and class_signature (*IF_CURRENT = Parsetree.class_signature *) =
      {
       pcsig_self: core_type;
       pcsig_fields: class_type_field list;
      }
  (* object('selfpat) ... end
     object ... end             (self = Ptyp_any)
   *)

  and class_type_field (*IF_CURRENT = Parsetree.class_type_field *) =
      {
       pctf_desc: class_type_field_desc;
       pctf_loc: Location.t;
       pctf_attributes: attributes; (* ... [@@id1] [@@id2] *)
      }

  and class_type_field_desc (*IF_CURRENT = Parsetree.class_type_field_desc *) =
    | Pctf_inherit of class_type
          (* inherit CT *)
    | Pctf_val of (string * mutable_flag * virtual_flag * core_type)
          (* val x: T *)
    | Pctf_method  of (string * private_flag * virtual_flag * core_type)
          (* method x: T

             Note: T can be a Ptyp_poly.
           *)
    | Pctf_constraint  of (core_type * core_type)
          (* constraint T1 = T2 *)
    | Pctf_attribute of attribute
          (* [@@@id] *)
    | Pctf_extension of extension
          (* [%%id] *)

  and 'a class_infos (*IF_CURRENT = 'a Parsetree.class_infos *) =
      {
       pci_virt: virtual_flag;
       pci_params: (core_type * variance) list;
       pci_name: string loc;
       pci_expr: 'a;
       pci_loc: Location.t;
       pci_attributes: attributes;  (* ... [@@id1] [@@id2] *)
      }
  (* class c = ...
     class ['a1,...,'an] c = ...
     class virtual c = ...

     Also used for "class type" declaration.
  *)

  and class_description = class_type class_infos

  and class_type_declaration = class_type class_infos

  (* Value expressions for the class language *)

  and class_expr (*IF_CURRENT = Parsetree.class_expr *) =
      {
       pcl_desc: class_expr_desc;
       pcl_loc: Location.t;
       pcl_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and class_expr_desc (*IF_CURRENT = Parsetree.class_expr_desc *) =
    | Pcl_constr of Longident.t loc * core_type list
          (* c
             ['a1, ..., 'an] c *)
    | Pcl_structure of class_structure
          (* object ... end *)
    | Pcl_fun of label * expression option * pattern * class_expr
          (* fun P -> CE                          (lab = "", None)
             fun ~l:P -> CE                       (lab = "l", None)
             fun ?l:P -> CE                       (lab = "?l", None)
             fun ?l:(P = E0) -> CE                (lab = "?l", Some E0)
           *)
    | Pcl_apply of class_expr * (label * expression) list
          (* CE ~l1:E1 ... ~ln:En
             li can be empty (non labeled argument) or start with '?'
             (optional argument).

             Invariant: n > 0
           *)
    | Pcl_let of rec_flag * value_binding list * class_expr
          (* let P1 = E1 and ... and Pn = EN in CE      (flag = Nonrecursive)
             let rec P1 = E1 and ... and Pn = EN in CE  (flag = Recursive)
           *)
    | Pcl_constraint of class_expr * class_type
          (* (CE : CT) *)
    | Pcl_extension of extension
          (* [%id] *)

  and class_structure (*IF_CURRENT = Parsetree.class_structure *) =
      {
       pcstr_self: pattern;
       pcstr_fields: class_field list;
      }
  (* object(selfpat) ... end
     object ... end           (self = Ppat_any)
   *)

  and class_field (*IF_CURRENT = Parsetree.class_field *) =
      {
       pcf_desc: class_field_desc;
       pcf_loc: Location.t;
       pcf_attributes: attributes; (* ... [@@id1] [@@id2] *)
      }

  and class_field_desc (*IF_CURRENT = Parsetree.class_field_desc *) =
    | Pcf_inherit of override_flag * class_expr * string option
          (* inherit CE
             inherit CE as x
             inherit! CE
             inherit! CE as x
           *)
    | Pcf_val of (string loc * mutable_flag * class_field_kind)
          (* val x = E
             val virtual x: T
           *)
    | Pcf_method of (string loc * private_flag * class_field_kind)
          (* method x = E            (E can be a Pexp_poly)
             method virtual x: T     (T can be a Ptyp_poly)
           *)
    | Pcf_constraint of (core_type * core_type)
          (* constraint T1 = T2 *)
    | Pcf_initializer of expression
          (* initializer E *)
    | Pcf_attribute of attribute
          (* [@@@id] *)
    | Pcf_extension of extension
          (* [%%id] *)

  and class_field_kind (*IF_CURRENT = Parsetree.class_field_kind *) =
    | Cfk_virtual of core_type
    | Cfk_concrete of override_flag * expression

  and class_declaration = class_expr class_infos

  (** {2 Module language} *)

  (* Type expressions for the module language *)

  and module_type (*IF_CURRENT = Parsetree.module_type *) =
      {
       pmty_desc: module_type_desc;
       pmty_loc: Location.t;
       pmty_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and module_type_desc (*IF_CURRENT = Parsetree.module_type_desc *) =
    | Pmty_ident of Longident.t loc
          (* S *)
    | Pmty_signature of signature
          (* sig ... end *)
    | Pmty_functor of string loc * module_type option * module_type
          (* functor(X : MT1) -> MT2 *)
    | Pmty_with of module_type * with_constraint list
          (* MT with ... *)
    | Pmty_typeof of module_expr
          (* module type of ME *)
    | Pmty_extension of extension
          (* [%id] *)
    | Pmty_alias of Longident.t loc
          (* (module M) *)

  and signature = signature_item list

  and signature_item (*IF_CURRENT = Parsetree.signature_item *) =
      {
       psig_desc: signature_item_desc;
       psig_loc: Location.t;
      }

  and signature_item_desc (*IF_CURRENT = Parsetree.signature_item_desc *) =
    | Psig_value of value_description
          (*
            val x: T
            external x: T = "s1" ... "sn"
           *)
    | Psig_type of type_declaration list
          (* type t1 = ... and ... and tn = ... *)
    | Psig_typext of type_extension
          (* type t1 += ... *)
    | Psig_exception of extension_constructor
          (* exception C of T *)
    | Psig_module of module_declaration
          (* module X : MT *)
    | Psig_recmodule of module_declaration list
          (* module rec X1 : MT1 and ... and Xn : MTn *)
    | Psig_modtype of module_type_declaration
          (* module type S = MT
             module type S *)
    | Psig_open of open_description
          (* open X *)
    | Psig_include of include_description
          (* include MT *)
    | Psig_class of class_description list
          (* class c1 : ... and ... and cn : ... *)
    | Psig_class_type of class_type_declaration list
          (* class type ct1 = ... and ... and ctn = ... *)
    | Psig_attribute of attribute
          (* [@@@id] *)
    | Psig_extension of extension * attributes
          (* [%%id] *)

  and module_declaration (*IF_CURRENT = Parsetree.module_declaration *) =
      {
       pmd_name: string loc;
       pmd_type: module_type;
       pmd_attributes: attributes; (* ... [@@id1] [@@id2] *)
       pmd_loc: Location.t;
      }
  (* S : MT *)

  and module_type_declaration (*IF_CURRENT = Parsetree.module_type_declaration *) =
      {
       pmtd_name: string loc;
       pmtd_type: module_type option;
       pmtd_attributes: attributes; (* ... [@@id1] [@@id2] *)
       pmtd_loc: Location.t;
      }
  (* S = MT
     S       (abstract module type declaration, pmtd_type = None)
  *)

  and open_description (*IF_CURRENT = Parsetree.open_description *) =
      {
       popen_lid: Longident.t loc;
       popen_override: override_flag;
       popen_loc: Location.t;
       popen_attributes: attributes;
      }
  (* open! X - popen_override = Override (silences the 'used identifier
                                shadowing' warning)
     open  X - popen_override = Fresh
   *)

  and 'a include_infos (*IF_CURRENT = 'a Parsetree.include_infos *) =
      {
       pincl_mod: 'a;
       pincl_loc: Location.t;
       pincl_attributes: attributes;
      }

  and include_description = module_type include_infos
  (* include MT *)

  and include_declaration = module_expr include_infos
  (* include ME *)

  and with_constraint (*IF_CURRENT = Parsetree.with_constraint *) =
    | Pwith_type of Longident.t loc * type_declaration
          (* with type X.t = ...

             Note: the last component of the longident must match
             the name of the type_declaration. *)
    | Pwith_module of Longident.t loc * Longident.t loc
          (* with module X.Y = Z *)
    | Pwith_typesubst of type_declaration
          (* with type t := ... *)
    | Pwith_modsubst of string loc * Longident.t loc
          (* with module X := Z *)

  (* Value expressions for the module language *)

  and module_expr (*IF_CURRENT = Parsetree.module_expr *) =
      {
       pmod_desc: module_expr_desc;
       pmod_loc: Location.t;
       pmod_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and module_expr_desc (*IF_CURRENT = Parsetree.module_expr_desc *) =
    | Pmod_ident of Longident.t loc
          (* X *)
    | Pmod_structure of structure
          (* struct ... end *)
    | Pmod_functor of string loc * module_type option * module_expr
          (* functor(X : MT1) -> ME *)
    | Pmod_apply of module_expr * module_expr
          (* ME1(ME2) *)
    | Pmod_constraint of module_expr * module_type
          (* (ME : MT) *)
    | Pmod_unpack of expression
          (* (val E) *)
    | Pmod_extension of extension
          (* [%id] *)

  and structure = structure_item list

  and structure_item (*IF_CURRENT = Parsetree.structure_item *) =
      {
       pstr_desc: structure_item_desc;
       pstr_loc: Location.t;
      }

  and structure_item_desc (*IF_CURRENT = Parsetree.structure_item_desc *) =
    | Pstr_eval of expression * attributes
          (* E *)
    | Pstr_value of rec_flag * value_binding list
          (* let P1 = E1 and ... and Pn = EN       (flag = Nonrecursive)
             let rec P1 = E1 and ... and Pn = EN   (flag = Recursive)
           *)
    | Pstr_primitive of value_description
          (* external x: T = "s1" ... "sn" *)
    | Pstr_type of type_declaration list
          (* type t1 = ... and ... and tn = ... *)
    | Pstr_typext of type_extension
          (* type t1 += ... *)
    | Pstr_exception of extension_constructor
          (* exception C of T
             exception C = M.X *)
    | Pstr_module of module_binding
          (* module X = ME *)
    | Pstr_recmodule of module_binding list
          (* module rec X1 = ME1 and ... and Xn = MEn *)
    | Pstr_modtype of module_type_declaration
          (* module type S = MT *)
    | Pstr_open of open_description
          (* open X *)
    | Pstr_class of class_declaration list
          (* class c1 = ... and ... and cn = ... *)
    | Pstr_class_type of class_type_declaration list
          (* class type ct1 = ... and ... and ctn = ... *)
    | Pstr_include of include_declaration
          (* include ME *)
    | Pstr_attribute of attribute
          (* [@@@id] *)
    | Pstr_extension of extension * attributes
          (* [%%id] *)

  and value_binding (*IF_CURRENT = Parsetree.value_binding *) =
    {
      pvb_pat: pattern;
      pvb_expr: expression;
      pvb_attributes: attributes;
      pvb_loc: Location.t;
    }

  and module_binding (*IF_CURRENT = Parsetree.module_binding *) =
      {
       pmb_name: string loc;
       pmb_expr: module_expr;
       pmb_attributes: attributes;
       pmb_loc: Location.t;
      }
  (* X = ME *)

  (** {2 Toplevel} *)

  (* Toplevel phrases *)

  type toplevel_phrase (*IF_CURRENT = Parsetree.toplevel_phrase *) =
    | Ptop_def of structure
    | Ptop_dir of string * directive_argument
       (* #use, #load ... *)

  and directive_argument (*IF_CURRENT = Parsetree.directive_argument *) =
    | Pdir_none
    | Pdir_string of string
    | Pdir_int of int
    | Pdir_ident of Longident.t
    | Pdir_bool of bool
end

module Docstrings : sig
  (** {3 Docstrings} *)

  (** Documentation comments *)
  type docstring

  (** Create a docstring *)
  val docstring : string -> Location.t -> docstring

  (** Get the text of a docstring *)
  val docstring_body : docstring -> string

  (** Get the location of a docstring *)
  val docstring_loc : docstring -> Location.t

  (** {3 Items}

      The {!docs} type represents documentation attached to an item. *)

  type docs =
    { docs_pre: docstring option;
      docs_post: docstring option; }

  val empty_docs : docs

  val docs_attr : docstring -> Parsetree.attribute

  (** Convert item documentation to attributes and add them to an
      attribute list *)
  val add_docs_attrs : docs -> Parsetree.attributes -> Parsetree.attributes

  (** {3 Fields and constructors}

      The {!info} type represents documentation attached to a field or
      constructor. *)

  type info = docstring option

  val empty_info : info

  val info_attr : docstring -> Parsetree.attribute

  (** Convert field info to attributes and add them to an
      attribute list *)
  val add_info_attrs : info -> Parsetree.attributes -> Parsetree.attributes

  (** {3 Unattached comments}

      The {!text} type represents documentation which is not attached to
      anything. *)

  type text = docstring list

  val empty_text : text

  val text_attr : docstring -> Parsetree.attribute

  (** Convert text to attributes and add them to an attribute list *)
  val add_text_attrs : text -> Parsetree.attributes -> Parsetree.attributes

end = struct
  open Location

  (* Docstrings *)

  type docstring =
    { ds_body: string;
      ds_loc: Location.t; }

  (* Docstring constructors and destructors *)

  let docstring body loc =
    let ds =
      { ds_body = body;
        ds_loc = loc; }
    in
    ds

  let docstring_body ds = ds.ds_body

  let docstring_loc ds = ds.ds_loc

  (* Docstrings attached to items *)

  type docs =
    { docs_pre: docstring option;
      docs_post: docstring option; }

  let empty_docs = { docs_pre = None; docs_post = None }

  let doc_loc = {txt = "ocaml.doc"; loc = Location.none}

  let docs_attr ds =
    let open Asttypes in
    let open Parsetree in
    let exp =
      { pexp_desc = Pexp_constant (Const_string(ds.ds_body, None));
        pexp_loc = ds.ds_loc;
        pexp_attributes = []; }
    in
    let item =
      { pstr_desc = Pstr_eval (exp, []); pstr_loc = exp.pexp_loc }
    in
      (doc_loc, PStr [item])

  let add_docs_attrs docs attrs =
    let attrs =
      match docs.docs_pre with
      | None | Some { ds_body=""; _ } -> attrs
      | Some ds -> docs_attr ds :: attrs
    in
    let attrs =
      match docs.docs_post with
      | None | Some { ds_body=""; _ } -> attrs
      | Some ds -> attrs @ [docs_attr ds]
    in
    attrs

  (* Docstrings attached to constructors or fields *)

  type info = docstring option

  let empty_info = None

  let info_attr = docs_attr

  let add_info_attrs info attrs =
    match info with
    | None | Some {ds_body=""; _} -> attrs
    | Some ds -> attrs @ [info_attr ds]

  (* Docstrings not attached to a specific item *)

  type text = docstring list

  let empty_text = []

  let text_loc = {txt = "ocaml.text"; loc = Location.none}

  let text_attr ds =
    let open Asttypes in
    let open Parsetree in
    let exp =
      { pexp_desc = Pexp_constant (Const_string(ds.ds_body, None));
        pexp_loc = ds.ds_loc;
        pexp_attributes = []; }
    in
    let item =
      { pstr_desc = Pstr_eval (exp, []); pstr_loc = exp.pexp_loc }
    in
      (text_loc, PStr [item])

  let add_text_attrs dsl attrs =
    let fdsl = List.filter (function {ds_body=""; _} -> false| _ ->true) dsl in
    (List.map text_attr fdsl) @ attrs

end

module Ast_helper : sig
  (** Helpers to produce Parsetree fragments *)

  open Parsetree
  open Asttypes
  open Docstrings

  type lid = Longident.t loc
  type str = string loc
  type loc = Location.t
  type attrs = attribute list

  (** {2 Default locations} *)

  val default_loc: loc ref
      (** Default value for all optional location arguments. *)

  val with_default_loc: loc -> (unit -> 'a) -> 'a
      (** Set the [default_loc] within the scope of the execution
          of the provided function. *)

  (** {2 Core language} *)

  (** Type expressions *)
  module Typ :
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> core_type_desc -> core_type
      val attr: core_type -> attribute -> core_type

      val any: ?loc:loc -> ?attrs:attrs -> unit -> core_type
      val var: ?loc:loc -> ?attrs:attrs -> string -> core_type
      val arrow: ?loc:loc -> ?attrs:attrs -> label -> core_type -> core_type
                 -> core_type
      val tuple: ?loc:loc -> ?attrs:attrs -> core_type list -> core_type
      val constr: ?loc:loc -> ?attrs:attrs -> lid -> core_type list -> core_type
      val object_: ?loc:loc -> ?attrs:attrs ->
                    (string * attributes * core_type) list -> closed_flag ->
                    core_type
      val class_: ?loc:loc -> ?attrs:attrs -> lid -> core_type list -> core_type
      val alias: ?loc:loc -> ?attrs:attrs -> core_type -> string -> core_type
      val variant: ?loc:loc -> ?attrs:attrs -> row_field list -> closed_flag
                   -> label list option -> core_type
      val poly: ?loc:loc -> ?attrs:attrs -> string list -> core_type -> core_type
      val package: ?loc:loc -> ?attrs:attrs -> lid -> (lid * core_type) list
                   -> core_type
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> core_type

      val force_poly: core_type -> core_type
    end

  (** Patterns *)
  module Pat:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> pattern_desc -> pattern
      val attr:pattern -> attribute -> pattern

      val any: ?loc:loc -> ?attrs:attrs -> unit -> pattern
      val var: ?loc:loc -> ?attrs:attrs -> str -> pattern
      val alias: ?loc:loc -> ?attrs:attrs -> pattern -> str -> pattern
      val constant: ?loc:loc -> ?attrs:attrs -> constant -> pattern
      val interval: ?loc:loc -> ?attrs:attrs -> constant -> constant -> pattern
      val tuple: ?loc:loc -> ?attrs:attrs -> pattern list -> pattern
      val construct: ?loc:loc -> ?attrs:attrs -> lid -> pattern option -> pattern
      val variant: ?loc:loc -> ?attrs:attrs -> label -> pattern option -> pattern
      val record: ?loc:loc -> ?attrs:attrs -> (lid * pattern) list -> closed_flag
                  -> pattern
      val array: ?loc:loc -> ?attrs:attrs -> pattern list -> pattern
      val or_: ?loc:loc -> ?attrs:attrs -> pattern -> pattern -> pattern
      val constraint_: ?loc:loc -> ?attrs:attrs -> pattern -> core_type -> pattern
      val type_: ?loc:loc -> ?attrs:attrs -> lid -> pattern
      val lazy_: ?loc:loc -> ?attrs:attrs -> pattern -> pattern
      val unpack: ?loc:loc -> ?attrs:attrs -> str -> pattern
      val exception_: ?loc:loc -> ?attrs:attrs -> pattern -> pattern
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> pattern
    end

  (** Expressions *)
  module Exp:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> expression_desc -> expression
      val attr: expression -> attribute -> expression

      val ident: ?loc:loc -> ?attrs:attrs -> lid -> expression
      val constant: ?loc:loc -> ?attrs:attrs -> constant -> expression
      val let_: ?loc:loc -> ?attrs:attrs -> rec_flag -> value_binding list
                -> expression -> expression
      val fun_: ?loc:loc -> ?attrs:attrs -> label -> expression option -> pattern
                -> expression -> expression
      val function_: ?loc:loc -> ?attrs:attrs -> case list -> expression
      val apply: ?loc:loc -> ?attrs:attrs -> expression
                 -> (label * expression) list -> expression
      val match_: ?loc:loc -> ?attrs:attrs -> expression -> case list
                  -> expression
      val try_: ?loc:loc -> ?attrs:attrs -> expression -> case list -> expression
      val tuple: ?loc:loc -> ?attrs:attrs -> expression list -> expression
      val construct: ?loc:loc -> ?attrs:attrs -> lid -> expression option
                     -> expression
      val variant: ?loc:loc -> ?attrs:attrs -> label -> expression option
                   -> expression
      val record: ?loc:loc -> ?attrs:attrs -> (lid * expression) list
                  -> expression option -> expression
      val field: ?loc:loc -> ?attrs:attrs -> expression -> lid -> expression
      val setfield: ?loc:loc -> ?attrs:attrs -> expression -> lid -> expression
                    -> expression
      val array: ?loc:loc -> ?attrs:attrs -> expression list -> expression
      val ifthenelse: ?loc:loc -> ?attrs:attrs -> expression -> expression
                      -> expression option -> expression
      val sequence: ?loc:loc -> ?attrs:attrs -> expression -> expression
                    -> expression
      val while_: ?loc:loc -> ?attrs:attrs -> expression -> expression
                  -> expression
      val for_: ?loc:loc -> ?attrs:attrs -> pattern -> expression -> expression
                -> direction_flag -> expression -> expression
      val coerce: ?loc:loc -> ?attrs:attrs -> expression -> core_type option
                  -> core_type -> expression
      val constraint_: ?loc:loc -> ?attrs:attrs -> expression -> core_type
                       -> expression
      val send: ?loc:loc -> ?attrs:attrs -> expression -> string -> expression
      val new_: ?loc:loc -> ?attrs:attrs -> lid -> expression
      val setinstvar: ?loc:loc -> ?attrs:attrs -> str -> expression -> expression
      val override: ?loc:loc -> ?attrs:attrs -> (str * expression) list
                    -> expression
      val letmodule: ?loc:loc -> ?attrs:attrs -> str -> module_expr -> expression
                     -> expression
      val assert_: ?loc:loc -> ?attrs:attrs -> expression -> expression
      val lazy_: ?loc:loc -> ?attrs:attrs -> expression -> expression
      val poly: ?loc:loc -> ?attrs:attrs -> expression -> core_type option -> expression
      val object_: ?loc:loc -> ?attrs:attrs -> class_structure -> expression
      val newtype: ?loc:loc -> ?attrs:attrs -> string -> expression -> expression
      val pack: ?loc:loc -> ?attrs:attrs -> module_expr -> expression
      val open_: ?loc:loc -> ?attrs:attrs -> override_flag -> lid -> expression -> expression
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> expression

      val case: pattern -> ?guard:expression -> expression -> case
    end

  (** Value declarations *)
  module Val:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs ->
        ?prim:string list -> str -> core_type -> value_description
    end

  (** Type declarations *)
  module Type:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text ->
        ?params:(core_type * variance) list -> ?cstrs:(core_type * core_type * loc) list ->
        ?kind:type_kind -> ?priv:private_flag -> ?manifest:core_type -> str ->
        type_declaration

      val constructor: ?loc:loc -> ?attrs:attrs -> ?info:info ->
        ?args:core_type list -> ?res:core_type -> str -> constructor_declaration
      val field: ?loc:loc -> ?attrs:attrs -> ?info:info ->
        ?mut:mutable_flag -> str -> core_type -> label_declaration
    end

  (** Type extensions *)
  module Te:
    sig
      val mk: ?attrs:attrs -> ?docs:docs ->
        ?params:(core_type * variance) list -> ?priv:private_flag ->
        lid -> extension_constructor list -> type_extension

      val constructor: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?info:info ->
        str -> extension_constructor_kind -> extension_constructor

      val decl: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?info:info ->
        ?args:core_type list -> ?res:core_type -> str -> extension_constructor
      val rebind: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?info:info ->
        str -> lid -> extension_constructor
    end

  (** {2 Module language} *)

  (** Module type expressions *)
  module Mty:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> module_type_desc -> module_type
      val attr: module_type -> attribute -> module_type

      val ident: ?loc:loc -> ?attrs:attrs -> lid -> module_type
      val alias: ?loc:loc -> ?attrs:attrs -> lid -> module_type
      val signature: ?loc:loc -> ?attrs:attrs -> signature -> module_type
      val functor_: ?loc:loc -> ?attrs:attrs ->
        str -> module_type option -> module_type -> module_type
      val with_: ?loc:loc -> ?attrs:attrs -> module_type -> with_constraint list -> module_type
      val typeof_: ?loc:loc -> ?attrs:attrs -> module_expr -> module_type
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> module_type
    end

  (** Module expressions *)
  module Mod:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> module_expr_desc -> module_expr
      val attr: module_expr -> attribute -> module_expr

      val ident: ?loc:loc -> ?attrs:attrs -> lid -> module_expr
      val structure: ?loc:loc -> ?attrs:attrs -> structure -> module_expr
      val functor_: ?loc:loc -> ?attrs:attrs ->
        str -> module_type option -> module_expr -> module_expr
      val apply: ?loc:loc -> ?attrs:attrs -> module_expr -> module_expr -> module_expr
      val constraint_: ?loc:loc -> ?attrs:attrs -> module_expr -> module_type -> module_expr
      val unpack: ?loc:loc -> ?attrs:attrs -> expression -> module_expr
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> module_expr
    end

  (** Signature items *)
  module Sig:
    sig
      val mk: ?loc:loc -> signature_item_desc -> signature_item

      val value: ?loc:loc -> value_description -> signature_item
      val type_: ?loc:loc -> type_declaration list -> signature_item
      val type_extension: ?loc:loc -> type_extension -> signature_item
      val exception_: ?loc:loc -> extension_constructor -> signature_item
      val module_: ?loc:loc -> module_declaration -> signature_item
      val rec_module: ?loc:loc -> module_declaration list -> signature_item
      val modtype: ?loc:loc -> module_type_declaration -> signature_item
      val open_: ?loc:loc -> open_description -> signature_item
      val include_: ?loc:loc -> include_description -> signature_item
      val class_: ?loc:loc -> class_description list -> signature_item
      val class_type: ?loc:loc -> class_type_declaration list -> signature_item
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> signature_item
      val attribute: ?loc:loc -> attribute -> signature_item
      val text: text -> signature_item list
    end

  (** Structure items *)
  module Str:
    sig
      val mk: ?loc:loc -> structure_item_desc -> structure_item

      val eval: ?loc:loc -> ?attrs:attributes -> expression -> structure_item
      val value: ?loc:loc -> rec_flag -> value_binding list -> structure_item
      val primitive: ?loc:loc -> value_description -> structure_item
      val type_: ?loc:loc -> type_declaration list -> structure_item
      val type_extension: ?loc:loc -> type_extension -> structure_item
      val exception_: ?loc:loc -> extension_constructor -> structure_item
      val module_: ?loc:loc -> module_binding -> structure_item
      val rec_module: ?loc:loc -> module_binding list -> structure_item
      val modtype: ?loc:loc -> module_type_declaration -> structure_item
      val open_: ?loc:loc -> open_description -> structure_item
      val class_: ?loc:loc -> class_declaration list -> structure_item
      val class_type: ?loc:loc -> class_type_declaration list -> structure_item
      val include_: ?loc:loc -> include_declaration -> structure_item
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> structure_item
      val attribute: ?loc:loc -> attribute -> structure_item
      val text: text -> structure_item list
    end

  (** Module declarations *)
  module Md:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text ->
        str -> module_type -> module_declaration
    end

  (** Module type declarations *)
  module Mtd:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text ->
        ?typ:module_type -> str -> module_type_declaration
    end

  (** Module bindings *)
  module Mb:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text ->
        str -> module_expr -> module_binding
    end

  (* Opens *)
  module Opn:
    sig
      val mk: ?loc: loc -> ?attrs:attrs -> ?docs:docs ->
        ?override:override_flag -> lid -> open_description
    end

  (* Includes *)
  module Incl:
    sig
      val mk: ?loc: loc -> ?attrs:attrs -> ?docs:docs -> 'a -> 'a include_infos
    end

  (** Value bindings *)

  module Vb:
    sig
      val mk: ?loc: loc -> ?attrs:attrs -> ?docs:docs -> ?text:text ->
        pattern -> expression -> value_binding
    end


  (** {2 Class language} *)

  (** Class type expressions *)
  module Cty:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> class_type_desc -> class_type
      val attr: class_type -> attribute -> class_type

      val constr: ?loc:loc -> ?attrs:attrs -> lid -> core_type list -> class_type
      val signature: ?loc:loc -> ?attrs:attrs -> class_signature -> class_type
      val arrow: ?loc:loc -> ?attrs:attrs -> label -> core_type -> class_type -> class_type
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> class_type
    end

  (** Class type fields *)
  module Ctf:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs ->
        class_type_field_desc -> class_type_field
      val attr: class_type_field -> attribute -> class_type_field

      val inherit_: ?loc:loc -> ?attrs:attrs -> class_type -> class_type_field
      val val_: ?loc:loc -> ?attrs:attrs -> string -> mutable_flag -> virtual_flag -> core_type -> class_type_field
      val method_: ?loc:loc -> ?attrs:attrs -> string -> private_flag -> virtual_flag -> core_type -> class_type_field
      val constraint_: ?loc:loc -> ?attrs:attrs -> core_type -> core_type -> class_type_field
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> class_type_field
      val attribute: ?loc:loc -> attribute -> class_type_field
      val text: text -> class_type_field list
    end

  (** Class expressions *)
  module Cl:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> class_expr_desc -> class_expr
      val attr: class_expr -> attribute -> class_expr

      val constr: ?loc:loc -> ?attrs:attrs -> lid -> core_type list -> class_expr
      val structure: ?loc:loc -> ?attrs:attrs -> class_structure -> class_expr
      val fun_: ?loc:loc -> ?attrs:attrs -> label -> expression option -> pattern -> class_expr -> class_expr
      val apply: ?loc:loc -> ?attrs:attrs -> class_expr -> (label * expression) list -> class_expr
      val let_: ?loc:loc -> ?attrs:attrs -> rec_flag -> value_binding list -> class_expr -> class_expr
      val constraint_: ?loc:loc -> ?attrs:attrs -> class_expr -> class_type -> class_expr
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> class_expr
    end

  (** Class fields *)
  module Cf:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> class_field_desc -> class_field
      val attr: class_field -> attribute -> class_field

      val inherit_: ?loc:loc -> ?attrs:attrs -> override_flag -> class_expr -> string option -> class_field
      val val_: ?loc:loc -> ?attrs:attrs -> str -> mutable_flag -> class_field_kind -> class_field
      val method_: ?loc:loc -> ?attrs:attrs -> str -> private_flag -> class_field_kind -> class_field
      val constraint_: ?loc:loc -> ?attrs:attrs -> core_type -> core_type -> class_field
      val initializer_: ?loc:loc -> ?attrs:attrs -> expression -> class_field
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> class_field
      val attribute: ?loc:loc -> attribute -> class_field
      val text: text -> class_field list

      val virtual_: core_type -> class_field_kind
      val concrete: override_flag -> expression -> class_field_kind

    end

  (** Classes *)
  module Ci:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text ->
        ?virt:virtual_flag -> ?params:(core_type * variance) list ->
        str -> 'a -> 'a class_infos
    end

  (** Class signatures *)
  module Csig:
    sig
      val mk: core_type -> class_type_field list -> class_signature
    end

  (** Class structures *)
  module Cstr:
    sig
      val mk: pattern -> class_field list -> class_structure
    end

end = struct
  (** Helpers to produce Parsetree fragments *)

  open Asttypes
  open Parsetree
  open Docstrings

  type lid = Longident.t loc
  type str = string loc
  type loc = Location.t
  type attrs = attribute list

  let default_loc = ref Location.none

  let with_default_loc l f =
    let old = !default_loc in
    default_loc := l;
    try let r = f () in default_loc := old; r
    with exn -> default_loc := old; raise exn

  module Typ = struct
    let mk ?(loc = !default_loc) ?(attrs = []) d =
      {ptyp_desc = d; ptyp_loc = loc; ptyp_attributes = attrs}
    let attr d a = {d with ptyp_attributes = d.ptyp_attributes @ [a]}

    let any ?loc ?attrs () = mk ?loc ?attrs Ptyp_any
    let var ?loc ?attrs a = mk ?loc ?attrs (Ptyp_var a)
    let arrow ?loc ?attrs a b c = mk ?loc ?attrs (Ptyp_arrow (a, b, c))
    let tuple ?loc ?attrs a = mk ?loc ?attrs (Ptyp_tuple a)
    let constr ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_constr (a, b))
    let object_ ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_object (a, b))
    let class_ ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_class (a, b))
    let alias ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_alias (a, b))
    let variant ?loc ?attrs a b c = mk ?loc ?attrs (Ptyp_variant (a, b, c))
    let poly ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_poly (a, b))
    let package ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_package (a, b))
    let extension ?loc ?attrs a = mk ?loc ?attrs (Ptyp_extension a)

    let force_poly t =
      match t.ptyp_desc with
      | Ptyp_poly _ -> t
      | _ -> poly ~loc:t.ptyp_loc [] t (* -> ghost? *)
  end

  module Pat = struct
    let mk ?(loc = !default_loc) ?(attrs = []) d =
      {ppat_desc = d; ppat_loc = loc; ppat_attributes = attrs}
    let attr d a = {d with ppat_attributes = d.ppat_attributes @ [a]}

    let any ?loc ?attrs () = mk ?loc ?attrs Ppat_any
    let var ?loc ?attrs a = mk ?loc ?attrs (Ppat_var a)
    let alias ?loc ?attrs a b = mk ?loc ?attrs (Ppat_alias (a, b))
    let constant ?loc ?attrs a = mk ?loc ?attrs (Ppat_constant a)
    let interval ?loc ?attrs a b = mk ?loc ?attrs (Ppat_interval (a, b))
    let tuple ?loc ?attrs a = mk ?loc ?attrs (Ppat_tuple a)
    let construct ?loc ?attrs a b = mk ?loc ?attrs (Ppat_construct (a, b))
    let variant ?loc ?attrs a b = mk ?loc ?attrs (Ppat_variant (a, b))
    let record ?loc ?attrs a b = mk ?loc ?attrs (Ppat_record (a, b))
    let array ?loc ?attrs a = mk ?loc ?attrs (Ppat_array a)
    let or_ ?loc ?attrs a b = mk ?loc ?attrs (Ppat_or (a, b))
    let constraint_ ?loc ?attrs a b = mk ?loc ?attrs (Ppat_constraint (a, b))
    let type_ ?loc ?attrs a = mk ?loc ?attrs (Ppat_type a)
    let lazy_ ?loc ?attrs a = mk ?loc ?attrs (Ppat_lazy a)
    let unpack ?loc ?attrs a = mk ?loc ?attrs (Ppat_unpack a)
    let exception_ ?loc ?attrs a = mk ?loc ?attrs (Ppat_exception a)
    let extension ?loc ?attrs a = mk ?loc ?attrs (Ppat_extension a)
  end

  module Exp = struct
    let mk ?(loc = !default_loc) ?(attrs = []) d =
      {pexp_desc = d; pexp_loc = loc; pexp_attributes = attrs}
    let attr d a = {d with pexp_attributes = d.pexp_attributes @ [a]}

    let ident ?loc ?attrs a = mk ?loc ?attrs (Pexp_ident a)
    let constant ?loc ?attrs a = mk ?loc ?attrs (Pexp_constant a)
    let let_ ?loc ?attrs a b c = mk ?loc ?attrs (Pexp_let (a, b, c))
    let fun_ ?loc ?attrs a b c d = mk ?loc ?attrs (Pexp_fun (a, b, c, d))
    let function_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_function a)
    let apply ?loc ?attrs a b = mk ?loc ?attrs (Pexp_apply (a, b))
    let match_ ?loc ?attrs a b = mk ?loc ?attrs (Pexp_match (a, b))
    let try_ ?loc ?attrs a b = mk ?loc ?attrs (Pexp_try (a, b))
    let tuple ?loc ?attrs a = mk ?loc ?attrs (Pexp_tuple a)
    let construct ?loc ?attrs a b = mk ?loc ?attrs (Pexp_construct (a, b))
    let variant ?loc ?attrs a b = mk ?loc ?attrs (Pexp_variant (a, b))
    let record ?loc ?attrs a b = mk ?loc ?attrs (Pexp_record (a, b))
    let field ?loc ?attrs a b = mk ?loc ?attrs (Pexp_field (a, b))
    let setfield ?loc ?attrs a b c = mk ?loc ?attrs (Pexp_setfield (a, b, c))
    let array ?loc ?attrs a = mk ?loc ?attrs (Pexp_array a)
    let ifthenelse ?loc ?attrs a b c = mk ?loc ?attrs (Pexp_ifthenelse (a, b, c))
    let sequence ?loc ?attrs a b = mk ?loc ?attrs (Pexp_sequence (a, b))
    let while_ ?loc ?attrs a b = mk ?loc ?attrs (Pexp_while (a, b))
    let for_ ?loc ?attrs a b c d e = mk ?loc ?attrs (Pexp_for (a, b, c, d, e))
    let constraint_ ?loc ?attrs a b = mk ?loc ?attrs (Pexp_constraint (a, b))
    let coerce ?loc ?attrs a b c = mk ?loc ?attrs (Pexp_coerce (a, b, c))
    let send ?loc ?attrs a b = mk ?loc ?attrs (Pexp_send (a, b))
    let new_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_new a)
    let setinstvar ?loc ?attrs a b = mk ?loc ?attrs (Pexp_setinstvar (a, b))
    let override ?loc ?attrs a = mk ?loc ?attrs (Pexp_override a)
    let letmodule ?loc ?attrs a b c= mk ?loc ?attrs (Pexp_letmodule (a, b, c))
    let assert_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_assert a)
    let lazy_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_lazy a)
    let poly ?loc ?attrs a b = mk ?loc ?attrs (Pexp_poly (a, b))
    let object_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_object a)
    let newtype ?loc ?attrs a b = mk ?loc ?attrs (Pexp_newtype (a, b))
    let pack ?loc ?attrs a = mk ?loc ?attrs (Pexp_pack a)
    let open_ ?loc ?attrs a b c = mk ?loc ?attrs (Pexp_open (a, b, c))
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pexp_extension a)

    let case lhs ?guard rhs =
      {
       pc_lhs = lhs;
       pc_guard = guard;
       pc_rhs = rhs;
      }
  end

  module Mty = struct
    let mk ?(loc = !default_loc) ?(attrs = []) d =
      {pmty_desc = d; pmty_loc = loc; pmty_attributes = attrs}
    let attr d a = {d with pmty_attributes = d.pmty_attributes @ [a]}

    let ident ?loc ?attrs a = mk ?loc ?attrs (Pmty_ident a)
    let alias ?loc ?attrs a = mk ?loc ?attrs (Pmty_alias a)
    let signature ?loc ?attrs a = mk ?loc ?attrs (Pmty_signature a)
    let functor_ ?loc ?attrs a b c = mk ?loc ?attrs (Pmty_functor (a, b, c))
    let with_ ?loc ?attrs a b = mk ?loc ?attrs (Pmty_with (a, b))
    let typeof_ ?loc ?attrs a = mk ?loc ?attrs (Pmty_typeof a)
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pmty_extension a)
  end

  module Mod = struct
  let mk ?(loc = !default_loc) ?(attrs = []) d =
    {pmod_desc = d; pmod_loc = loc; pmod_attributes = attrs}
    let attr d a = {d with pmod_attributes = d.pmod_attributes @ [a]}

    let ident ?loc ?attrs x = mk ?loc ?attrs (Pmod_ident x)
    let structure ?loc ?attrs x = mk ?loc ?attrs (Pmod_structure x)
    let functor_ ?loc ?attrs arg arg_ty body =
      mk ?loc ?attrs (Pmod_functor (arg, arg_ty, body))
    let apply ?loc ?attrs m1 m2 = mk ?loc ?attrs (Pmod_apply (m1, m2))
    let constraint_ ?loc ?attrs m mty = mk ?loc ?attrs (Pmod_constraint (m, mty))
    let unpack ?loc ?attrs e = mk ?loc ?attrs (Pmod_unpack e)
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pmod_extension a)
  end

  module Sig = struct
    let mk ?(loc = !default_loc) d = {psig_desc = d; psig_loc = loc}

    let value ?loc a = mk ?loc (Psig_value a)
    let type_ ?loc a = mk ?loc (Psig_type a)
    let type_extension ?loc a = mk ?loc (Psig_typext a)
    let exception_ ?loc a = mk ?loc (Psig_exception a)
    let module_ ?loc a = mk ?loc (Psig_module a)
    let rec_module ?loc a = mk ?loc (Psig_recmodule a)
    let modtype ?loc a = mk ?loc (Psig_modtype a)
    let open_ ?loc a = mk ?loc (Psig_open a)
    let include_ ?loc a = mk ?loc (Psig_include a)
    let class_ ?loc a = mk ?loc (Psig_class a)
    let class_type ?loc a = mk ?loc (Psig_class_type a)
    let extension ?loc ?(attrs = []) a = mk ?loc (Psig_extension (a, attrs))
    let attribute ?loc a = mk ?loc (Psig_attribute a)
    let text txt =
      List.map
        (fun ds -> attribute ~loc:(docstring_loc ds) (text_attr ds))
        txt
  end

  module Str = struct
    let mk ?(loc = !default_loc) d = {pstr_desc = d; pstr_loc = loc}

    let eval ?loc ?(attrs = []) a = mk ?loc (Pstr_eval (a, attrs))
    let value ?loc a b = mk ?loc (Pstr_value (a, b))
    let primitive ?loc a = mk ?loc (Pstr_primitive a)
    let type_ ?loc a = mk ?loc (Pstr_type a)
    let type_extension ?loc a = mk ?loc (Pstr_typext a)
    let exception_ ?loc a = mk ?loc (Pstr_exception a)
    let module_ ?loc a = mk ?loc (Pstr_module a)
    let rec_module ?loc a = mk ?loc (Pstr_recmodule a)
    let modtype ?loc a = mk ?loc (Pstr_modtype a)
    let open_ ?loc a = mk ?loc (Pstr_open a)
    let class_ ?loc a = mk ?loc (Pstr_class a)
    let class_type ?loc a = mk ?loc (Pstr_class_type a)
    let include_ ?loc a = mk ?loc (Pstr_include a)
    let extension ?loc ?(attrs = []) a = mk ?loc (Pstr_extension (a, attrs))
    let attribute ?loc a = mk ?loc (Pstr_attribute a)
    let text txt =
      List.map
        (fun ds -> attribute ~loc:(docstring_loc ds) (text_attr ds))
        txt
  end

  module Cl = struct
    let mk ?(loc = !default_loc) ?(attrs = []) d =
      {
       pcl_desc = d;
       pcl_loc = loc;
       pcl_attributes = attrs;
      }
    let attr d a = {d with pcl_attributes = d.pcl_attributes @ [a]}

    let constr ?loc ?attrs a b = mk ?loc ?attrs (Pcl_constr (a, b))
    let structure ?loc ?attrs a = mk ?loc ?attrs (Pcl_structure a)
    let fun_ ?loc ?attrs a b c d = mk ?loc ?attrs (Pcl_fun (a, b, c, d))
    let apply ?loc ?attrs a b = mk ?loc ?attrs (Pcl_apply (a, b))
    let let_ ?loc ?attrs a b c = mk ?loc ?attrs (Pcl_let (a, b, c))
    let constraint_ ?loc ?attrs a b = mk ?loc ?attrs (Pcl_constraint (a, b))
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pcl_extension a)
  end

  module Cty = struct
    let mk ?(loc = !default_loc) ?(attrs = []) d =
      {
       pcty_desc = d;
       pcty_loc = loc;
       pcty_attributes = attrs;
      }
    let attr d a = {d with pcty_attributes = d.pcty_attributes @ [a]}

    let constr ?loc ?attrs a b = mk ?loc ?attrs (Pcty_constr (a, b))
    let signature ?loc ?attrs a = mk ?loc ?attrs (Pcty_signature a)
    let arrow ?loc ?attrs a b c = mk ?loc ?attrs (Pcty_arrow (a, b, c))
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pcty_extension a)
  end

  module Ctf = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
             ?(docs = empty_docs) d =
      {
       pctf_desc = d;
       pctf_loc = loc;
       pctf_attributes = add_docs_attrs docs attrs;
      }

    let inherit_ ?loc ?attrs a = mk ?loc ?attrs (Pctf_inherit a)
    let val_ ?loc ?attrs a b c d = mk ?loc ?attrs (Pctf_val (a, b, c, d))
    let method_ ?loc ?attrs a b c d = mk ?loc ?attrs (Pctf_method (a, b, c, d))
    let constraint_ ?loc ?attrs a b = mk ?loc ?attrs (Pctf_constraint (a, b))
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pctf_extension a)
    let attribute ?loc a = mk ?loc (Pctf_attribute a)
    let text txt =
      List.map
        (fun ds -> attribute ~loc:(docstring_loc ds) (text_attr ds))
        txt

    let attr d a = {d with pctf_attributes = d.pctf_attributes @ [a]}

  end

  module Cf = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) d =
      {
       pcf_desc = d;
       pcf_loc = loc;
       pcf_attributes = add_docs_attrs docs attrs;
      }

    let inherit_ ?loc ?attrs a b c = mk ?loc ?attrs (Pcf_inherit (a, b, c))
    let val_ ?loc ?attrs a b c = mk ?loc ?attrs (Pcf_val (a, b, c))
    let method_ ?loc ?attrs a b c = mk ?loc ?attrs (Pcf_method (a, b, c))
    let constraint_ ?loc ?attrs a b = mk ?loc ?attrs (Pcf_constraint (a, b))
    let initializer_ ?loc ?attrs a = mk ?loc ?attrs (Pcf_initializer a)
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pcf_extension a)
    let attribute ?loc a = mk ?loc (Pcf_attribute a)
    let text txt =
      List.map
        (fun ds -> attribute ~loc:(docstring_loc ds) (text_attr ds))
        txt

    let virtual_ ct = Cfk_virtual ct
    let concrete o e = Cfk_concrete (o, e)

    let attr d a = {d with pcf_attributes = d.pcf_attributes @ [a]}

  end

  module Val = struct
    let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs)
          ?(prim = []) name typ =
      {
       pval_name = name;
       pval_type = typ;
       pval_attributes = add_docs_attrs docs attrs;
       pval_loc = loc;
       pval_prim = prim;
      }
  end

  module Md = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(text = []) name typ =
      {
       pmd_name = name;
       pmd_type = typ;
       pmd_attributes =
         add_text_attrs text (add_docs_attrs docs attrs);
       pmd_loc = loc;
      }
  end

  module Mtd = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(text = []) ?typ name =
      {
       pmtd_name = name;
       pmtd_type = typ;
       pmtd_attributes =
         add_text_attrs text (add_docs_attrs docs attrs);
       pmtd_loc = loc;
      }
  end

  module Mb = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(text = []) name expr =
      {
       pmb_name = name;
       pmb_expr = expr;
       pmb_attributes =
         add_text_attrs text (add_docs_attrs docs attrs);
       pmb_loc = loc;
      }
  end

  module Opn = struct
    let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs)
          ?(override = Fresh) lid =
      {
       popen_lid = lid;
       popen_override = override;
       popen_loc = loc;
       popen_attributes = add_docs_attrs docs attrs;
      }
  end

  module Incl = struct
    let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs) mexpr =
      {
       pincl_mod = mexpr;
       pincl_loc = loc;
       pincl_attributes = add_docs_attrs docs attrs;
      }

  end

  module Vb = struct
    let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs)
          ?(text = []) pat expr =
      {
       pvb_pat = pat;
       pvb_expr = expr;
       pvb_attributes =
         add_text_attrs text (add_docs_attrs docs attrs);
       pvb_loc = loc;
      }
  end

  module Ci = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(text = [])
          ?(virt = Concrete) ?(params = []) name expr =
      {
       pci_virt = virt;
       pci_params = params;
       pci_name = name;
       pci_expr = expr;
       pci_attributes =
         add_text_attrs text (add_docs_attrs docs attrs);
       pci_loc = loc;
      }
  end

  module Type = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(text = [])
        ?(params = [])
        ?(cstrs = [])
        ?(kind = Ptype_abstract)
        ?(priv = Public)
        ?manifest
        name =
      {
       ptype_name = name;
       ptype_params = params;
       ptype_cstrs = cstrs;
       ptype_kind = kind;
       ptype_private = priv;
       ptype_manifest = manifest;
       ptype_attributes =
         add_text_attrs text (add_docs_attrs docs attrs);
       ptype_loc = loc;
      }

    let constructor ?(loc = !default_loc) ?(attrs = []) ?(info = empty_info)
          ?(args = []) ?res name =
      {
       pcd_name = name;
       pcd_args = args;
       pcd_res = res;
       pcd_loc = loc;
       pcd_attributes = add_info_attrs info attrs;
      }

    let field ?(loc = !default_loc) ?(attrs = []) ?(info = empty_info)
          ?(mut = Immutable) name typ =
      {
       pld_name = name;
       pld_mutable = mut;
       pld_type = typ;
       pld_loc = loc;
       pld_attributes = add_info_attrs info attrs;
      }

  end

  (** Type extensions *)
  module Te = struct
    let mk ?(attrs = []) ?(docs = empty_docs)
          ?(params = []) ?(priv = Public) path constructors =
      {
       ptyext_path = path;
       ptyext_params = params;
       ptyext_constructors = constructors;
       ptyext_private = priv;
       ptyext_attributes = add_docs_attrs docs attrs;
      }

    let constructor ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(info = empty_info) name kind =
      {
       pext_name = name;
       pext_kind = kind;
       pext_loc = loc;
       pext_attributes = add_docs_attrs docs (add_info_attrs info attrs);
      }

    let decl ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(info = empty_info) ?(args = []) ?res name =
      {
       pext_name = name;
       pext_kind = Pext_decl(args, res);
       pext_loc = loc;
       pext_attributes = add_docs_attrs docs (add_info_attrs info attrs);
      }

    let rebind ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(info = empty_info) name lid =
      {
       pext_name = name;
       pext_kind = Pext_rebind lid;
       pext_loc = loc;
       pext_attributes = add_docs_attrs docs (add_info_attrs info attrs);
      }

  end

  module Csig = struct
    let mk self fields =
      {
       pcsig_self = self;
       pcsig_fields = fields;
      }
  end

  module Cstr = struct
    let mk self fields =
      {
       pcstr_self = self;
       pcstr_fields = fields;
      }
  end

end

module Ast_mapper : sig
  (** The interface of a -ppx rewriter

    A -ppx rewriter is a program that accepts a serialized abstract syntax
    tree and outputs another, possibly modified, abstract syntax tree.
    This module encapsulates the interface between the compiler and
    the -ppx rewriters, handling such details as the serialization format,
    forwarding of command-line flags, and storing state.

    {!mapper} allows to implement AST rewriting using open recursion.
    A typical mapper would be based on {!default_mapper}, a deep
    identity mapper, and will fall back on it for handling the syntax it
    does not modify. For example:

    {[
  open Asttypes
  open Parsetree
  open Ast_mapper

  let test_mapper argv =
    { default_mapper with
      expr = fun mapper expr ->
        match expr with
        | { pexp_desc = Pexp_extension ({ txt = "test" }, PStr [])} ->
          Ast_helper.Exp.constant (Const_int 42)
        | other -> default_mapper.expr mapper other; }

  let () =
    register "ppx_test" test_mapper]}

    This -ppx rewriter, which replaces [[%test]] in expressions with
    the constant [42], can be compiled using
    [ocamlc -o ppx_test -I +compiler-libs ocamlcommon.cma ppx_test.ml].

    *)

  open Parsetree

  (** {2 A generic Parsetree mapper} *)

  type mapper (*IF_CURRENT = Ast_mapper.mapper*) = {
    attribute: mapper -> attribute -> attribute;
    attributes: mapper -> attribute list -> attribute list;
    case: mapper -> case -> case;
    cases: mapper -> case list -> case list;
    class_declaration: mapper -> class_declaration -> class_declaration;
    class_description: mapper -> class_description -> class_description;
    class_expr: mapper -> class_expr -> class_expr;
    class_field: mapper -> class_field -> class_field;
    class_signature: mapper -> class_signature -> class_signature;
    class_structure: mapper -> class_structure -> class_structure;
    class_type: mapper -> class_type -> class_type;
    class_type_declaration: mapper -> class_type_declaration
                            -> class_type_declaration;
    class_type_field: mapper -> class_type_field -> class_type_field;
    constructor_declaration: mapper -> constructor_declaration
                             -> constructor_declaration;
    expr: mapper -> expression -> expression;
    extension: mapper -> extension -> extension;
    extension_constructor: mapper -> extension_constructor
                           -> extension_constructor;
    include_declaration: mapper -> include_declaration -> include_declaration;
    include_description: mapper -> include_description -> include_description;
    label_declaration: mapper -> label_declaration -> label_declaration;
    location: mapper -> Location.t -> Location.t;
    module_binding: mapper -> module_binding -> module_binding;
    module_declaration: mapper -> module_declaration -> module_declaration;
    module_expr: mapper -> module_expr -> module_expr;
    module_type: mapper -> module_type -> module_type;
    module_type_declaration: mapper -> module_type_declaration
                             -> module_type_declaration;
    open_description: mapper -> open_description -> open_description;
    pat: mapper -> pattern -> pattern;
    payload: mapper -> payload -> payload;
    signature: mapper -> signature -> signature;
    signature_item: mapper -> signature_item -> signature_item;
    structure: mapper -> structure -> structure;
    structure_item: mapper -> structure_item -> structure_item;
    typ: mapper -> core_type -> core_type;
    type_declaration: mapper -> type_declaration -> type_declaration;
    type_extension: mapper -> type_extension -> type_extension;
    type_kind: mapper -> type_kind -> type_kind;
    value_binding: mapper -> value_binding -> value_binding;
    value_description: mapper -> value_description -> value_description;
    with_constraint: mapper -> with_constraint -> with_constraint;
  }
  (** A mapper record implements one "method" per syntactic category,
      using an open recursion style: each method takes as its first
      argument the mapper to be applied to children in the syntax
      tree. *)

  val default_mapper: mapper
  (** A default mapper, which implements a "deep identity" mapping. *)

  (** {2 Convenience functions to write mappers} *)

  val map_opt: ('a -> 'b) -> 'a option -> 'b option

  val extension_of_error: Location.error -> extension
  (** Encode an error into an 'ocaml.error' extension node which can be
      inserted in a generated Parsetree.  The compiler will be
      responsible for reporting the error. *)

  val attribute_of_warning: Location.t -> string -> attribute
  (** Encode a warning message into an 'ocaml.ppwarning' attribute which can be
      inserted in a generated Parsetree.  The compiler will be
      responsible for reporting the warning. *)

end = struct
  (* A generic Parsetree mapping class *)

  (*
  [@@@ocaml.warning "+9"]
    (* Ensure that record patterns don't miss any field. *)
  *)


  open Parsetree
  open Ast_helper
  open Location

  type mapper (*IF_CURRENT = Ast_mapper.mapper*) = {
    attribute: mapper -> attribute -> attribute;
    attributes: mapper -> attribute list -> attribute list;
    case: mapper -> case -> case;
    cases: mapper -> case list -> case list;
    class_declaration: mapper -> class_declaration -> class_declaration;
    class_description: mapper -> class_description -> class_description;
    class_expr: mapper -> class_expr -> class_expr;
    class_field: mapper -> class_field -> class_field;
    class_signature: mapper -> class_signature -> class_signature;
    class_structure: mapper -> class_structure -> class_structure;
    class_type: mapper -> class_type -> class_type;
    class_type_declaration: mapper -> class_type_declaration
                            -> class_type_declaration;
    class_type_field: mapper -> class_type_field -> class_type_field;
    constructor_declaration: mapper -> constructor_declaration
                             -> constructor_declaration;
    expr: mapper -> expression -> expression;
    extension: mapper -> extension -> extension;
    extension_constructor: mapper -> extension_constructor
                           -> extension_constructor;
    include_declaration: mapper -> include_declaration -> include_declaration;
    include_description: mapper -> include_description -> include_description;
    label_declaration: mapper -> label_declaration -> label_declaration;
    location: mapper -> Location.t -> Location.t;
    module_binding: mapper -> module_binding -> module_binding;
    module_declaration: mapper -> module_declaration -> module_declaration;
    module_expr: mapper -> module_expr -> module_expr;
    module_type: mapper -> module_type -> module_type;
    module_type_declaration: mapper -> module_type_declaration
                             -> module_type_declaration;
    open_description: mapper -> open_description -> open_description;
    pat: mapper -> pattern -> pattern;
    payload: mapper -> payload -> payload;
    signature: mapper -> signature -> signature;
    signature_item: mapper -> signature_item -> signature_item;
    structure: mapper -> structure -> structure;
    structure_item: mapper -> structure_item -> structure_item;
    typ: mapper -> core_type -> core_type;
    type_declaration: mapper -> type_declaration -> type_declaration;
    type_extension: mapper -> type_extension -> type_extension;
    type_kind: mapper -> type_kind -> type_kind;
    value_binding: mapper -> value_binding -> value_binding;
    value_description: mapper -> value_description -> value_description;
    with_constraint: mapper -> with_constraint -> with_constraint;
  }

  let map_fst f (x, y) = (f x, y)
  let map_snd f (x, y) = (x, f y)
  let map_tuple f1 f2 (x, y) = (f1 x, f2 y)
  let map_tuple3 f1 f2 f3 (x, y, z) = (f1 x, f2 y, f3 z)
  let map_opt f = function None -> None | Some x -> Some (f x)

  let map_loc sub {loc; txt} = {loc = sub.location sub loc; txt}

  module T = struct
    (* Type expressions for the core language *)

    let row_field sub = function
      | Rtag (l, attrs, b, tl) ->
          Rtag (l, sub.attributes sub attrs, b, List.map (sub.typ sub) tl)
      | Rinherit t -> Rinherit (sub.typ sub t)

    let map sub {ptyp_desc = desc; ptyp_loc = loc; ptyp_attributes = attrs} =
      let open Typ in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Ptyp_any -> any ~loc ~attrs ()
      | Ptyp_var s -> var ~loc ~attrs s
      | Ptyp_arrow (lab, t1, t2) ->
          arrow ~loc ~attrs lab (sub.typ sub t1) (sub.typ sub t2)
      | Ptyp_tuple tyl -> tuple ~loc ~attrs (List.map (sub.typ sub) tyl)
      | Ptyp_constr (lid, tl) ->
          constr ~loc ~attrs (map_loc sub lid) (List.map (sub.typ sub) tl)
      | Ptyp_object (l, o) ->
          let f (s, a, t) = (s, sub.attributes sub a, sub.typ sub t) in
          object_ ~loc ~attrs (List.map f l) o
      | Ptyp_class (lid, tl) ->
          class_ ~loc ~attrs (map_loc sub lid) (List.map (sub.typ sub) tl)
      | Ptyp_alias (t, s) -> alias ~loc ~attrs (sub.typ sub t) s
      | Ptyp_variant (rl, b, ll) ->
          variant ~loc ~attrs (List.map (row_field sub) rl) b ll
      | Ptyp_poly (sl, t) -> poly ~loc ~attrs sl (sub.typ sub t)
      | Ptyp_package (lid, l) ->
          package ~loc ~attrs (map_loc sub lid)
            (List.map (map_tuple (map_loc sub) (sub.typ sub)) l)
      | Ptyp_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_type_declaration sub
        {ptype_name; ptype_params; ptype_cstrs;
         ptype_kind;
         ptype_private;
         ptype_manifest;
         ptype_attributes;
         ptype_loc} =
      Type.mk (map_loc sub ptype_name)
        ~params:(List.map (map_fst (sub.typ sub)) ptype_params)
        ~priv:ptype_private
        ~cstrs:(List.map
                  (map_tuple3 (sub.typ sub) (sub.typ sub) (sub.location sub))
                  ptype_cstrs)
        ~kind:(sub.type_kind sub ptype_kind)
        ?manifest:(map_opt (sub.typ sub) ptype_manifest)
        ~loc:(sub.location sub ptype_loc)
        ~attrs:(sub.attributes sub ptype_attributes)

    let map_type_kind sub = function
      | Ptype_abstract -> Ptype_abstract
      | Ptype_variant l ->
          Ptype_variant (List.map (sub.constructor_declaration sub) l)
      | Ptype_record l -> Ptype_record (List.map (sub.label_declaration sub) l)
      | Ptype_open -> Ptype_open

    let map_type_extension sub
        {ptyext_path; ptyext_params;
         ptyext_constructors;
         ptyext_private;
         ptyext_attributes} =
      Te.mk
        (map_loc sub ptyext_path)
        (List.map (sub.extension_constructor sub) ptyext_constructors)
        ~params:(List.map (map_fst (sub.typ sub)) ptyext_params)
        ~priv:ptyext_private
        ~attrs:(sub.attributes sub ptyext_attributes)

    let map_extension_constructor_kind sub = function
        Pext_decl(ctl, cto) ->
          Pext_decl(List.map (sub.typ sub) ctl, map_opt (sub.typ sub) cto)
      | Pext_rebind li ->
          Pext_rebind (map_loc sub li)

    let map_extension_constructor sub
        {pext_name;
         pext_kind;
         pext_loc;
         pext_attributes} =
      Te.constructor
        (map_loc sub pext_name)
        (map_extension_constructor_kind sub pext_kind)
        ~loc:(sub.location sub pext_loc)
        ~attrs:(sub.attributes sub pext_attributes)

  end

  module CT = struct
    (* Type expressions for the class language *)

    let map sub {pcty_loc = loc; pcty_desc = desc; pcty_attributes = attrs} =
      let open Cty in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pcty_constr (lid, tys) ->
          constr ~loc ~attrs (map_loc sub lid) (List.map (sub.typ sub) tys)
      | Pcty_signature x -> signature ~loc ~attrs (sub.class_signature sub x)
      | Pcty_arrow (lab, t, ct) ->
          arrow ~loc ~attrs lab (sub.typ sub t) (sub.class_type sub ct)
      | Pcty_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_field sub {pctf_desc = desc; pctf_loc = loc; pctf_attributes = attrs}
      =
      let open Ctf in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pctf_inherit ct -> inherit_ ~loc ~attrs (sub.class_type sub ct)
      | Pctf_val (s, m, v, t) -> val_ ~loc ~attrs s m v (sub.typ sub t)
      | Pctf_method (s, p, v, t) -> method_ ~loc ~attrs s p v (sub.typ sub t)
      | Pctf_constraint (t1, t2) ->
          constraint_ ~loc ~attrs (sub.typ sub t1) (sub.typ sub t2)
      | Pctf_attribute x -> attribute ~loc (sub.attribute sub x)
      | Pctf_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_signature sub {pcsig_self; pcsig_fields} =
      Csig.mk
        (sub.typ sub pcsig_self)
        (List.map (sub.class_type_field sub) pcsig_fields)
  end

  module MT = struct
    (* Type expressions for the module language *)

    let map sub {pmty_desc = desc; pmty_loc = loc; pmty_attributes = attrs} =
      let open Mty in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pmty_ident s -> ident ~loc ~attrs (map_loc sub s)
      | Pmty_alias s -> alias ~loc ~attrs (map_loc sub s)
      | Pmty_signature sg -> signature ~loc ~attrs (sub.signature sub sg)
      | Pmty_functor (s, mt1, mt2) ->
          functor_ ~loc ~attrs (map_loc sub s)
            (Misc.may_map (sub.module_type sub) mt1)
            (sub.module_type sub mt2)
      | Pmty_with (mt, l) ->
          with_ ~loc ~attrs (sub.module_type sub mt)
            (List.map (sub.with_constraint sub) l)
      | Pmty_typeof me -> typeof_ ~loc ~attrs (sub.module_expr sub me)
      | Pmty_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_with_constraint sub = function
      | Pwith_type (lid, d) ->
          Pwith_type (map_loc sub lid, sub.type_declaration sub d)
      | Pwith_module (lid, lid2) ->
          Pwith_module (map_loc sub lid, map_loc sub lid2)
      | Pwith_typesubst d -> Pwith_typesubst (sub.type_declaration sub d)
      | Pwith_modsubst (s, lid) ->
          Pwith_modsubst (map_loc sub s, map_loc sub lid)

    let map_signature_item sub {psig_desc = desc; psig_loc = loc} =
      let open Sig in
      let loc = sub.location sub loc in
      match desc with
      | Psig_value vd -> value ~loc (sub.value_description sub vd)
      | Psig_type l -> type_ ~loc (List.map (sub.type_declaration sub) l)
      | Psig_typext te -> type_extension ~loc (sub.type_extension sub te)
      | Psig_exception ed -> exception_ ~loc (sub.extension_constructor sub ed)
      | Psig_module x -> module_ ~loc (sub.module_declaration sub x)
      | Psig_recmodule l ->
          rec_module ~loc (List.map (sub.module_declaration sub) l)
      | Psig_modtype x -> modtype ~loc (sub.module_type_declaration sub x)
      | Psig_open x -> open_ ~loc (sub.open_description sub x)
      | Psig_include x -> include_ ~loc (sub.include_description sub x)
      | Psig_class l -> class_ ~loc (List.map (sub.class_description sub) l)
      | Psig_class_type l ->
          class_type ~loc (List.map (sub.class_type_declaration sub) l)
      | Psig_extension (x, attrs) ->
          extension ~loc (sub.extension sub x) ~attrs:(sub.attributes sub attrs)
      | Psig_attribute x -> attribute ~loc (sub.attribute sub x)
  end


  module M = struct
    (* Value expressions for the module language *)

    let map sub {pmod_loc = loc; pmod_desc = desc; pmod_attributes = attrs} =
      let open Mod in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pmod_ident x -> ident ~loc ~attrs (map_loc sub x)
      | Pmod_structure str -> structure ~loc ~attrs (sub.structure sub str)
      | Pmod_functor (arg, arg_ty, body) ->
          functor_ ~loc ~attrs (map_loc sub arg)
            (Misc.may_map (sub.module_type sub) arg_ty)
            (sub.module_expr sub body)
      | Pmod_apply (m1, m2) ->
          apply ~loc ~attrs (sub.module_expr sub m1) (sub.module_expr sub m2)
      | Pmod_constraint (m, mty) ->
          constraint_ ~loc ~attrs (sub.module_expr sub m)
                      (sub.module_type sub mty)
      | Pmod_unpack e -> unpack ~loc ~attrs (sub.expr sub e)
      | Pmod_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_structure_item sub {pstr_loc = loc; pstr_desc = desc} =
      let open Str in
      let loc = sub.location sub loc in
      match desc with
      | Pstr_eval (x, attrs) ->
          eval ~loc ~attrs:(sub.attributes sub attrs) (sub.expr sub x)
      | Pstr_value (r, vbs) -> value ~loc r (List.map (sub.value_binding sub) vbs)
      | Pstr_primitive vd -> primitive ~loc (sub.value_description sub vd)
      | Pstr_type l -> type_ ~loc (List.map (sub.type_declaration sub) l)
      | Pstr_typext te -> type_extension ~loc (sub.type_extension sub te)
      | Pstr_exception ed -> exception_ ~loc (sub.extension_constructor sub ed)
      | Pstr_module x -> module_ ~loc (sub.module_binding sub x)
      | Pstr_recmodule l -> rec_module ~loc (List.map (sub.module_binding sub) l)
      | Pstr_modtype x -> modtype ~loc (sub.module_type_declaration sub x)
      | Pstr_open x -> open_ ~loc (sub.open_description sub x)
      | Pstr_class l -> class_ ~loc (List.map (sub.class_declaration sub) l)
      | Pstr_class_type l ->
          class_type ~loc (List.map (sub.class_type_declaration sub) l)
      | Pstr_include x -> include_ ~loc (sub.include_declaration sub x)
      | Pstr_extension (x, attrs) ->
          extension ~loc (sub.extension sub x) ~attrs:(sub.attributes sub attrs)
      | Pstr_attribute x -> attribute ~loc (sub.attribute sub x)
  end

  module E = struct
    (* Value expressions for the core language *)

    let map sub {pexp_loc = loc; pexp_desc = desc; pexp_attributes = attrs} =
      let open Exp in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pexp_ident x -> ident ~loc ~attrs (map_loc sub x)
      | Pexp_constant x -> constant ~loc ~attrs x
      | Pexp_let (r, vbs, e) ->
          let_ ~loc ~attrs r (List.map (sub.value_binding sub) vbs)
            (sub.expr sub e)
      | Pexp_fun (lab, def, p, e) ->
          fun_ ~loc ~attrs lab (map_opt (sub.expr sub) def) (sub.pat sub p)
            (sub.expr sub e)
      | Pexp_function pel -> function_ ~loc ~attrs (sub.cases sub pel)
      | Pexp_apply (e, l) ->
          apply ~loc ~attrs (sub.expr sub e) (List.map (map_snd (sub.expr sub)) l)
      | Pexp_match (e, pel) ->
          match_ ~loc ~attrs (sub.expr sub e) (sub.cases sub pel)
      | Pexp_try (e, pel) -> try_ ~loc ~attrs (sub.expr sub e) (sub.cases sub pel)
      | Pexp_tuple el -> tuple ~loc ~attrs (List.map (sub.expr sub) el)
      | Pexp_construct (lid, arg) ->
          construct ~loc ~attrs (map_loc sub lid) (map_opt (sub.expr sub) arg)
      | Pexp_variant (lab, eo) ->
          variant ~loc ~attrs lab (map_opt (sub.expr sub) eo)
      | Pexp_record (l, eo) ->
          record ~loc ~attrs (List.map (map_tuple (map_loc sub) (sub.expr sub)) l)
            (map_opt (sub.expr sub) eo)
      | Pexp_field (e, lid) ->
          field ~loc ~attrs (sub.expr sub e) (map_loc sub lid)
      | Pexp_setfield (e1, lid, e2) ->
          setfield ~loc ~attrs (sub.expr sub e1) (map_loc sub lid)
            (sub.expr sub e2)
      | Pexp_array el -> array ~loc ~attrs (List.map (sub.expr sub) el)
      | Pexp_ifthenelse (e1, e2, e3) ->
          ifthenelse ~loc ~attrs (sub.expr sub e1) (sub.expr sub e2)
            (map_opt (sub.expr sub) e3)
      | Pexp_sequence (e1, e2) ->
          sequence ~loc ~attrs (sub.expr sub e1) (sub.expr sub e2)
      | Pexp_while (e1, e2) ->
          while_ ~loc ~attrs (sub.expr sub e1) (sub.expr sub e2)
      | Pexp_for (p, e1, e2, d, e3) ->
          for_ ~loc ~attrs (sub.pat sub p) (sub.expr sub e1) (sub.expr sub e2) d
            (sub.expr sub e3)
      | Pexp_coerce (e, t1, t2) ->
          coerce ~loc ~attrs (sub.expr sub e) (map_opt (sub.typ sub) t1)
            (sub.typ sub t2)
      | Pexp_constraint (e, t) ->
          constraint_ ~loc ~attrs (sub.expr sub e) (sub.typ sub t)
      | Pexp_send (e, s) -> send ~loc ~attrs (sub.expr sub e) s
      | Pexp_new lid -> new_ ~loc ~attrs (map_loc sub lid)
      | Pexp_setinstvar (s, e) ->
          setinstvar ~loc ~attrs (map_loc sub s) (sub.expr sub e)
      | Pexp_override sel ->
          override ~loc ~attrs
            (List.map (map_tuple (map_loc sub) (sub.expr sub)) sel)
      | Pexp_letmodule (s, me, e) ->
          letmodule ~loc ~attrs (map_loc sub s) (sub.module_expr sub me)
            (sub.expr sub e)
      | Pexp_assert e -> assert_ ~loc ~attrs (sub.expr sub e)
      | Pexp_lazy e -> lazy_ ~loc ~attrs (sub.expr sub e)
      | Pexp_poly (e, t) ->
          poly ~loc ~attrs (sub.expr sub e) (map_opt (sub.typ sub) t)
      | Pexp_object cls -> object_ ~loc ~attrs (sub.class_structure sub cls)
      | Pexp_newtype (s, e) -> newtype ~loc ~attrs s (sub.expr sub e)
      | Pexp_pack me -> pack ~loc ~attrs (sub.module_expr sub me)
      | Pexp_open (ovf, lid, e) ->
          open_ ~loc ~attrs ovf (map_loc sub lid) (sub.expr sub e)
      | Pexp_extension x -> extension ~loc ~attrs (sub.extension sub x)
  end

  module P = struct
    (* Patterns *)

    let map sub {ppat_desc = desc; ppat_loc = loc; ppat_attributes = attrs} =
      let open Pat in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Ppat_any -> any ~loc ~attrs ()
      | Ppat_var s -> var ~loc ~attrs (map_loc sub s)
      | Ppat_alias (p, s) -> alias ~loc ~attrs (sub.pat sub p) (map_loc sub s)
      | Ppat_constant c -> constant ~loc ~attrs c
      | Ppat_interval (c1, c2) -> interval ~loc ~attrs c1 c2
      | Ppat_tuple pl -> tuple ~loc ~attrs (List.map (sub.pat sub) pl)
      | Ppat_construct (l, p) ->
          construct ~loc ~attrs (map_loc sub l) (map_opt (sub.pat sub) p)
      | Ppat_variant (l, p) -> variant ~loc ~attrs l (map_opt (sub.pat sub) p)
      | Ppat_record (lpl, cf) ->
          record ~loc ~attrs
                 (List.map (map_tuple (map_loc sub) (sub.pat sub)) lpl) cf
      | Ppat_array pl -> array ~loc ~attrs (List.map (sub.pat sub) pl)
      | Ppat_or (p1, p2) -> or_ ~loc ~attrs (sub.pat sub p1) (sub.pat sub p2)
      | Ppat_constraint (p, t) ->
          constraint_ ~loc ~attrs (sub.pat sub p) (sub.typ sub t)
      | Ppat_type s -> type_ ~loc ~attrs (map_loc sub s)
      | Ppat_lazy p -> lazy_ ~loc ~attrs (sub.pat sub p)
      | Ppat_unpack s -> unpack ~loc ~attrs (map_loc sub s)
      | Ppat_exception p -> exception_ ~loc ~attrs (sub.pat sub p)
      | Ppat_extension x -> extension ~loc ~attrs (sub.extension sub x)
  end

  module CE = struct
    (* Value expressions for the class language *)

    let map sub {pcl_loc = loc; pcl_desc = desc; pcl_attributes = attrs} =
      let open Cl in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pcl_constr (lid, tys) ->
          constr ~loc ~attrs (map_loc sub lid) (List.map (sub.typ sub) tys)
      | Pcl_structure s ->
          structure ~loc ~attrs (sub.class_structure sub s)
      | Pcl_fun (lab, e, p, ce) ->
          fun_ ~loc ~attrs lab
            (map_opt (sub.expr sub) e)
            (sub.pat sub p)
            (sub.class_expr sub ce)
      | Pcl_apply (ce, l) ->
          apply ~loc ~attrs (sub.class_expr sub ce)
            (List.map (map_snd (sub.expr sub)) l)
      | Pcl_let (r, vbs, ce) ->
          let_ ~loc ~attrs r (List.map (sub.value_binding sub) vbs)
            (sub.class_expr sub ce)
      | Pcl_constraint (ce, ct) ->
          constraint_ ~loc ~attrs (sub.class_expr sub ce) (sub.class_type sub ct)
      | Pcl_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_kind sub = function
      | Cfk_concrete (o, e) -> Cfk_concrete (o, sub.expr sub e)
      | Cfk_virtual t -> Cfk_virtual (sub.typ sub t)

    let map_field sub {pcf_desc = desc; pcf_loc = loc; pcf_attributes = attrs} =
      let open Cf in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pcf_inherit (o, ce, s) -> inherit_ ~loc ~attrs o (sub.class_expr sub ce) s
      | Pcf_val (s, m, k) -> val_ ~loc ~attrs (map_loc sub s) m (map_kind sub k)
      | Pcf_method (s, p, k) ->
          method_ ~loc ~attrs (map_loc sub s) p (map_kind sub k)
      | Pcf_constraint (t1, t2) ->
          constraint_ ~loc ~attrs (sub.typ sub t1) (sub.typ sub t2)
      | Pcf_initializer e -> initializer_ ~loc ~attrs (sub.expr sub e)
      | Pcf_attribute x -> attribute ~loc (sub.attribute sub x)
      | Pcf_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_structure sub {pcstr_self; pcstr_fields} =
      {
        pcstr_self = sub.pat sub pcstr_self;
        pcstr_fields = List.map (sub.class_field sub) pcstr_fields;
      }

    let class_infos sub f {pci_virt; pci_params = pl; pci_name; pci_expr;
                           pci_loc; pci_attributes} =
      Ci.mk
       ~virt:pci_virt
       ~params:(List.map (map_fst (sub.typ sub)) pl)
        (map_loc sub pci_name)
        (f pci_expr)
        ~loc:(sub.location sub pci_loc)
        ~attrs:(sub.attributes sub pci_attributes)
  end

  (* Now, a generic AST mapper, to be extended to cover all kinds and
     cases of the OCaml grammar.  The default behavior of the mapper is
     the identity. *)

  let default_mapper =
    {
      structure = (fun this l -> List.map (this.structure_item this) l);
      structure_item = M.map_structure_item;
      module_expr = M.map;
      signature = (fun this l -> List.map (this.signature_item this) l);
      signature_item = MT.map_signature_item;
      module_type = MT.map;
      with_constraint = MT.map_with_constraint;
      class_declaration =
        (fun this -> CE.class_infos this (this.class_expr this));
      class_expr = CE.map;
      class_field = CE.map_field;
      class_structure = CE.map_structure;
      class_type = CT.map;
      class_type_field = CT.map_field;
      class_signature = CT.map_signature;
      class_type_declaration =
        (fun this -> CE.class_infos this (this.class_type this));
      class_description =
        (fun this -> CE.class_infos this (this.class_type this));
      type_declaration = T.map_type_declaration;
      type_kind = T.map_type_kind;
      typ = T.map;
      type_extension = T.map_type_extension;
      extension_constructor = T.map_extension_constructor;
      value_description =
        (fun this {pval_name; pval_type; pval_prim; pval_loc;
                   pval_attributes} ->
          Val.mk
            (map_loc this pval_name)
            (this.typ this pval_type)
            ~attrs:(this.attributes this pval_attributes)
            ~loc:(this.location this pval_loc)
            ~prim:pval_prim
        );

      pat = P.map;
      expr = E.map;

      module_declaration =
        (fun this {pmd_name; pmd_type; pmd_attributes; pmd_loc} ->
           Md.mk
             (map_loc this pmd_name)
             (this.module_type this pmd_type)
             ~attrs:(this.attributes this pmd_attributes)
             ~loc:(this.location this pmd_loc)
        );

      module_type_declaration =
        (fun this {pmtd_name; pmtd_type; pmtd_attributes; pmtd_loc} ->
           Mtd.mk
             (map_loc this pmtd_name)
             ?typ:(map_opt (this.module_type this) pmtd_type)
             ~attrs:(this.attributes this pmtd_attributes)
             ~loc:(this.location this pmtd_loc)
        );

      module_binding =
        (fun this {pmb_name; pmb_expr; pmb_attributes; pmb_loc} ->
           Mb.mk (map_loc this pmb_name) (this.module_expr this pmb_expr)
             ~attrs:(this.attributes this pmb_attributes)
             ~loc:(this.location this pmb_loc)
        );


      open_description =
        (fun this {popen_lid; popen_override; popen_attributes; popen_loc} ->
           Opn.mk (map_loc this popen_lid)
             ~override:popen_override
             ~loc:(this.location this popen_loc)
             ~attrs:(this.attributes this popen_attributes)
        );


      include_description =
        (fun this {pincl_mod; pincl_attributes; pincl_loc} ->
           Incl.mk (this.module_type this pincl_mod)
             ~loc:(this.location this pincl_loc)
             ~attrs:(this.attributes this pincl_attributes)
        );

      include_declaration =
        (fun this {pincl_mod; pincl_attributes; pincl_loc} ->
           Incl.mk (this.module_expr this pincl_mod)
             ~loc:(this.location this pincl_loc)
             ~attrs:(this.attributes this pincl_attributes)
        );


      value_binding =
        (fun this {pvb_pat; pvb_expr; pvb_attributes; pvb_loc} ->
           Vb.mk
             (this.pat this pvb_pat)
             (this.expr this pvb_expr)
             ~loc:(this.location this pvb_loc)
             ~attrs:(this.attributes this pvb_attributes)
        );


      constructor_declaration =
        (fun this {pcd_name; pcd_args; pcd_res; pcd_loc; pcd_attributes} ->
          Type.constructor
            (map_loc this pcd_name)
            ~args:(List.map (this.typ this) pcd_args)
            ?res:(map_opt (this.typ this) pcd_res)
            ~loc:(this.location this pcd_loc)
            ~attrs:(this.attributes this pcd_attributes)
        );

      label_declaration =
        (fun this {pld_name; pld_type; pld_loc; pld_mutable; pld_attributes} ->
           Type.field
             (map_loc this pld_name)
             (this.typ this pld_type)
             ~mut:pld_mutable
             ~loc:(this.location this pld_loc)
             ~attrs:(this.attributes this pld_attributes)
        );

      cases = (fun this l -> List.map (this.case this) l);
      case =
        (fun this {pc_lhs; pc_guard; pc_rhs} ->
           {
             pc_lhs = this.pat this pc_lhs;
             pc_guard = map_opt (this.expr this) pc_guard;
             pc_rhs = this.expr this pc_rhs;
           }
        );



      location = (fun _this l -> l);

      extension = (fun this (s, e) -> (map_loc this s, this.payload this e));
      attribute = (fun this (s, e) -> (map_loc this s, this.payload this e));
      attributes = (fun this l -> List.map (this.attribute this) l);
      payload =
        (fun this -> function
           | PStr x -> PStr (this.structure this x)
           | PTyp x -> PTyp (this.typ this x)
           | PPat (x, g) -> PPat (this.pat this x, map_opt (this.expr this) g)
        );
    }

  let rec extension_of_error {loc; msg; if_highlight; sub} =
    { loc; txt = "ocaml.error" },
    PStr ([Str.eval (Exp.constant (Asttypes.Const_string (msg, None)));
           Str.eval (Exp.constant (Asttypes.Const_string (if_highlight, None)))] @
          (List.map (fun ext -> Str.extension (extension_of_error ext)) sub))

  let attribute_of_warning loc s =
    { loc; txt = "ocaml.ppwarning" },
    PStr ([Str.eval ~loc (Exp.constant (Asttypes.Const_string (s, None)))])
end

module Outcometree = struct
  (* Module [Outcometree]: results displayed by the toplevel *)

  (* These types represent messages that the toplevel displays as normal
     results or errors. The real displaying is customisable using the hooks:
        [Toploop.print_out_value]
        [Toploop.print_out_type]
        [Toploop.print_out_sig_item]
        [Toploop.print_out_phrase] *)

  type out_ident (*IF_CURRENT = Outcometree.out_ident *) =
    | Oide_apply of out_ident * out_ident
    | Oide_dot of out_ident * string
    | Oide_ident of string

  type out_value (*IF_CURRENT = Outcometree.out_value *) =
    | Oval_array of out_value list
    | Oval_char of char
    | Oval_constr of out_ident * out_value list
    | Oval_ellipsis
    | Oval_float of float
    | Oval_int of int
    | Oval_int32 of int32
    | Oval_int64 of int64
    | Oval_nativeint of nativeint
    | Oval_list of out_value list
    | Oval_printer of (Format.formatter -> unit)
    | Oval_record of (out_ident * out_value) list
    | Oval_string of string
    | Oval_stuff of string
    | Oval_tuple of out_value list
    | Oval_variant of string * out_value option

  type out_type (*IF_CURRENT = Outcometree.out_type *) =
    | Otyp_abstract
    | Otyp_open
    | Otyp_alias of out_type * string
    | Otyp_arrow of string * out_type * out_type
    | Otyp_class of bool * out_ident * out_type list
    | Otyp_constr of out_ident * out_type list
    | Otyp_manifest of out_type * out_type
    | Otyp_object of (string * out_type) list * bool option
    | Otyp_record of (string * bool * out_type) list
    | Otyp_stuff of string
    | Otyp_sum of (string * out_type list * out_type option) list
    | Otyp_tuple of out_type list
    | Otyp_var of bool * string
    | Otyp_variant of
        bool * out_variant * bool * (string list) option
    | Otyp_poly of string list * out_type
    | Otyp_module of string * string list * out_type list

  and out_variant (*IF_CURRENT = Outcometree.out_variant *) =
    | Ovar_fields of (string * bool * out_type list) list
    | Ovar_name of out_ident * out_type list

  type out_class_type (*IF_CURRENT = Outcometree.out_class_type *) =
    | Octy_constr of out_ident * out_type list
    | Octy_arrow of string * out_type * out_class_type
    | Octy_signature of out_type option * out_class_sig_item list
  and out_class_sig_item  (*IF_CURRENT = Outcometree.out_class_sig_item *) =
    | Ocsg_constraint of out_type * out_type
    | Ocsg_method of string * bool * bool * out_type
    | Ocsg_value of string * bool * bool * out_type

  type out_module_type (*IF_CURRENT = Outcometree.out_module_type *) =
    | Omty_abstract
    | Omty_functor of string * out_module_type option * out_module_type
    | Omty_ident of out_ident
    | Omty_signature of out_sig_item list
    | Omty_alias of out_ident
  and out_sig_item  (*IF_CURRENT = Outcometree.out_sig_item *) =
    | Osig_class of
        bool * string * (string * (bool * bool)) list * out_class_type *
          out_rec_status
    | Osig_class_type of
        bool * string * (string * (bool * bool)) list * out_class_type *
          out_rec_status
    | Osig_typext of out_extension_constructor * out_ext_status
    | Osig_modtype of string * out_module_type
    | Osig_module of string * out_module_type * out_rec_status
    | Osig_type of out_type_decl * out_rec_status
    | Osig_value of string * out_type * string list
  and out_type_decl  (*IF_CURRENT = Outcometree.out_type_decl *) =
    { otype_name: string;
      otype_params: (string * (bool * bool)) list;
      otype_type: out_type;
      otype_private: Asttypes.private_flag;
      otype_cstrs: (out_type * out_type) list }
  and out_extension_constructor (*IF_CURRENT = Outcometree.out_extension_constructor *) =
    { oext_name: string;
      oext_type_name: string;
      oext_type_params: string list;
      oext_args: out_type list;
      oext_ret_type: out_type option;
      oext_private: Asttypes.private_flag }
  and out_type_extension (*IF_CURRENT = Outcometree.out_type_extension *) =
    { otyext_name: string;
      otyext_params: string list;
      otyext_constructors: (string * out_type list * out_type option) list;
      otyext_private: Asttypes.private_flag }
  and out_rec_status (*IF_CURRENT = Outcometree.out_rec_status *) =
    | Orec_not
    | Orec_first
    | Orec_next
  and out_ext_status (*IF_CURRENT = Outcometree.out_ext_status*) =
    | Oext_first
    | Oext_next
    | Oext_exception

  type out_phrase (*IF_CURRENT = Outcometree.out_phrase *) =
    | Ophr_eval of out_value * out_type
    | Ophr_signature of (out_sig_item * out_value option) list
    | Ophr_exception of (exn * out_value)

end

module Config = struct
  let ast_impl_magic_number = "Caml1999M016"
  let ast_intf_magic_number = "Caml1999N015"
end

let map_signature mapper = mapper.Ast_mapper.signature mapper
let map_structure mapper = mapper.Ast_mapper.structure mapper

let shallow_identity =
  let id _ x = x in
  {
    Ast_mapper.
    structure               = id;
    structure_item          = id;
    module_expr             = id;
    signature               = id;
    signature_item          = id;
    module_type             = id;
    with_constraint         = id;
    class_declaration       = id;
    class_expr              = id;
    class_field             = id;
    class_structure         = id;
    class_type              = id;
    class_type_field        = id;
    class_signature         = id;
    class_type_declaration  = id;
    class_description       = id;
    type_declaration        = id;
    type_kind               = id;
    typ                     = id;
    type_extension          = id;
    extension_constructor   = id;
    value_description       = id;
    pat                     = id;
    expr                    = id;
    module_declaration      = id;
    module_type_declaration = id;
    module_binding          = id;
    open_description        = id;
    include_description     = id;
    include_declaration     = id;
    value_binding           = id;
    constructor_declaration = id;
    label_declaration       = id;
    cases                   = id;
    case                    = id;
    location                = id;
    extension               = id;
    attribute               = id;
    attributes              = id;
    payload                 = id;
  }

let failing_mapper =
  let fail _ _ =
    invalid_arg "failing_mapper: this mapper function should never get called"
  in
  {
    Ast_mapper.
    structure               = fail;
    structure_item          = fail;
    module_expr             = fail;
    signature               = fail;
    signature_item          = fail;
    module_type             = fail;
    with_constraint         = fail;
    class_declaration       = fail;
    class_expr              = fail;
    class_field             = fail;
    class_structure         = fail;
    class_type              = fail;
    class_type_field        = fail;
    class_signature         = fail;
    class_type_declaration  = fail;
    class_description       = fail;
    type_declaration        = fail;
    type_kind               = fail;
    typ                     = fail;
    type_extension          = fail;
    extension_constructor   = fail;
    value_description       = fail;
    pat                     = fail;
    expr                    = fail;
    module_declaration      = fail;
    module_type_declaration = fail;
    module_binding          = fail;
    open_description        = fail;
    include_description     = fail;
    include_declaration     = fail;
    value_binding           = fail;
    constructor_declaration = fail;
    label_declaration       = fail;
    cases                   = fail;
    case                    = fail;
    location                = fail;
    extension               = fail;
    attribute               = fail;
    attributes              = fail;
    payload                 = fail;
  }

let make_top_mapper ~signature ~structure =
  {failing_mapper with Ast_mapper.
                    signature = (fun _ x -> signature x);
                    structure = (fun _ x -> structure x) }

end
module Ast_403
= struct
#1 "ast_403.ml"
# 1 "src/ast_403.ml"
(**************************************************************************)
(*                                                                        *)
(*                         OCaml Migrate Parsetree                        *)
(*                                                                        *)
(*                             Frédéric Bour                              *)
(*            Jérémie Dimino and Leo White, Jane Street Europe            *)
(*            Xavier Leroy, projet Cristal, INRIA Rocquencourt            *)
(*                         Alain Frisch, LexiFi                           *)
(*       Daniel de Rauglaudre, projet Cristal, INRIA Rocquencourt         *)
(*                                                                        *)
(*   Copyright 2017 Institut National de Recherche en Informatique et     *)
(*     en Automatique (INRIA).                                            *)
(*                                                                        *)
(*   All rights reserved.  This file is distributed under the terms of    *)
(*   the GNU Lesser General Public License version 2.1, with the          *)
(*   special exception on linking described in the file LICENSE.          *)
(*                                                                        *)
(**************************************************************************)

module Location = Location
module Longident = Longident

module Asttypes = struct
  (* Auxiliary a.s.t. types used by parsetree and typedtree. *)

  type constant (*IF_CURRENT = Asttypes.constant *) =
      Const_int of int
    | Const_char of char
    | Const_string of string * string option
    | Const_float of string
    | Const_int32 of int32
    | Const_int64 of int64
    | Const_nativeint of nativeint

  type rec_flag (*IF_CURRENT = Asttypes.rec_flag *) = Nonrecursive | Recursive

  type direction_flag (*IF_CURRENT = Asttypes.direction_flag *) = Upto | Downto

  (* Order matters, used in polymorphic comparison *)
  type private_flag (*IF_CURRENT = Asttypes.private_flag *) = Private | Public

  type mutable_flag (*IF_CURRENT = Asttypes.mutable_flag *) = Immutable | Mutable

  type virtual_flag (*IF_CURRENT = Asttypes.virtual_flag *) = Virtual | Concrete

  type override_flag (*IF_CURRENT = Asttypes.override_flag *) = Override | Fresh

  type closed_flag (*IF_CURRENT = Asttypes.closed_flag *) = Closed | Open

  type label = string

  type arg_label (*IF_CURRENT = Asttypes.arg_label *) =
      Nolabel
    | Labelled of string (*  label:T -> ... *)
    | Optional of string (* ?label:T -> ... *)

  type 'a loc = 'a Location.loc = {
    txt : 'a;
    loc : Location.t;
  }


  type variance (*IF_CURRENT = Asttypes.variance *) =
    | Covariant
    | Contravariant
    | Invariant
end

module Parsetree = struct
  (** Abstract syntax tree produced by parsing *)

  open Asttypes

  type constant (*IF_CURRENT = Parsetree.constant *) =
      Pconst_integer of string * char option
    (* 3 3l 3L 3n

       Suffixes [g-z][G-Z] are accepted by the parser.
       Suffixes except 'l', 'L' and 'n' are rejected by the typechecker
    *)
    | Pconst_char of char
    (* 'c' *)
    | Pconst_string of string * string option
    (* "constant"
       {delim|other constant|delim}
    *)
    | Pconst_float of string * char option
    (* 3.4 2e5 1.4e-4

       Suffixes [g-z][G-Z] are accepted by the parser.
       Suffixes are rejected by the typechecker.
    *)

  (** {2 Extension points} *)

  type attribute = string loc * payload
         (* [@id ARG]
            [@@id ARG]

            Metadata containers passed around within the AST.
            The compiler ignores unknown attributes.
         *)

  and extension = string loc * payload
        (* [%id ARG]
           [%%id ARG]

           Sub-language placeholder -- rejected by the typechecker.
        *)

  and attributes = attribute list

  and payload (*IF_CURRENT = Parsetree.payload *) =
    | PStr of structure
    | PSig of signature (* : SIG *)
    | PTyp of core_type  (* : T *)
    | PPat of pattern * expression option  (* ? P  or  ? P when E *)

  (** {2 Core language} *)

  (* Type expressions *)

  and core_type (*IF_CURRENT = Parsetree.core_type *) =
      {
       ptyp_desc: core_type_desc;
       ptyp_loc: Location.t;
       ptyp_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and core_type_desc (*IF_CURRENT = Parsetree.core_type_desc *) =
    | Ptyp_any
          (*  _ *)
    | Ptyp_var of string
          (* 'a *)
    | Ptyp_arrow of arg_label * core_type * core_type
          (* T1 -> T2       Simple
             ~l:T1 -> T2    Labelled
             ?l:T1 -> T2    Otional
           *)
    | Ptyp_tuple of core_type list
          (* T1 * ... * Tn

             Invariant: n >= 2
          *)
    | Ptyp_constr of Longident.t loc * core_type list
          (* tconstr
             T tconstr
             (T1, ..., Tn) tconstr
           *)
    | Ptyp_object of (string * attributes * core_type) list * closed_flag
          (* < l1:T1; ...; ln:Tn >     (flag = Closed)
             < l1:T1; ...; ln:Tn; .. > (flag = Open)
           *)
    | Ptyp_class of Longident.t loc * core_type list
          (* #tconstr
             T #tconstr
             (T1, ..., Tn) #tconstr
           *)
    | Ptyp_alias of core_type * string
          (* T as 'a *)
    | Ptyp_variant of row_field list * closed_flag * label list option
          (* [ `A|`B ]         (flag = Closed; labels = None)
             [> `A|`B ]        (flag = Open;   labels = None)
             [< `A|`B ]        (flag = Closed; labels = Some [])
             [< `A|`B > `X `Y ](flag = Closed; labels = Some ["X";"Y"])
           *)
    | Ptyp_poly of string list * core_type
          (* 'a1 ... 'an. T

             Can only appear in the following context:

             - As the core_type of a Ppat_constraint node corresponding
               to a constraint on a let-binding: let x : 'a1 ... 'an. T
               = e ...

             - Under Cfk_virtual for methods (not values).

             - As the core_type of a Pctf_method node.

             - As the core_type of a Pexp_poly node.

             - As the pld_type field of a label_declaration.

             - As a core_type of a Ptyp_object node.
           *)

    | Ptyp_package of package_type
          (* (module S) *)
    | Ptyp_extension of extension
          (* [%id] *)

  and package_type = Longident.t loc * (Longident.t loc * core_type) list
        (*
          (module S)
          (module S with type t1 = T1 and ... and tn = Tn)
         *)

  and row_field (*IF_CURRENT = Parsetree.row_field *) =
    | Rtag of label * attributes * bool * core_type list
          (* [`A]                   ( true,  [] )
             [`A of T]              ( false, [T] )
             [`A of T1 & .. & Tn]   ( false, [T1;...Tn] )
             [`A of & T1 & .. & Tn] ( true,  [T1;...Tn] )

            - The 2nd field is true if the tag contains a
              constant (empty) constructor.
            - '&' occurs when several types are used for the same constructor
              (see 4.2 in the manual)

            - TODO: switch to a record representation, and keep location
          *)
    | Rinherit of core_type
          (* [ T ] *)

  (* Patterns *)

  and pattern (*IF_CURRENT = Parsetree.pattern *) =
      {
       ppat_desc: pattern_desc;
       ppat_loc: Location.t;
       ppat_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and pattern_desc (*IF_CURRENT = Parsetree.pattern_desc *) =
    | Ppat_any
          (* _ *)
    | Ppat_var of string loc
          (* x *)
    | Ppat_alias of pattern * string loc
          (* P as 'a *)
    | Ppat_constant of constant
          (* 1, 'a', "true", 1.0, 1l, 1L, 1n *)
    | Ppat_interval of constant * constant
          (* 'a'..'z'

             Other forms of interval are recognized by the parser
             but rejected by the type-checker. *)
    | Ppat_tuple of pattern list
          (* (P1, ..., Pn)

             Invariant: n >= 2
          *)
    | Ppat_construct of Longident.t loc * pattern option
          (* C                None
             C P              Some P
             C (P1, ..., Pn)  Some (Ppat_tuple [P1; ...; Pn])
           *)
    | Ppat_variant of label * pattern option
          (* `A             (None)
             `A P           (Some P)
           *)
    | Ppat_record of (Longident.t loc * pattern) list * closed_flag
          (* { l1=P1; ...; ln=Pn }     (flag = Closed)
             { l1=P1; ...; ln=Pn; _}   (flag = Open)

             Invariant: n > 0
           *)
    | Ppat_array of pattern list
          (* [| P1; ...; Pn |] *)
    | Ppat_or of pattern * pattern
          (* P1 | P2 *)
    | Ppat_constraint of pattern * core_type
          (* (P : T) *)
    | Ppat_type of Longident.t loc
          (* #tconst *)
    | Ppat_lazy of pattern
          (* lazy P *)
    | Ppat_unpack of string loc
          (* (module P)
             Note: (module P : S) is represented as
             Ppat_constraint(Ppat_unpack, Ptyp_package)
           *)
    | Ppat_exception of pattern
          (* exception P *)
    | Ppat_extension of extension
          (* [%id] *)

  (* Value expressions *)

  and expression (*IF_CURRENT = Parsetree.expression *) =
      {
       pexp_desc: expression_desc;
       pexp_loc: Location.t;
       pexp_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and expression_desc (*IF_CURRENT = Parsetree.expression_desc *) =
    | Pexp_ident of Longident.t loc
          (* x
             M.x
           *)
    | Pexp_constant of constant
          (* 1, 'a', "true", 1.0, 1l, 1L, 1n *)
    | Pexp_let of rec_flag * value_binding list * expression
          (* let P1 = E1 and ... and Pn = EN in E       (flag = Nonrecursive)
             let rec P1 = E1 and ... and Pn = EN in E   (flag = Recursive)
           *)
    | Pexp_function of case list
          (* function P1 -> E1 | ... | Pn -> En *)
    | Pexp_fun of arg_label * expression option * pattern * expression
          (* fun P -> E1                          (Simple, None)
             fun ~l:P -> E1                       (Labelled l, None)
             fun ?l:P -> E1                       (Optional l, None)
             fun ?l:(P = E0) -> E1                (Optional l, Some E0)

             Notes:
             - If E0 is provided, only Optional is allowed.
             - "fun P1 P2 .. Pn -> E1" is represented as nested Pexp_fun.
             - "let f P = E" is represented using Pexp_fun.
           *)
    | Pexp_apply of expression * (arg_label * expression) list
          (* E0 ~l1:E1 ... ~ln:En
             li can be empty (non labeled argument) or start with '?'
             (optional argument).

             Invariant: n > 0
           *)
    | Pexp_match of expression * case list
          (* match E0 with P1 -> E1 | ... | Pn -> En *)
    | Pexp_try of expression * case list
          (* try E0 with P1 -> E1 | ... | Pn -> En *)
    | Pexp_tuple of expression list
          (* (E1, ..., En)

             Invariant: n >= 2
          *)
    | Pexp_construct of Longident.t loc * expression option
          (* C                None
             C E              Some E
             C (E1, ..., En)  Some (Pexp_tuple[E1;...;En])
          *)
    | Pexp_variant of label * expression option
          (* `A             (None)
             `A E           (Some E)
           *)
    | Pexp_record of (Longident.t loc * expression) list * expression option
          (* { l1=P1; ...; ln=Pn }     (None)
             { E0 with l1=P1; ...; ln=Pn }   (Some E0)

             Invariant: n > 0
           *)
    | Pexp_field of expression * Longident.t loc
          (* E.l *)
    | Pexp_setfield of expression * Longident.t loc * expression
          (* E1.l <- E2 *)
    | Pexp_array of expression list
          (* [| E1; ...; En |] *)
    | Pexp_ifthenelse of expression * expression * expression option
          (* if E1 then E2 else E3 *)
    | Pexp_sequence of expression * expression
          (* E1; E2 *)
    | Pexp_while of expression * expression
          (* while E1 do E2 done *)
    | Pexp_for of
        pattern *  expression * expression * direction_flag * expression
          (* for i = E1 to E2 do E3 done      (flag = Upto)
             for i = E1 downto E2 do E3 done  (flag = Downto)
           *)
    | Pexp_constraint of expression * core_type
          (* (E : T) *)
    | Pexp_coerce of expression * core_type option * core_type
          (* (E :> T)        (None, T)
             (E : T0 :> T)   (Some T0, T)
           *)
    | Pexp_send of expression * string
          (*  E # m *)
    | Pexp_new of Longident.t loc
          (* new M.c *)
    | Pexp_setinstvar of string loc * expression
          (* x <- 2 *)
    | Pexp_override of (string loc * expression) list
          (* {< x1 = E1; ...; Xn = En >} *)
    | Pexp_letmodule of string loc * module_expr * expression
          (* let module M = ME in E *)
    | Pexp_assert of expression
          (* assert E
             Note: "assert false" is treated in a special way by the
             type-checker. *)
    | Pexp_lazy of expression
          (* lazy E *)
    | Pexp_poly of expression * core_type option
          (* Used for method bodies.

             Can only be used as the expression under Cfk_concrete
             for methods (not values). *)
    | Pexp_object of class_structure
          (* object ... end *)
    | Pexp_newtype of string * expression
          (* fun (type t) -> E *)
    | Pexp_pack of module_expr
          (* (module ME)

             (module ME : S) is represented as
             Pexp_constraint(Pexp_pack, Ptyp_package S) *)
    | Pexp_open of override_flag * Longident.t loc * expression
          (* let open M in E
             let! open M in E
          *)
    | Pexp_extension of extension
          (* [%id] *)
    | Pexp_unreachable
          (* . *)

  and case (*IF_CURRENT = Parsetree.case *) =   (* (P -> E) or (P when E0 -> E) *)
      {
       pc_lhs: pattern;
       pc_guard: expression option;
       pc_rhs: expression;
      }

  (* Value descriptions *)

  and value_description (*IF_CURRENT = Parsetree.value_description *) =
      {
       pval_name: string loc;
       pval_type: core_type;
       pval_prim: string list;
       pval_attributes: attributes;  (* ... [@@id1] [@@id2] *)
       pval_loc: Location.t;
      }

  (*
    val x: T                            (prim = [])
    external x: T = "s1" ... "sn"       (prim = ["s1";..."sn"])
  *)

  (* Type declarations *)

  and type_declaration (*IF_CURRENT = Parsetree.type_declaration *) =
      {
       ptype_name: string loc;
       ptype_params: (core_type * variance) list;
             (* ('a1,...'an) t; None represents  _*)
       ptype_cstrs: (core_type * core_type * Location.t) list;
             (* ... constraint T1=T1'  ... constraint Tn=Tn' *)
       ptype_kind: type_kind;
       ptype_private: private_flag;   (* = private ... *)
       ptype_manifest: core_type option;  (* = T *)
       ptype_attributes: attributes;   (* ... [@@id1] [@@id2] *)
       ptype_loc: Location.t;
      }

  (*
    type t                     (abstract, no manifest)
    type t = T0                (abstract, manifest=T0)
    type t = C of T | ...      (variant,  no manifest)
    type t = T0 = C of T | ... (variant,  manifest=T0)
    type t = {l: T; ...}       (record,   no manifest)
    type t = T0 = {l : T; ...} (record,   manifest=T0)
    type t = ..                (open,     no manifest)
  *)

  and type_kind (*IF_CURRENT = Parsetree.type_kind *) =
    | Ptype_abstract
    | Ptype_variant of constructor_declaration list
          (* Invariant: non-empty list *)
    | Ptype_record of label_declaration list
          (* Invariant: non-empty list *)
    | Ptype_open

  and label_declaration (*IF_CURRENT = Parsetree.label_declaration *) =
      {
       pld_name: string loc;
       pld_mutable: mutable_flag;
       pld_type: core_type;
       pld_loc: Location.t;
       pld_attributes: attributes; (* l [@id1] [@id2] : T *)
      }

  (*  { ...; l: T; ... }            (mutable=Immutable)
      { ...; mutable l: T; ... }    (mutable=Mutable)

      Note: T can be a Ptyp_poly.
  *)

  and constructor_declaration (*IF_CURRENT = Parsetree.constructor_declaration *) =
      {
       pcd_name: string loc;
       pcd_args: constructor_arguments;
       pcd_res: core_type option;
       pcd_loc: Location.t;
       pcd_attributes: attributes; (* C [@id1] [@id2] of ... *)
      }

  and constructor_arguments (*IF_CURRENT = Parsetree.constructor_arguments *) =
    | Pcstr_tuple of core_type list
    | Pcstr_record of label_declaration list

  (*
    | C of T1 * ... * Tn     (res = None,    args = Pcstr_tuple [])
    | C: T0                  (res = Some T0, args = [])
    | C: T1 * ... * Tn -> T0 (res = Some T0, args = Pcstr_tuple)
    | C of {...}             (res = None,    args = Pcstr_record)
    | C: {...} -> T0         (res = Some T0, args = Pcstr_record)
    | C of {...} as t        (res = None,    args = Pcstr_record)
  *)

  and type_extension (*IF_CURRENT = Parsetree.type_extension *) =
      {
       ptyext_path: Longident.t loc;
       ptyext_params: (core_type * variance) list;
       ptyext_constructors: extension_constructor list;
       ptyext_private: private_flag;
       ptyext_attributes: attributes;   (* ... [@@id1] [@@id2] *)
      }
  (*
    type t += ...
  *)

  and extension_constructor (*IF_CURRENT = Parsetree.extension_constructor *) =
      {
       pext_name: string loc;
       pext_kind : extension_constructor_kind;
       pext_loc : Location.t;
       pext_attributes: attributes; (* C [@id1] [@id2] of ... *)
      }

  and extension_constructor_kind (*IF_CURRENT = Parsetree.extension_constructor_kind *) =
      Pext_decl of constructor_arguments * core_type option
        (*
           | C of T1 * ... * Tn     ([T1; ...; Tn], None)
           | C: T0                  ([], Some T0)
           | C: T1 * ... * Tn -> T0 ([T1; ...; Tn], Some T0)
         *)
    | Pext_rebind of Longident.t loc
        (*
           | C = D
         *)

  (** {2 Class language} *)

  (* Type expressions for the class language *)

  and class_type (*IF_CURRENT = Parsetree.class_type *) =
      {
       pcty_desc: class_type_desc;
       pcty_loc: Location.t;
       pcty_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and class_type_desc (*IF_CURRENT = Parsetree.class_type_desc *) =
    | Pcty_constr of Longident.t loc * core_type list
          (* c
             ['a1, ..., 'an] c *)
    | Pcty_signature of class_signature
          (* object ... end *)
    | Pcty_arrow of arg_label * core_type * class_type
          (* T -> CT       Simple
             ~l:T -> CT    Labelled l
             ?l:T -> CT    Optional l
           *)
    | Pcty_extension of extension
          (* [%id] *)

  and class_signature (*IF_CURRENT = Parsetree.class_signature *) =
      {
       pcsig_self: core_type;
       pcsig_fields: class_type_field list;
      }
  (* object('selfpat) ... end
     object ... end             (self = Ptyp_any)
   *)

  and class_type_field (*IF_CURRENT = Parsetree.class_type_field *) =
      {
       pctf_desc: class_type_field_desc;
       pctf_loc: Location.t;
       pctf_attributes: attributes; (* ... [@@id1] [@@id2] *)
      }

  and class_type_field_desc (*IF_CURRENT = Parsetree.class_type_field_desc *) =
    | Pctf_inherit of class_type
          (* inherit CT *)
    | Pctf_val of (string * mutable_flag * virtual_flag * core_type)
          (* val x: T *)
    | Pctf_method  of (string * private_flag * virtual_flag * core_type)
          (* method x: T

             Note: T can be a Ptyp_poly.
           *)
    | Pctf_constraint  of (core_type * core_type)
          (* constraint T1 = T2 *)
    | Pctf_attribute of attribute
          (* [@@@id] *)
    | Pctf_extension of extension
          (* [%%id] *)

  and 'a class_infos (*IF_CURRENT = 'a Parsetree.class_infos *) =
      {
       pci_virt: virtual_flag;
       pci_params: (core_type * variance) list;
       pci_name: string loc;
       pci_expr: 'a;
       pci_loc: Location.t;
       pci_attributes: attributes;  (* ... [@@id1] [@@id2] *)
      }
  (* class c = ...
     class ['a1,...,'an] c = ...
     class virtual c = ...

     Also used for "class type" declaration.
  *)

  and class_description = class_type class_infos

  and class_type_declaration = class_type class_infos

  (* Value expressions for the class language *)

  and class_expr (*IF_CURRENT = Parsetree.class_expr *) =
      {
       pcl_desc: class_expr_desc;
       pcl_loc: Location.t;
       pcl_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and class_expr_desc (*IF_CURRENT = Parsetree.class_expr_desc *) =
    | Pcl_constr of Longident.t loc * core_type list
          (* c
             ['a1, ..., 'an] c *)
    | Pcl_structure of class_structure
          (* object ... end *)
    | Pcl_fun of arg_label * expression option * pattern * class_expr
          (* fun P -> CE                          (Simple, None)
             fun ~l:P -> CE                       (Labelled l, None)
             fun ?l:P -> CE                       (Optional l, None)
             fun ?l:(P = E0) -> CE                (Optional l, Some E0)
           *)
    | Pcl_apply of class_expr * (arg_label * expression) list
          (* CE ~l1:E1 ... ~ln:En
             li can be empty (non labeled argument) or start with '?'
             (optional argument).

             Invariant: n > 0
           *)
    | Pcl_let of rec_flag * value_binding list * class_expr
          (* let P1 = E1 and ... and Pn = EN in CE      (flag = Nonrecursive)
             let rec P1 = E1 and ... and Pn = EN in CE  (flag = Recursive)
           *)
    | Pcl_constraint of class_expr * class_type
          (* (CE : CT) *)
    | Pcl_extension of extension
          (* [%id] *)

  and class_structure (*IF_CURRENT = Parsetree.class_structure *) =
      {
       pcstr_self: pattern;
       pcstr_fields: class_field list;
      }
  (* object(selfpat) ... end
     object ... end           (self = Ppat_any)
   *)

  and class_field (*IF_CURRENT = Parsetree.class_field *) =
      {
       pcf_desc: class_field_desc;
       pcf_loc: Location.t;
       pcf_attributes: attributes; (* ... [@@id1] [@@id2] *)
      }

  and class_field_desc (*IF_CURRENT = Parsetree.class_field_desc *) =
    | Pcf_inherit of override_flag * class_expr * string option
          (* inherit CE
             inherit CE as x
             inherit! CE
             inherit! CE as x
           *)
    | Pcf_val of (string loc * mutable_flag * class_field_kind)
          (* val x = E
             val virtual x: T
           *)
    | Pcf_method of (string loc * private_flag * class_field_kind)
          (* method x = E            (E can be a Pexp_poly)
             method virtual x: T     (T can be a Ptyp_poly)
           *)
    | Pcf_constraint of (core_type * core_type)
          (* constraint T1 = T2 *)
    | Pcf_initializer of expression
          (* initializer E *)
    | Pcf_attribute of attribute
          (* [@@@id] *)
    | Pcf_extension of extension
          (* [%%id] *)

  and class_field_kind (*IF_CURRENT = Parsetree.class_field_kind *) =
    | Cfk_virtual of core_type
    | Cfk_concrete of override_flag * expression

  and class_declaration = class_expr class_infos

  (** {2 Module language} *)

  (* Type expressions for the module language *)

  and module_type (*IF_CURRENT = Parsetree.module_type *) =
      {
       pmty_desc: module_type_desc;
       pmty_loc: Location.t;
       pmty_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and module_type_desc (*IF_CURRENT = Parsetree.module_type_desc *) =
    | Pmty_ident of Longident.t loc
          (* S *)
    | Pmty_signature of signature
          (* sig ... end *)
    | Pmty_functor of string loc * module_type option * module_type
          (* functor(X : MT1) -> MT2 *)
    | Pmty_with of module_type * with_constraint list
          (* MT with ... *)
    | Pmty_typeof of module_expr
          (* module type of ME *)
    | Pmty_extension of extension
          (* [%id] *)
    | Pmty_alias of Longident.t loc
          (* (module M) *)

  and signature = signature_item list

  and signature_item (*IF_CURRENT = Parsetree.signature_item *) =
      {
       psig_desc: signature_item_desc;
       psig_loc: Location.t;
      }

  and signature_item_desc (*IF_CURRENT = Parsetree.signature_item_desc *) =
    | Psig_value of value_description
          (*
            val x: T
            external x: T = "s1" ... "sn"
           *)
    | Psig_type of rec_flag * type_declaration list
          (* type t1 = ... and ... and tn = ... *)
    | Psig_typext of type_extension
          (* type t1 += ... *)
    | Psig_exception of extension_constructor
          (* exception C of T *)
    | Psig_module of module_declaration
          (* module X : MT *)
    | Psig_recmodule of module_declaration list
          (* module rec X1 : MT1 and ... and Xn : MTn *)
    | Psig_modtype of module_type_declaration
          (* module type S = MT
             module type S *)
    | Psig_open of open_description
          (* open X *)
    | Psig_include of include_description
          (* include MT *)
    | Psig_class of class_description list
          (* class c1 : ... and ... and cn : ... *)
    | Psig_class_type of class_type_declaration list
          (* class type ct1 = ... and ... and ctn = ... *)
    | Psig_attribute of attribute
          (* [@@@id] *)
    | Psig_extension of extension * attributes
          (* [%%id] *)

  and module_declaration (*IF_CURRENT = Parsetree.module_declaration *) =
      {
       pmd_name: string loc;
       pmd_type: module_type;
       pmd_attributes: attributes; (* ... [@@id1] [@@id2] *)
       pmd_loc: Location.t;
      }
  (* S : MT *)

  and module_type_declaration (*IF_CURRENT = Parsetree.module_type_declaration *) =
      {
       pmtd_name: string loc;
       pmtd_type: module_type option;
       pmtd_attributes: attributes; (* ... [@@id1] [@@id2] *)
       pmtd_loc: Location.t;
      }
  (* S = MT
     S       (abstract module type declaration, pmtd_type = None)
  *)

  and open_description (*IF_CURRENT = Parsetree.open_description *) =
      {
       popen_lid: Longident.t loc;
       popen_override: override_flag;
       popen_loc: Location.t;
       popen_attributes: attributes;
      }
  (* open! X - popen_override = Override (silences the 'used identifier
                                shadowing' warning)
     open  X - popen_override = Fresh
   *)

  and 'a include_infos (*IF_CURRENT = 'a Parsetree.include_infos *) =
      {
       pincl_mod: 'a;
       pincl_loc: Location.t;
       pincl_attributes: attributes;
      }

  and include_description = module_type include_infos
  (* include MT *)

  and include_declaration = module_expr include_infos
  (* include ME *)

  and with_constraint (*IF_CURRENT = Parsetree.with_constraint *) =
    | Pwith_type of Longident.t loc * type_declaration
          (* with type X.t = ...

             Note: the last component of the longident must match
             the name of the type_declaration. *)
    | Pwith_module of Longident.t loc * Longident.t loc
          (* with module X.Y = Z *)
    | Pwith_typesubst of type_declaration
          (* with type t := ... *)
    | Pwith_modsubst of string loc * Longident.t loc
          (* with module X := Z *)

  (* Value expressions for the module language *)

  and module_expr (*IF_CURRENT = Parsetree.module_expr *) =
      {
       pmod_desc: module_expr_desc;
       pmod_loc: Location.t;
       pmod_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and module_expr_desc (*IF_CURRENT = Parsetree.module_expr_desc *) =
    | Pmod_ident of Longident.t loc
          (* X *)
    | Pmod_structure of structure
          (* struct ... end *)
    | Pmod_functor of string loc * module_type option * module_expr
          (* functor(X : MT1) -> ME *)
    | Pmod_apply of module_expr * module_expr
          (* ME1(ME2) *)
    | Pmod_constraint of module_expr * module_type
          (* (ME : MT) *)
    | Pmod_unpack of expression
          (* (val E) *)
    | Pmod_extension of extension
          (* [%id] *)

  and structure = structure_item list

  and structure_item (*IF_CURRENT = Parsetree.structure_item *) =
      {
       pstr_desc: structure_item_desc;
       pstr_loc: Location.t;
      }

  and structure_item_desc (*IF_CURRENT = Parsetree.structure_item_desc *) =
    | Pstr_eval of expression * attributes
          (* E *)
    | Pstr_value of rec_flag * value_binding list
          (* let P1 = E1 and ... and Pn = EN       (flag = Nonrecursive)
             let rec P1 = E1 and ... and Pn = EN   (flag = Recursive)
           *)
    | Pstr_primitive of value_description
          (*  val x: T
              external x: T = "s1" ... "sn" *)
    | Pstr_type of rec_flag * type_declaration list
          (* type t1 = ... and ... and tn = ... *)
    | Pstr_typext of type_extension
          (* type t1 += ... *)
    | Pstr_exception of extension_constructor
          (* exception C of T
             exception C = M.X *)
    | Pstr_module of module_binding
          (* module X = ME *)
    | Pstr_recmodule of module_binding list
          (* module rec X1 = ME1 and ... and Xn = MEn *)
    | Pstr_modtype of module_type_declaration
          (* module type S = MT *)
    | Pstr_open of open_description
          (* open X *)
    | Pstr_class of class_declaration list
          (* class c1 = ... and ... and cn = ... *)
    | Pstr_class_type of class_type_declaration list
          (* class type ct1 = ... and ... and ctn = ... *)
    | Pstr_include of include_declaration
          (* include ME *)
    | Pstr_attribute of attribute
          (* [@@@id] *)
    | Pstr_extension of extension * attributes
          (* [%%id] *)

  and value_binding (*IF_CURRENT = Parsetree.value_binding *) =
    {
      pvb_pat: pattern;
      pvb_expr: expression;
      pvb_attributes: attributes;
      pvb_loc: Location.t;
    }

  and module_binding (*IF_CURRENT = Parsetree.module_binding *) =
      {
       pmb_name: string loc;
       pmb_expr: module_expr;
       pmb_attributes: attributes;
       pmb_loc: Location.t;
      }
  (* X = ME *)

  (** {2 Toplevel} *)

  (* Toplevel phrases *)

  type toplevel_phrase (*IF_CURRENT = Parsetree.toplevel_phrase *) =
    | Ptop_def of structure
    | Ptop_dir of string * directive_argument
       (* #use, #load ... *)

  and directive_argument (*IF_CURRENT = Parsetree.directive_argument *) =
    | Pdir_none
    | Pdir_string of string
    | Pdir_int of string * char option
    | Pdir_ident of Longident.t
    | Pdir_bool of bool
end

module Docstrings : sig
  (** {3 Docstrings} *)

  (** Documentation comments *)
  type docstring

  (** Create a docstring *)
  val docstring : string -> Location.t -> docstring

  (** Get the text of a docstring *)
  val docstring_body : docstring -> string

  (** Get the location of a docstring *)
  val docstring_loc : docstring -> Location.t

  (** {3 Items}

      The {!docs} type represents documentation attached to an item. *)

  type docs =
    { docs_pre: docstring option;
      docs_post: docstring option; }

  val empty_docs : docs

  val docs_attr : docstring -> Parsetree.attribute

  (** Convert item documentation to attributes and add them to an
      attribute list *)
  val add_docs_attrs : docs -> Parsetree.attributes -> Parsetree.attributes

  (** {3 Fields and constructors}

      The {!info} type represents documentation attached to a field or
      constructor. *)

  type info = docstring option

  val empty_info : info

  val info_attr : docstring -> Parsetree.attribute

  (** Convert field info to attributes and add them to an
      attribute list *)
  val add_info_attrs : info -> Parsetree.attributes -> Parsetree.attributes

  (** {3 Unattached comments}

      The {!text} type represents documentation which is not attached to
      anything. *)

  type text = docstring list

  val empty_text : text

  val text_attr : docstring -> Parsetree.attribute

  (** Convert text to attributes and add them to an attribute list *)
  val add_text_attrs : text -> Parsetree.attributes -> Parsetree.attributes

end = struct
  open Location

  (* Docstrings *)

  type docstring =
    { ds_body: string;
      ds_loc: Location.t; }

  (* Docstring constructors and destructors *)

  let docstring body loc =
    let ds =
      { ds_body = body;
        ds_loc = loc; }
    in
    ds

  let docstring_body ds = ds.ds_body

  let docstring_loc ds = ds.ds_loc

  (* Docstrings attached to items *)

  type docs =
    { docs_pre: docstring option;
      docs_post: docstring option; }

  let empty_docs = { docs_pre = None; docs_post = None }

  let doc_loc = {txt = "ocaml.doc"; loc = Location.none}

  let docs_attr ds =
    let open Parsetree in
    let exp =
      { pexp_desc = Pexp_constant (Pconst_string(ds.ds_body, None));
        pexp_loc = ds.ds_loc;
        pexp_attributes = []; }
    in
    let item =
      { pstr_desc = Pstr_eval (exp, []); pstr_loc = exp.pexp_loc }
    in
      (doc_loc, PStr [item])

  let add_docs_attrs docs attrs =
    let attrs =
      match docs.docs_pre with
      | None | Some { ds_body=""; _ } -> attrs
      | Some ds -> docs_attr ds :: attrs
    in
    let attrs =
      match docs.docs_post with
      | None | Some { ds_body=""; _ } -> attrs
      | Some ds -> attrs @ [docs_attr ds]
    in
    attrs

  (* Docstrings attached to constructors or fields *)

  type info = docstring option

  let empty_info = None

  let info_attr = docs_attr

  let add_info_attrs info attrs =
    match info with
    | None | Some {ds_body=""; _} -> attrs
    | Some ds -> attrs @ [info_attr ds]

  (* Docstrings not attached to a specific item *)

  type text = docstring list

  let empty_text = []

  let text_loc = {txt = "ocaml.text"; loc = Location.none}

  let text_attr ds =
    let open Parsetree in
    let exp =
      { pexp_desc = Pexp_constant (Pconst_string(ds.ds_body, None));
        pexp_loc = ds.ds_loc;
        pexp_attributes = []; }
    in
    let item =
      { pstr_desc = Pstr_eval (exp, []); pstr_loc = exp.pexp_loc }
    in
      (text_loc, PStr [item])

  let add_text_attrs dsl attrs =
    let fdsl = List.filter (function {ds_body=""; _} -> false| _ ->true) dsl in
    (List.map text_attr fdsl) @ attrs

end

module Ast_helper : sig
  (** Helpers to produce Parsetree fragments *)

  open Asttypes
  open Docstrings
  open Parsetree

  type lid = Longident.t loc
  type str = string loc
  type loc = Location.t
  type attrs = attribute list

  (** {2 Default locations} *)

  val default_loc: loc ref
      (** Default value for all optional location arguments. *)

  val with_default_loc: loc -> (unit -> 'a) -> 'a
      (** Set the [default_loc] within the scope of the execution
          of the provided function. *)

  (** {2 Constants} *)

  module Const : sig
    val char : char -> constant
    val string : ?quotation_delimiter:string -> string -> constant
    val integer : ?suffix:char -> string -> constant
    val int : ?suffix:char -> int -> constant
    val int32 : ?suffix:char -> int32 -> constant
    val int64 : ?suffix:char -> int64 -> constant
    val nativeint : ?suffix:char -> nativeint -> constant
    val float : ?suffix:char -> string -> constant
  end

  (** {2 Core language} *)

  (** Type expressions *)
  module Typ :
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> core_type_desc -> core_type
      val attr: core_type -> attribute -> core_type

      val any: ?loc:loc -> ?attrs:attrs -> unit -> core_type
      val var: ?loc:loc -> ?attrs:attrs -> string -> core_type
      val arrow: ?loc:loc -> ?attrs:attrs -> arg_label -> core_type -> core_type
                 -> core_type
      val tuple: ?loc:loc -> ?attrs:attrs -> core_type list -> core_type
      val constr: ?loc:loc -> ?attrs:attrs -> lid -> core_type list -> core_type
      val object_: ?loc:loc -> ?attrs:attrs ->
                    (string * attributes * core_type) list -> closed_flag ->
                    core_type
      val class_: ?loc:loc -> ?attrs:attrs -> lid -> core_type list -> core_type
      val alias: ?loc:loc -> ?attrs:attrs -> core_type -> string -> core_type
      val variant: ?loc:loc -> ?attrs:attrs -> row_field list -> closed_flag
                   -> label list option -> core_type
      val poly: ?loc:loc -> ?attrs:attrs -> string list -> core_type -> core_type
      val package: ?loc:loc -> ?attrs:attrs -> lid -> (lid * core_type) list
                   -> core_type
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> core_type

      val force_poly: core_type -> core_type
    end

  (** Patterns *)
  module Pat:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> pattern_desc -> pattern
      val attr:pattern -> attribute -> pattern

      val any: ?loc:loc -> ?attrs:attrs -> unit -> pattern
      val var: ?loc:loc -> ?attrs:attrs -> str -> pattern
      val alias: ?loc:loc -> ?attrs:attrs -> pattern -> str -> pattern
      val constant: ?loc:loc -> ?attrs:attrs -> constant -> pattern
      val interval: ?loc:loc -> ?attrs:attrs -> constant -> constant -> pattern
      val tuple: ?loc:loc -> ?attrs:attrs -> pattern list -> pattern
      val construct: ?loc:loc -> ?attrs:attrs -> lid -> pattern option -> pattern
      val variant: ?loc:loc -> ?attrs:attrs -> label -> pattern option -> pattern
      val record: ?loc:loc -> ?attrs:attrs -> (lid * pattern) list -> closed_flag
                  -> pattern
      val array: ?loc:loc -> ?attrs:attrs -> pattern list -> pattern
      val or_: ?loc:loc -> ?attrs:attrs -> pattern -> pattern -> pattern
      val constraint_: ?loc:loc -> ?attrs:attrs -> pattern -> core_type -> pattern
      val type_: ?loc:loc -> ?attrs:attrs -> lid -> pattern
      val lazy_: ?loc:loc -> ?attrs:attrs -> pattern -> pattern
      val unpack: ?loc:loc -> ?attrs:attrs -> str -> pattern
      val exception_: ?loc:loc -> ?attrs:attrs -> pattern -> pattern
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> pattern
    end

  (** Expressions *)
  module Exp:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> expression_desc -> expression
      val attr: expression -> attribute -> expression

      val ident: ?loc:loc -> ?attrs:attrs -> lid -> expression
      val constant: ?loc:loc -> ?attrs:attrs -> constant -> expression
      val let_: ?loc:loc -> ?attrs:attrs -> rec_flag -> value_binding list
                -> expression -> expression
      val fun_: ?loc:loc -> ?attrs:attrs -> arg_label -> expression option
                -> pattern -> expression -> expression
      val function_: ?loc:loc -> ?attrs:attrs -> case list -> expression
      val apply: ?loc:loc -> ?attrs:attrs -> expression
                 -> (arg_label * expression) list -> expression
      val match_: ?loc:loc -> ?attrs:attrs -> expression -> case list
                  -> expression
      val try_: ?loc:loc -> ?attrs:attrs -> expression -> case list -> expression
      val tuple: ?loc:loc -> ?attrs:attrs -> expression list -> expression
      val construct: ?loc:loc -> ?attrs:attrs -> lid -> expression option
                     -> expression
      val variant: ?loc:loc -> ?attrs:attrs -> label -> expression option
                   -> expression
      val record: ?loc:loc -> ?attrs:attrs -> (lid * expression) list
                  -> expression option -> expression
      val field: ?loc:loc -> ?attrs:attrs -> expression -> lid -> expression
      val setfield: ?loc:loc -> ?attrs:attrs -> expression -> lid -> expression
                    -> expression
      val array: ?loc:loc -> ?attrs:attrs -> expression list -> expression
      val ifthenelse: ?loc:loc -> ?attrs:attrs -> expression -> expression
                      -> expression option -> expression
      val sequence: ?loc:loc -> ?attrs:attrs -> expression -> expression
                    -> expression
      val while_: ?loc:loc -> ?attrs:attrs -> expression -> expression
                  -> expression
      val for_: ?loc:loc -> ?attrs:attrs -> pattern -> expression -> expression
                -> direction_flag -> expression -> expression
      val coerce: ?loc:loc -> ?attrs:attrs -> expression -> core_type option
                  -> core_type -> expression
      val constraint_: ?loc:loc -> ?attrs:attrs -> expression -> core_type
                       -> expression
      val send: ?loc:loc -> ?attrs:attrs -> expression -> string -> expression
      val new_: ?loc:loc -> ?attrs:attrs -> lid -> expression
      val setinstvar: ?loc:loc -> ?attrs:attrs -> str -> expression -> expression
      val override: ?loc:loc -> ?attrs:attrs -> (str * expression) list
                    -> expression
      val letmodule: ?loc:loc -> ?attrs:attrs -> str -> module_expr -> expression
                     -> expression
      val assert_: ?loc:loc -> ?attrs:attrs -> expression -> expression
      val lazy_: ?loc:loc -> ?attrs:attrs -> expression -> expression
      val poly: ?loc:loc -> ?attrs:attrs -> expression -> core_type option
                -> expression
      val object_: ?loc:loc -> ?attrs:attrs -> class_structure -> expression
      val newtype: ?loc:loc -> ?attrs:attrs -> string -> expression -> expression
      val pack: ?loc:loc -> ?attrs:attrs -> module_expr -> expression
      val open_: ?loc:loc -> ?attrs:attrs -> override_flag -> lid -> expression
                 -> expression
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> expression
      val unreachable: ?loc:loc -> ?attrs:attrs -> unit -> expression

      val case: pattern -> ?guard:expression -> expression -> case
    end

  (** Value declarations *)
  module Val:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs ->
        ?prim:string list -> str -> core_type -> value_description
    end

  (** Type declarations *)
  module Type:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text ->
        ?params:(core_type * variance) list ->
        ?cstrs:(core_type * core_type * loc) list ->
        ?kind:type_kind -> ?priv:private_flag -> ?manifest:core_type -> str ->
        type_declaration

      val constructor: ?loc:loc -> ?attrs:attrs -> ?info:info ->
        ?args:constructor_arguments -> ?res:core_type -> str ->
        constructor_declaration
      val field: ?loc:loc -> ?attrs:attrs -> ?info:info ->
        ?mut:mutable_flag -> str -> core_type -> label_declaration
    end

  (** Type extensions *)
  module Te:
    sig
      val mk: ?attrs:attrs -> ?docs:docs ->
        ?params:(core_type * variance) list -> ?priv:private_flag ->
        lid -> extension_constructor list -> type_extension

      val constructor: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?info:info ->
        str -> extension_constructor_kind -> extension_constructor

      val decl: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?info:info ->
        ?args:constructor_arguments -> ?res:core_type -> str ->
        extension_constructor
      val rebind: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?info:info ->
        str -> lid -> extension_constructor
    end

  (** {2 Module language} *)

  (** Module type expressions *)
  module Mty:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> module_type_desc -> module_type
      val attr: module_type -> attribute -> module_type

      val ident: ?loc:loc -> ?attrs:attrs -> lid -> module_type
      val alias: ?loc:loc -> ?attrs:attrs -> lid -> module_type
      val signature: ?loc:loc -> ?attrs:attrs -> signature -> module_type
      val functor_: ?loc:loc -> ?attrs:attrs ->
        str -> module_type option -> module_type -> module_type
      val with_: ?loc:loc -> ?attrs:attrs -> module_type ->
        with_constraint list -> module_type
      val typeof_: ?loc:loc -> ?attrs:attrs -> module_expr -> module_type
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> module_type
    end

  (** Module expressions *)
  module Mod:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> module_expr_desc -> module_expr
      val attr: module_expr -> attribute -> module_expr

      val ident: ?loc:loc -> ?attrs:attrs -> lid -> module_expr
      val structure: ?loc:loc -> ?attrs:attrs -> structure -> module_expr
      val functor_: ?loc:loc -> ?attrs:attrs ->
        str -> module_type option -> module_expr -> module_expr
      val apply: ?loc:loc -> ?attrs:attrs -> module_expr -> module_expr ->
        module_expr
      val constraint_: ?loc:loc -> ?attrs:attrs -> module_expr -> module_type ->
        module_expr
      val unpack: ?loc:loc -> ?attrs:attrs -> expression -> module_expr
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> module_expr
    end

  (** Signature items *)
  module Sig:
    sig
      val mk: ?loc:loc -> signature_item_desc -> signature_item

      val value: ?loc:loc -> value_description -> signature_item
      val type_: ?loc:loc -> rec_flag -> type_declaration list -> signature_item
      val type_extension: ?loc:loc -> type_extension -> signature_item
      val exception_: ?loc:loc -> extension_constructor -> signature_item
      val module_: ?loc:loc -> module_declaration -> signature_item
      val rec_module: ?loc:loc -> module_declaration list -> signature_item
      val modtype: ?loc:loc -> module_type_declaration -> signature_item
      val open_: ?loc:loc -> open_description -> signature_item
      val include_: ?loc:loc -> include_description -> signature_item
      val class_: ?loc:loc -> class_description list -> signature_item
      val class_type: ?loc:loc -> class_type_declaration list -> signature_item
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> signature_item
      val attribute: ?loc:loc -> attribute -> signature_item
      val text: text -> signature_item list
    end

  (** Structure items *)
  module Str:
    sig
      val mk: ?loc:loc -> structure_item_desc -> structure_item

      val eval: ?loc:loc -> ?attrs:attributes -> expression -> structure_item
      val value: ?loc:loc -> rec_flag -> value_binding list -> structure_item
      val primitive: ?loc:loc -> value_description -> structure_item
      val type_: ?loc:loc -> rec_flag -> type_declaration list -> structure_item
      val type_extension: ?loc:loc -> type_extension -> structure_item
      val exception_: ?loc:loc -> extension_constructor -> structure_item
      val module_: ?loc:loc -> module_binding -> structure_item
      val rec_module: ?loc:loc -> module_binding list -> structure_item
      val modtype: ?loc:loc -> module_type_declaration -> structure_item
      val open_: ?loc:loc -> open_description -> structure_item
      val class_: ?loc:loc -> class_declaration list -> structure_item
      val class_type: ?loc:loc -> class_type_declaration list -> structure_item
      val include_: ?loc:loc -> include_declaration -> structure_item
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> structure_item
      val attribute: ?loc:loc -> attribute -> structure_item
      val text: text -> structure_item list
    end

  (** Module declarations *)
  module Md:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text ->
        str -> module_type -> module_declaration
    end

  (** Module type declarations *)
  module Mtd:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text ->
        ?typ:module_type -> str -> module_type_declaration
    end

  (** Module bindings *)
  module Mb:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text ->
        str -> module_expr -> module_binding
    end

  (* Opens *)
  module Opn:
    sig
      val mk: ?loc: loc -> ?attrs:attrs -> ?docs:docs ->
        ?override:override_flag -> lid -> open_description
    end

  (* Includes *)
  module Incl:
    sig
      val mk: ?loc: loc -> ?attrs:attrs -> ?docs:docs -> 'a -> 'a include_infos
    end

  (** Value bindings *)

  module Vb:
    sig
      val mk: ?loc: loc -> ?attrs:attrs -> ?docs:docs -> ?text:text ->
        pattern -> expression -> value_binding
    end


  (** {2 Class language} *)

  (** Class type expressions *)
  module Cty:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> class_type_desc -> class_type
      val attr: class_type -> attribute -> class_type

      val constr: ?loc:loc -> ?attrs:attrs -> lid -> core_type list -> class_type
      val signature: ?loc:loc -> ?attrs:attrs -> class_signature -> class_type
      val arrow: ?loc:loc -> ?attrs:attrs -> arg_label -> core_type ->
        class_type -> class_type
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> class_type
    end

  (** Class type fields *)
  module Ctf:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs ->
        class_type_field_desc -> class_type_field
      val attr: class_type_field -> attribute -> class_type_field

      val inherit_: ?loc:loc -> ?attrs:attrs -> class_type -> class_type_field
      val val_: ?loc:loc -> ?attrs:attrs -> string -> mutable_flag ->
        virtual_flag -> core_type -> class_type_field
      val method_: ?loc:loc -> ?attrs:attrs -> string -> private_flag ->
        virtual_flag -> core_type -> class_type_field
      val constraint_: ?loc:loc -> ?attrs:attrs -> core_type -> core_type ->
        class_type_field
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> class_type_field
      val attribute: ?loc:loc -> attribute -> class_type_field
      val text: text -> class_type_field list
    end

  (** Class expressions *)
  module Cl:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> class_expr_desc -> class_expr
      val attr: class_expr -> attribute -> class_expr

      val constr: ?loc:loc -> ?attrs:attrs -> lid -> core_type list -> class_expr
      val structure: ?loc:loc -> ?attrs:attrs -> class_structure -> class_expr
      val fun_: ?loc:loc -> ?attrs:attrs -> arg_label -> expression option ->
        pattern -> class_expr -> class_expr
      val apply: ?loc:loc -> ?attrs:attrs -> class_expr ->
        (arg_label * expression) list -> class_expr
      val let_: ?loc:loc -> ?attrs:attrs -> rec_flag -> value_binding list ->
        class_expr -> class_expr
      val constraint_: ?loc:loc -> ?attrs:attrs -> class_expr -> class_type ->
        class_expr
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> class_expr
    end

  (** Class fields *)
  module Cf:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> class_field_desc ->
        class_field
      val attr: class_field -> attribute -> class_field

      val inherit_: ?loc:loc -> ?attrs:attrs -> override_flag -> class_expr ->
        string option -> class_field
      val val_: ?loc:loc -> ?attrs:attrs -> str -> mutable_flag ->
        class_field_kind -> class_field
      val method_: ?loc:loc -> ?attrs:attrs -> str -> private_flag ->
        class_field_kind -> class_field
      val constraint_: ?loc:loc -> ?attrs:attrs -> core_type -> core_type ->
        class_field
      val initializer_: ?loc:loc -> ?attrs:attrs -> expression -> class_field
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> class_field
      val attribute: ?loc:loc -> attribute -> class_field
      val text: text -> class_field list

      val virtual_: core_type -> class_field_kind
      val concrete: override_flag -> expression -> class_field_kind

    end

  (** Classes *)
  module Ci:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text ->
        ?virt:virtual_flag -> ?params:(core_type * variance) list ->
        str -> 'a -> 'a class_infos
    end

  (** Class signatures *)
  module Csig:
    sig
      val mk: core_type -> class_type_field list -> class_signature
    end

  (** Class structures *)
  module Cstr:
    sig
      val mk: pattern -> class_field list -> class_structure
    end

end = struct
  (** Helpers to produce Parsetree fragments *)

  open Asttypes
  open Parsetree
  open Docstrings

  type lid = Longident.t loc
  type str = string loc
  type loc = Location.t
  type attrs = attribute list

  let default_loc = ref Location.none

  let with_default_loc l f =
    let old = !default_loc in
    default_loc := l;
    try let r = f () in default_loc := old; r
    with exn -> default_loc := old; raise exn

  module Const = struct
    let integer ?suffix i = Pconst_integer (i, suffix)
    let int ?suffix i = integer ?suffix (string_of_int i)
    let int32 ?(suffix='l') i = integer ~suffix (Int32.to_string i)
    let int64 ?(suffix='L') i = integer ~suffix (Int64.to_string i)
    let nativeint ?(suffix='n') i = integer ~suffix (Nativeint.to_string i)
    let float ?suffix f = Pconst_float (f, suffix)
    let char c = Pconst_char c
    let string ?quotation_delimiter s = Pconst_string (s, quotation_delimiter)
  end

  module Typ = struct
    let mk ?(loc = !default_loc) ?(attrs = []) d =
      {ptyp_desc = d; ptyp_loc = loc; ptyp_attributes = attrs}
    let attr d a = {d with ptyp_attributes = d.ptyp_attributes @ [a]}

    let any ?loc ?attrs () = mk ?loc ?attrs Ptyp_any
    let var ?loc ?attrs a = mk ?loc ?attrs (Ptyp_var a)
    let arrow ?loc ?attrs a b c = mk ?loc ?attrs (Ptyp_arrow (a, b, c))
    let tuple ?loc ?attrs a = mk ?loc ?attrs (Ptyp_tuple a)
    let constr ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_constr (a, b))
    let object_ ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_object (a, b))
    let class_ ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_class (a, b))
    let alias ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_alias (a, b))
    let variant ?loc ?attrs a b c = mk ?loc ?attrs (Ptyp_variant (a, b, c))
    let poly ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_poly (a, b))
    let package ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_package (a, b))
    let extension ?loc ?attrs a = mk ?loc ?attrs (Ptyp_extension a)

    let force_poly t =
      match t.ptyp_desc with
      | Ptyp_poly _ -> t
      | _ -> poly ~loc:t.ptyp_loc [] t (* -> ghost? *)
  end

  module Pat = struct
    let mk ?(loc = !default_loc) ?(attrs = []) d =
      {ppat_desc = d; ppat_loc = loc; ppat_attributes = attrs}
    let attr d a = {d with ppat_attributes = d.ppat_attributes @ [a]}

    let any ?loc ?attrs () = mk ?loc ?attrs Ppat_any
    let var ?loc ?attrs a = mk ?loc ?attrs (Ppat_var a)
    let alias ?loc ?attrs a b = mk ?loc ?attrs (Ppat_alias (a, b))
    let constant ?loc ?attrs a = mk ?loc ?attrs (Ppat_constant a)
    let interval ?loc ?attrs a b = mk ?loc ?attrs (Ppat_interval (a, b))
    let tuple ?loc ?attrs a = mk ?loc ?attrs (Ppat_tuple a)
    let construct ?loc ?attrs a b = mk ?loc ?attrs (Ppat_construct (a, b))
    let variant ?loc ?attrs a b = mk ?loc ?attrs (Ppat_variant (a, b))
    let record ?loc ?attrs a b = mk ?loc ?attrs (Ppat_record (a, b))
    let array ?loc ?attrs a = mk ?loc ?attrs (Ppat_array a)
    let or_ ?loc ?attrs a b = mk ?loc ?attrs (Ppat_or (a, b))
    let constraint_ ?loc ?attrs a b = mk ?loc ?attrs (Ppat_constraint (a, b))
    let type_ ?loc ?attrs a = mk ?loc ?attrs (Ppat_type a)
    let lazy_ ?loc ?attrs a = mk ?loc ?attrs (Ppat_lazy a)
    let unpack ?loc ?attrs a = mk ?loc ?attrs (Ppat_unpack a)
    let exception_ ?loc ?attrs a = mk ?loc ?attrs (Ppat_exception a)
    let extension ?loc ?attrs a = mk ?loc ?attrs (Ppat_extension a)
  end

  module Exp = struct
    let mk ?(loc = !default_loc) ?(attrs = []) d =
      {pexp_desc = d; pexp_loc = loc; pexp_attributes = attrs}
    let attr d a = {d with pexp_attributes = d.pexp_attributes @ [a]}

    let ident ?loc ?attrs a = mk ?loc ?attrs (Pexp_ident a)
    let constant ?loc ?attrs a = mk ?loc ?attrs (Pexp_constant a)
    let let_ ?loc ?attrs a b c = mk ?loc ?attrs (Pexp_let (a, b, c))
    let fun_ ?loc ?attrs a b c d = mk ?loc ?attrs (Pexp_fun (a, b, c, d))
    let function_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_function a)
    let apply ?loc ?attrs a b = mk ?loc ?attrs (Pexp_apply (a, b))
    let match_ ?loc ?attrs a b = mk ?loc ?attrs (Pexp_match (a, b))
    let try_ ?loc ?attrs a b = mk ?loc ?attrs (Pexp_try (a, b))
    let tuple ?loc ?attrs a = mk ?loc ?attrs (Pexp_tuple a)
    let construct ?loc ?attrs a b = mk ?loc ?attrs (Pexp_construct (a, b))
    let variant ?loc ?attrs a b = mk ?loc ?attrs (Pexp_variant (a, b))
    let record ?loc ?attrs a b = mk ?loc ?attrs (Pexp_record (a, b))
    let field ?loc ?attrs a b = mk ?loc ?attrs (Pexp_field (a, b))
    let setfield ?loc ?attrs a b c = mk ?loc ?attrs (Pexp_setfield (a, b, c))
    let array ?loc ?attrs a = mk ?loc ?attrs (Pexp_array a)
    let ifthenelse ?loc ?attrs a b c = mk ?loc ?attrs (Pexp_ifthenelse (a, b, c))
    let sequence ?loc ?attrs a b = mk ?loc ?attrs (Pexp_sequence (a, b))
    let while_ ?loc ?attrs a b = mk ?loc ?attrs (Pexp_while (a, b))
    let for_ ?loc ?attrs a b c d e = mk ?loc ?attrs (Pexp_for (a, b, c, d, e))
    let constraint_ ?loc ?attrs a b = mk ?loc ?attrs (Pexp_constraint (a, b))
    let coerce ?loc ?attrs a b c = mk ?loc ?attrs (Pexp_coerce (a, b, c))
    let send ?loc ?attrs a b = mk ?loc ?attrs (Pexp_send (a, b))
    let new_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_new a)
    let setinstvar ?loc ?attrs a b = mk ?loc ?attrs (Pexp_setinstvar (a, b))
    let override ?loc ?attrs a = mk ?loc ?attrs (Pexp_override a)
    let letmodule ?loc ?attrs a b c= mk ?loc ?attrs (Pexp_letmodule (a, b, c))
    let assert_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_assert a)
    let lazy_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_lazy a)
    let poly ?loc ?attrs a b = mk ?loc ?attrs (Pexp_poly (a, b))
    let object_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_object a)
    let newtype ?loc ?attrs a b = mk ?loc ?attrs (Pexp_newtype (a, b))
    let pack ?loc ?attrs a = mk ?loc ?attrs (Pexp_pack a)
    let open_ ?loc ?attrs a b c = mk ?loc ?attrs (Pexp_open (a, b, c))
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pexp_extension a)
    let unreachable ?loc ?attrs () = mk ?loc ?attrs Pexp_unreachable

    let case lhs ?guard rhs =
      {
       pc_lhs = lhs;
       pc_guard = guard;
       pc_rhs = rhs;
      }
  end

  module Mty = struct
    let mk ?(loc = !default_loc) ?(attrs = []) d =
      {pmty_desc = d; pmty_loc = loc; pmty_attributes = attrs}
    let attr d a = {d with pmty_attributes = d.pmty_attributes @ [a]}

    let ident ?loc ?attrs a = mk ?loc ?attrs (Pmty_ident a)
    let alias ?loc ?attrs a = mk ?loc ?attrs (Pmty_alias a)
    let signature ?loc ?attrs a = mk ?loc ?attrs (Pmty_signature a)
    let functor_ ?loc ?attrs a b c = mk ?loc ?attrs (Pmty_functor (a, b, c))
    let with_ ?loc ?attrs a b = mk ?loc ?attrs (Pmty_with (a, b))
    let typeof_ ?loc ?attrs a = mk ?loc ?attrs (Pmty_typeof a)
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pmty_extension a)
  end

  module Mod = struct
  let mk ?(loc = !default_loc) ?(attrs = []) d =
    {pmod_desc = d; pmod_loc = loc; pmod_attributes = attrs}
    let attr d a = {d with pmod_attributes = d.pmod_attributes @ [a]}

    let ident ?loc ?attrs x = mk ?loc ?attrs (Pmod_ident x)
    let structure ?loc ?attrs x = mk ?loc ?attrs (Pmod_structure x)
    let functor_ ?loc ?attrs arg arg_ty body =
      mk ?loc ?attrs (Pmod_functor (arg, arg_ty, body))
    let apply ?loc ?attrs m1 m2 = mk ?loc ?attrs (Pmod_apply (m1, m2))
    let constraint_ ?loc ?attrs m mty = mk ?loc ?attrs (Pmod_constraint (m, mty))
    let unpack ?loc ?attrs e = mk ?loc ?attrs (Pmod_unpack e)
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pmod_extension a)
  end

  module Sig = struct
    let mk ?(loc = !default_loc) d = {psig_desc = d; psig_loc = loc}

    let value ?loc a = mk ?loc (Psig_value a)
    let type_ ?loc rec_flag a = mk ?loc (Psig_type (rec_flag, a))
    let type_extension ?loc a = mk ?loc (Psig_typext a)
    let exception_ ?loc a = mk ?loc (Psig_exception a)
    let module_ ?loc a = mk ?loc (Psig_module a)
    let rec_module ?loc a = mk ?loc (Psig_recmodule a)
    let modtype ?loc a = mk ?loc (Psig_modtype a)
    let open_ ?loc a = mk ?loc (Psig_open a)
    let include_ ?loc a = mk ?loc (Psig_include a)
    let class_ ?loc a = mk ?loc (Psig_class a)
    let class_type ?loc a = mk ?loc (Psig_class_type a)
    let extension ?loc ?(attrs = []) a = mk ?loc (Psig_extension (a, attrs))
    let attribute ?loc a = mk ?loc (Psig_attribute a)
    let text txt =
      List.map
        (fun ds -> attribute ~loc:(docstring_loc ds) (text_attr ds))
        txt
  end

  module Str = struct
    let mk ?(loc = !default_loc) d = {pstr_desc = d; pstr_loc = loc}

    let eval ?loc ?(attrs = []) a = mk ?loc (Pstr_eval (a, attrs))
    let value ?loc a b = mk ?loc (Pstr_value (a, b))
    let primitive ?loc a = mk ?loc (Pstr_primitive a)
    let type_ ?loc rec_flag a = mk ?loc (Pstr_type (rec_flag, a))
    let type_extension ?loc a = mk ?loc (Pstr_typext a)
    let exception_ ?loc a = mk ?loc (Pstr_exception a)
    let module_ ?loc a = mk ?loc (Pstr_module a)
    let rec_module ?loc a = mk ?loc (Pstr_recmodule a)
    let modtype ?loc a = mk ?loc (Pstr_modtype a)
    let open_ ?loc a = mk ?loc (Pstr_open a)
    let class_ ?loc a = mk ?loc (Pstr_class a)
    let class_type ?loc a = mk ?loc (Pstr_class_type a)
    let include_ ?loc a = mk ?loc (Pstr_include a)
    let extension ?loc ?(attrs = []) a = mk ?loc (Pstr_extension (a, attrs))
    let attribute ?loc a = mk ?loc (Pstr_attribute a)
    let text txt =
      List.map
        (fun ds -> attribute ~loc:(docstring_loc ds) (text_attr ds))
        txt
  end

  module Cl = struct
    let mk ?(loc = !default_loc) ?(attrs = []) d =
      {
       pcl_desc = d;
       pcl_loc = loc;
       pcl_attributes = attrs;
      }
    let attr d a = {d with pcl_attributes = d.pcl_attributes @ [a]}

    let constr ?loc ?attrs a b = mk ?loc ?attrs (Pcl_constr (a, b))
    let structure ?loc ?attrs a = mk ?loc ?attrs (Pcl_structure a)
    let fun_ ?loc ?attrs a b c d = mk ?loc ?attrs (Pcl_fun (a, b, c, d))
    let apply ?loc ?attrs a b = mk ?loc ?attrs (Pcl_apply (a, b))
    let let_ ?loc ?attrs a b c = mk ?loc ?attrs (Pcl_let (a, b, c))
    let constraint_ ?loc ?attrs a b = mk ?loc ?attrs (Pcl_constraint (a, b))
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pcl_extension a)
  end

  module Cty = struct
    let mk ?(loc = !default_loc) ?(attrs = []) d =
      {
       pcty_desc = d;
       pcty_loc = loc;
       pcty_attributes = attrs;
      }
    let attr d a = {d with pcty_attributes = d.pcty_attributes @ [a]}

    let constr ?loc ?attrs a b = mk ?loc ?attrs (Pcty_constr (a, b))
    let signature ?loc ?attrs a = mk ?loc ?attrs (Pcty_signature a)
    let arrow ?loc ?attrs a b c = mk ?loc ?attrs (Pcty_arrow (a, b, c))
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pcty_extension a)
  end

  module Ctf = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
             ?(docs = empty_docs) d =
      {
       pctf_desc = d;
       pctf_loc = loc;
       pctf_attributes = add_docs_attrs docs attrs;
      }

    let inherit_ ?loc ?attrs a = mk ?loc ?attrs (Pctf_inherit a)
    let val_ ?loc ?attrs a b c d = mk ?loc ?attrs (Pctf_val (a, b, c, d))
    let method_ ?loc ?attrs a b c d = mk ?loc ?attrs (Pctf_method (a, b, c, d))
    let constraint_ ?loc ?attrs a b = mk ?loc ?attrs (Pctf_constraint (a, b))
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pctf_extension a)
    let attribute ?loc a = mk ?loc (Pctf_attribute a)
    let text txt =
      List.map
        (fun ds -> attribute ~loc:(docstring_loc ds) (text_attr ds))
        txt

    let attr d a = {d with pctf_attributes = d.pctf_attributes @ [a]}

  end

  module Cf = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) d =
      {
       pcf_desc = d;
       pcf_loc = loc;
       pcf_attributes = add_docs_attrs docs attrs;
      }

    let inherit_ ?loc ?attrs a b c = mk ?loc ?attrs (Pcf_inherit (a, b, c))
    let val_ ?loc ?attrs a b c = mk ?loc ?attrs (Pcf_val (a, b, c))
    let method_ ?loc ?attrs a b c = mk ?loc ?attrs (Pcf_method (a, b, c))
    let constraint_ ?loc ?attrs a b = mk ?loc ?attrs (Pcf_constraint (a, b))
    let initializer_ ?loc ?attrs a = mk ?loc ?attrs (Pcf_initializer a)
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pcf_extension a)
    let attribute ?loc a = mk ?loc (Pcf_attribute a)
    let text txt =
      List.map
        (fun ds -> attribute ~loc:(docstring_loc ds) (text_attr ds))
        txt

    let virtual_ ct = Cfk_virtual ct
    let concrete o e = Cfk_concrete (o, e)

    let attr d a = {d with pcf_attributes = d.pcf_attributes @ [a]}

  end

  module Val = struct
    let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs)
          ?(prim = []) name typ =
      {
       pval_name = name;
       pval_type = typ;
       pval_attributes = add_docs_attrs docs attrs;
       pval_loc = loc;
       pval_prim = prim;
      }
  end

  module Md = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(text = []) name typ =
      {
       pmd_name = name;
       pmd_type = typ;
       pmd_attributes =
         add_text_attrs text (add_docs_attrs docs attrs);
       pmd_loc = loc;
      }
  end

  module Mtd = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(text = []) ?typ name =
      {
       pmtd_name = name;
       pmtd_type = typ;
       pmtd_attributes =
         add_text_attrs text (add_docs_attrs docs attrs);
       pmtd_loc = loc;
      }
  end

  module Mb = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(text = []) name expr =
      {
       pmb_name = name;
       pmb_expr = expr;
       pmb_attributes =
         add_text_attrs text (add_docs_attrs docs attrs);
       pmb_loc = loc;
      }
  end

  module Opn = struct
    let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs)
          ?(override = Fresh) lid =
      {
       popen_lid = lid;
       popen_override = override;
       popen_loc = loc;
       popen_attributes = add_docs_attrs docs attrs;
      }
  end

  module Incl = struct
    let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs) mexpr =
      {
       pincl_mod = mexpr;
       pincl_loc = loc;
       pincl_attributes = add_docs_attrs docs attrs;
      }

  end

  module Vb = struct
    let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs)
          ?(text = []) pat expr =
      {
       pvb_pat = pat;
       pvb_expr = expr;
       pvb_attributes =
         add_text_attrs text (add_docs_attrs docs attrs);
       pvb_loc = loc;
      }
  end

  module Ci = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(text = [])
          ?(virt = Concrete) ?(params = []) name expr =
      {
       pci_virt = virt;
       pci_params = params;
       pci_name = name;
       pci_expr = expr;
       pci_attributes =
         add_text_attrs text (add_docs_attrs docs attrs);
       pci_loc = loc;
      }
  end

  module Type = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(text = [])
        ?(params = [])
        ?(cstrs = [])
        ?(kind = Ptype_abstract)
        ?(priv = Public)
        ?manifest
        name =
      {
       ptype_name = name;
       ptype_params = params;
       ptype_cstrs = cstrs;
       ptype_kind = kind;
       ptype_private = priv;
       ptype_manifest = manifest;
       ptype_attributes =
         add_text_attrs text (add_docs_attrs docs attrs);
       ptype_loc = loc;
      }

    let constructor ?(loc = !default_loc) ?(attrs = []) ?(info = empty_info)
          ?(args = Pcstr_tuple []) ?res name =
      {
       pcd_name = name;
       pcd_args = args;
       pcd_res = res;
       pcd_loc = loc;
       pcd_attributes = add_info_attrs info attrs;
      }

    let field ?(loc = !default_loc) ?(attrs = []) ?(info = empty_info)
          ?(mut = Immutable) name typ =
      {
       pld_name = name;
       pld_mutable = mut;
       pld_type = typ;
       pld_loc = loc;
       pld_attributes = add_info_attrs info attrs;
      }

  end

  (** Type extensions *)
  module Te = struct
    let mk ?(attrs = []) ?(docs = empty_docs)
          ?(params = []) ?(priv = Public) path constructors =
      {
       ptyext_path = path;
       ptyext_params = params;
       ptyext_constructors = constructors;
       ptyext_private = priv;
       ptyext_attributes = add_docs_attrs docs attrs;
      }

    let constructor ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(info = empty_info) name kind =
      {
       pext_name = name;
       pext_kind = kind;
       pext_loc = loc;
       pext_attributes = add_docs_attrs docs (add_info_attrs info attrs);
      }

    let decl ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs)
               ?(info = empty_info) ?(args = Pcstr_tuple []) ?res name =
      {
       pext_name = name;
       pext_kind = Pext_decl(args, res);
       pext_loc = loc;
       pext_attributes = add_docs_attrs docs (add_info_attrs info attrs);
      }

    let rebind ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(info = empty_info) name lid =
      {
       pext_name = name;
       pext_kind = Pext_rebind lid;
       pext_loc = loc;
       pext_attributes = add_docs_attrs docs (add_info_attrs info attrs);
      }

  end

  module Csig = struct
    let mk self fields =
      {
       pcsig_self = self;
       pcsig_fields = fields;
      }
  end

  module Cstr = struct
    let mk self fields =
      {
       pcstr_self = self;
       pcstr_fields = fields;
      }
  end

end

module Ast_mapper : sig
  (** The interface of a -ppx rewriter

    A -ppx rewriter is a program that accepts a serialized abstract syntax
    tree and outputs another, possibly modified, abstract syntax tree.
    This module encapsulates the interface between the compiler and
    the -ppx rewriters, handling such details as the serialization format,
    forwarding of command-line flags, and storing state.

    {!mapper} allows to implement AST rewriting using open recursion.
    A typical mapper would be based on {!default_mapper}, a deep
    identity mapper, and will fall back on it for handling the syntax it
    does not modify. For example:

    {[
  open Asttypes
  open Parsetree
  open Ast_mapper

  let test_mapper argv =
    { default_mapper with
      expr = fun mapper expr ->
        match expr with
        | { pexp_desc = Pexp_extension ({ txt = "test" }, PStr [])} ->
          Ast_helper.Exp.constant (Const_int 42)
        | other -> default_mapper.expr mapper other; }

  let () =
    register "ppx_test" test_mapper]}

    This -ppx rewriter, which replaces [[%test]] in expressions with
    the constant [42], can be compiled using
    [ocamlc -o ppx_test -I +compiler-libs ocamlcommon.cma ppx_test.ml].

    *)

  open Parsetree

  (** {2 A generic Parsetree mapper} *)

  type mapper (*IF_CURRENT = Ast_mapper.mapper*) = {
    attribute: mapper -> attribute -> attribute;
    attributes: mapper -> attribute list -> attribute list;
    case: mapper -> case -> case;
    cases: mapper -> case list -> case list;
    class_declaration: mapper -> class_declaration -> class_declaration;
    class_description: mapper -> class_description -> class_description;
    class_expr: mapper -> class_expr -> class_expr;
    class_field: mapper -> class_field -> class_field;
    class_signature: mapper -> class_signature -> class_signature;
    class_structure: mapper -> class_structure -> class_structure;
    class_type: mapper -> class_type -> class_type;
    class_type_declaration: mapper -> class_type_declaration
                            -> class_type_declaration;
    class_type_field: mapper -> class_type_field -> class_type_field;
    constructor_declaration: mapper -> constructor_declaration
                             -> constructor_declaration;
    expr: mapper -> expression -> expression;
    extension: mapper -> extension -> extension;
    extension_constructor: mapper -> extension_constructor
                           -> extension_constructor;
    include_declaration: mapper -> include_declaration -> include_declaration;
    include_description: mapper -> include_description -> include_description;
    label_declaration: mapper -> label_declaration -> label_declaration;
    location: mapper -> Location.t -> Location.t;
    module_binding: mapper -> module_binding -> module_binding;
    module_declaration: mapper -> module_declaration -> module_declaration;
    module_expr: mapper -> module_expr -> module_expr;
    module_type: mapper -> module_type -> module_type;
    module_type_declaration: mapper -> module_type_declaration
                             -> module_type_declaration;
    open_description: mapper -> open_description -> open_description;
    pat: mapper -> pattern -> pattern;
    payload: mapper -> payload -> payload;
    signature: mapper -> signature -> signature;
    signature_item: mapper -> signature_item -> signature_item;
    structure: mapper -> structure -> structure;
    structure_item: mapper -> structure_item -> structure_item;
    typ: mapper -> core_type -> core_type;
    type_declaration: mapper -> type_declaration -> type_declaration;
    type_extension: mapper -> type_extension -> type_extension;
    type_kind: mapper -> type_kind -> type_kind;
    value_binding: mapper -> value_binding -> value_binding;
    value_description: mapper -> value_description -> value_description;
    with_constraint: mapper -> with_constraint -> with_constraint;
  }
  (** A mapper record implements one "method" per syntactic category,
      using an open recursion style: each method takes as its first
      argument the mapper to be applied to children in the syntax
      tree. *)

  val default_mapper: mapper
  (** A default mapper, which implements a "deep identity" mapping. *)

  (** {2 Convenience functions to write mappers} *)

  val map_opt: ('a -> 'b) -> 'a option -> 'b option

  val extension_of_error: Location.error -> extension
  (** Encode an error into an 'ocaml.error' extension node which can be
      inserted in a generated Parsetree.  The compiler will be
      responsible for reporting the error. *)

  val attribute_of_warning: Location.t -> string -> attribute
  (** Encode a warning message into an 'ocaml.ppwarning' attribute which can be
      inserted in a generated Parsetree.  The compiler will be
      responsible for reporting the warning. *)

end = struct
  (* A generic Parsetree mapping class *)

  (*
  [@@@ocaml.warning "+9"]
    (* Ensure that record patterns don't miss any field. *)
  *)


  open Parsetree
  open Ast_helper
  open Location

  type mapper (*IF_CURRENT = Ast_mapper.mapper*) = {
    attribute: mapper -> attribute -> attribute;
    attributes: mapper -> attribute list -> attribute list;
    case: mapper -> case -> case;
    cases: mapper -> case list -> case list;
    class_declaration: mapper -> class_declaration -> class_declaration;
    class_description: mapper -> class_description -> class_description;
    class_expr: mapper -> class_expr -> class_expr;
    class_field: mapper -> class_field -> class_field;
    class_signature: mapper -> class_signature -> class_signature;
    class_structure: mapper -> class_structure -> class_structure;
    class_type: mapper -> class_type -> class_type;
    class_type_declaration: mapper -> class_type_declaration
                            -> class_type_declaration;
    class_type_field: mapper -> class_type_field -> class_type_field;
    constructor_declaration: mapper -> constructor_declaration
                             -> constructor_declaration;
    expr: mapper -> expression -> expression;
    extension: mapper -> extension -> extension;
    extension_constructor: mapper -> extension_constructor
                           -> extension_constructor;
    include_declaration: mapper -> include_declaration -> include_declaration;
    include_description: mapper -> include_description -> include_description;
    label_declaration: mapper -> label_declaration -> label_declaration;
    location: mapper -> Location.t -> Location.t;
    module_binding: mapper -> module_binding -> module_binding;
    module_declaration: mapper -> module_declaration -> module_declaration;
    module_expr: mapper -> module_expr -> module_expr;
    module_type: mapper -> module_type -> module_type;
    module_type_declaration: mapper -> module_type_declaration
                             -> module_type_declaration;
    open_description: mapper -> open_description -> open_description;
    pat: mapper -> pattern -> pattern;
    payload: mapper -> payload -> payload;
    signature: mapper -> signature -> signature;
    signature_item: mapper -> signature_item -> signature_item;
    structure: mapper -> structure -> structure;
    structure_item: mapper -> structure_item -> structure_item;
    typ: mapper -> core_type -> core_type;
    type_declaration: mapper -> type_declaration -> type_declaration;
    type_extension: mapper -> type_extension -> type_extension;
    type_kind: mapper -> type_kind -> type_kind;
    value_binding: mapper -> value_binding -> value_binding;
    value_description: mapper -> value_description -> value_description;
    with_constraint: mapper -> with_constraint -> with_constraint;
  }

  let map_fst f (x, y) = (f x, y)
  let map_snd f (x, y) = (x, f y)
  let map_tuple f1 f2 (x, y) = (f1 x, f2 y)
  let map_tuple3 f1 f2 f3 (x, y, z) = (f1 x, f2 y, f3 z)
  let map_opt f = function None -> None | Some x -> Some (f x)

  let map_loc sub {loc; txt} = {loc = sub.location sub loc; txt}

  module T = struct
    (* Type expressions for the core language *)

    let row_field sub = function
      | Rtag (l, attrs, b, tl) ->
          Rtag (l, sub.attributes sub attrs, b, List.map (sub.typ sub) tl)
      | Rinherit t -> Rinherit (sub.typ sub t)

    let map sub {ptyp_desc = desc; ptyp_loc = loc; ptyp_attributes = attrs} =
      let open Typ in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Ptyp_any -> any ~loc ~attrs ()
      | Ptyp_var s -> var ~loc ~attrs s
      | Ptyp_arrow (lab, t1, t2) ->
          arrow ~loc ~attrs lab (sub.typ sub t1) (sub.typ sub t2)
      | Ptyp_tuple tyl -> tuple ~loc ~attrs (List.map (sub.typ sub) tyl)
      | Ptyp_constr (lid, tl) ->
          constr ~loc ~attrs (map_loc sub lid) (List.map (sub.typ sub) tl)
      | Ptyp_object (l, o) ->
          let f (s, a, t) = (s, sub.attributes sub a, sub.typ sub t) in
          object_ ~loc ~attrs (List.map f l) o
      | Ptyp_class (lid, tl) ->
          class_ ~loc ~attrs (map_loc sub lid) (List.map (sub.typ sub) tl)
      | Ptyp_alias (t, s) -> alias ~loc ~attrs (sub.typ sub t) s
      | Ptyp_variant (rl, b, ll) ->
          variant ~loc ~attrs (List.map (row_field sub) rl) b ll
      | Ptyp_poly (sl, t) -> poly ~loc ~attrs sl (sub.typ sub t)
      | Ptyp_package (lid, l) ->
          package ~loc ~attrs (map_loc sub lid)
            (List.map (map_tuple (map_loc sub) (sub.typ sub)) l)
      | Ptyp_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_type_declaration sub
        {ptype_name; ptype_params; ptype_cstrs;
         ptype_kind;
         ptype_private;
         ptype_manifest;
         ptype_attributes;
         ptype_loc} =
      Type.mk (map_loc sub ptype_name)
        ~params:(List.map (map_fst (sub.typ sub)) ptype_params)
        ~priv:ptype_private
        ~cstrs:(List.map
                  (map_tuple3 (sub.typ sub) (sub.typ sub) (sub.location sub))
                  ptype_cstrs)
        ~kind:(sub.type_kind sub ptype_kind)
        ?manifest:(map_opt (sub.typ sub) ptype_manifest)
        ~loc:(sub.location sub ptype_loc)
        ~attrs:(sub.attributes sub ptype_attributes)

    let map_type_kind sub = function
      | Ptype_abstract -> Ptype_abstract
      | Ptype_variant l ->
          Ptype_variant (List.map (sub.constructor_declaration sub) l)
      | Ptype_record l -> Ptype_record (List.map (sub.label_declaration sub) l)
      | Ptype_open -> Ptype_open

    let map_constructor_arguments sub = function
      | Pcstr_tuple l -> Pcstr_tuple (List.map (sub.typ sub) l)
      | Pcstr_record l ->
          Pcstr_record (List.map (sub.label_declaration sub) l)

    let map_type_extension sub
        {ptyext_path; ptyext_params;
         ptyext_constructors;
         ptyext_private;
         ptyext_attributes} =
      Te.mk
        (map_loc sub ptyext_path)
        (List.map (sub.extension_constructor sub) ptyext_constructors)
        ~params:(List.map (map_fst (sub.typ sub)) ptyext_params)
        ~priv:ptyext_private
        ~attrs:(sub.attributes sub ptyext_attributes)

    let map_extension_constructor_kind sub = function
        Pext_decl(ctl, cto) ->
          Pext_decl(map_constructor_arguments sub ctl, map_opt (sub.typ sub) cto)
      | Pext_rebind li ->
          Pext_rebind (map_loc sub li)

    let map_extension_constructor sub
        {pext_name;
         pext_kind;
         pext_loc;
         pext_attributes} =
      Te.constructor
        (map_loc sub pext_name)
        (map_extension_constructor_kind sub pext_kind)
        ~loc:(sub.location sub pext_loc)
        ~attrs:(sub.attributes sub pext_attributes)

  end

  module CT = struct
    (* Type expressions for the class language *)

    let map sub {pcty_loc = loc; pcty_desc = desc; pcty_attributes = attrs} =
      let open Cty in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pcty_constr (lid, tys) ->
          constr ~loc ~attrs (map_loc sub lid) (List.map (sub.typ sub) tys)
      | Pcty_signature x -> signature ~loc ~attrs (sub.class_signature sub x)
      | Pcty_arrow (lab, t, ct) ->
          arrow ~loc ~attrs lab (sub.typ sub t) (sub.class_type sub ct)
      | Pcty_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_field sub {pctf_desc = desc; pctf_loc = loc; pctf_attributes = attrs}
      =
      let open Ctf in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pctf_inherit ct -> inherit_ ~loc ~attrs (sub.class_type sub ct)
      | Pctf_val (s, m, v, t) -> val_ ~loc ~attrs s m v (sub.typ sub t)
      | Pctf_method (s, p, v, t) -> method_ ~loc ~attrs s p v (sub.typ sub t)
      | Pctf_constraint (t1, t2) ->
          constraint_ ~loc ~attrs (sub.typ sub t1) (sub.typ sub t2)
      | Pctf_attribute x -> attribute ~loc (sub.attribute sub x)
      | Pctf_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_signature sub {pcsig_self; pcsig_fields} =
      Csig.mk
        (sub.typ sub pcsig_self)
        (List.map (sub.class_type_field sub) pcsig_fields)
  end

  module MT = struct
    (* Type expressions for the module language *)

    let map sub {pmty_desc = desc; pmty_loc = loc; pmty_attributes = attrs} =
      let open Mty in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pmty_ident s -> ident ~loc ~attrs (map_loc sub s)
      | Pmty_alias s -> alias ~loc ~attrs (map_loc sub s)
      | Pmty_signature sg -> signature ~loc ~attrs (sub.signature sub sg)
      | Pmty_functor (s, mt1, mt2) ->
          functor_ ~loc ~attrs (map_loc sub s)
            (Misc.may_map (sub.module_type sub) mt1)
            (sub.module_type sub mt2)
      | Pmty_with (mt, l) ->
          with_ ~loc ~attrs (sub.module_type sub mt)
            (List.map (sub.with_constraint sub) l)
      | Pmty_typeof me -> typeof_ ~loc ~attrs (sub.module_expr sub me)
      | Pmty_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_with_constraint sub = function
      | Pwith_type (lid, d) ->
          Pwith_type (map_loc sub lid, sub.type_declaration sub d)
      | Pwith_module (lid, lid2) ->
          Pwith_module (map_loc sub lid, map_loc sub lid2)
      | Pwith_typesubst d -> Pwith_typesubst (sub.type_declaration sub d)
      | Pwith_modsubst (s, lid) ->
          Pwith_modsubst (map_loc sub s, map_loc sub lid)

    let map_signature_item sub {psig_desc = desc; psig_loc = loc} =
      let open Sig in
      let loc = sub.location sub loc in
      match desc with
      | Psig_value vd -> value ~loc (sub.value_description sub vd)
      | Psig_type (rf, l) -> type_ ~loc rf (List.map (sub.type_declaration sub) l)
      | Psig_typext te -> type_extension ~loc (sub.type_extension sub te)
      | Psig_exception ed -> exception_ ~loc (sub.extension_constructor sub ed)
      | Psig_module x -> module_ ~loc (sub.module_declaration sub x)
      | Psig_recmodule l ->
          rec_module ~loc (List.map (sub.module_declaration sub) l)
      | Psig_modtype x -> modtype ~loc (sub.module_type_declaration sub x)
      | Psig_open x -> open_ ~loc (sub.open_description sub x)
      | Psig_include x -> include_ ~loc (sub.include_description sub x)
      | Psig_class l -> class_ ~loc (List.map (sub.class_description sub) l)
      | Psig_class_type l ->
          class_type ~loc (List.map (sub.class_type_declaration sub) l)
      | Psig_extension (x, attrs) ->
          extension ~loc (sub.extension sub x) ~attrs:(sub.attributes sub attrs)
      | Psig_attribute x -> attribute ~loc (sub.attribute sub x)
  end


  module M = struct
    (* Value expressions for the module language *)

    let map sub {pmod_loc = loc; pmod_desc = desc; pmod_attributes = attrs} =
      let open Mod in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pmod_ident x -> ident ~loc ~attrs (map_loc sub x)
      | Pmod_structure str -> structure ~loc ~attrs (sub.structure sub str)
      | Pmod_functor (arg, arg_ty, body) ->
          functor_ ~loc ~attrs (map_loc sub arg)
            (Misc.may_map (sub.module_type sub) arg_ty)
            (sub.module_expr sub body)
      | Pmod_apply (m1, m2) ->
          apply ~loc ~attrs (sub.module_expr sub m1) (sub.module_expr sub m2)
      | Pmod_constraint (m, mty) ->
          constraint_ ~loc ~attrs (sub.module_expr sub m)
                      (sub.module_type sub mty)
      | Pmod_unpack e -> unpack ~loc ~attrs (sub.expr sub e)
      | Pmod_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_structure_item sub {pstr_loc = loc; pstr_desc = desc} =
      let open Str in
      let loc = sub.location sub loc in
      match desc with
      | Pstr_eval (x, attrs) ->
          eval ~loc ~attrs:(sub.attributes sub attrs) (sub.expr sub x)
      | Pstr_value (r, vbs) -> value ~loc r (List.map (sub.value_binding sub) vbs)
      | Pstr_primitive vd -> primitive ~loc (sub.value_description sub vd)
      | Pstr_type (rf, l) -> type_ ~loc rf (List.map (sub.type_declaration sub) l)
      | Pstr_typext te -> type_extension ~loc (sub.type_extension sub te)
      | Pstr_exception ed -> exception_ ~loc (sub.extension_constructor sub ed)
      | Pstr_module x -> module_ ~loc (sub.module_binding sub x)
      | Pstr_recmodule l -> rec_module ~loc (List.map (sub.module_binding sub) l)
      | Pstr_modtype x -> modtype ~loc (sub.module_type_declaration sub x)
      | Pstr_open x -> open_ ~loc (sub.open_description sub x)
      | Pstr_class l -> class_ ~loc (List.map (sub.class_declaration sub) l)
      | Pstr_class_type l ->
          class_type ~loc (List.map (sub.class_type_declaration sub) l)
      | Pstr_include x -> include_ ~loc (sub.include_declaration sub x)
      | Pstr_extension (x, attrs) ->
          extension ~loc (sub.extension sub x) ~attrs:(sub.attributes sub attrs)
      | Pstr_attribute x -> attribute ~loc (sub.attribute sub x)
  end

  module E = struct
    (* Value expressions for the core language *)

    let map sub {pexp_loc = loc; pexp_desc = desc; pexp_attributes = attrs} =
      let open Exp in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pexp_ident x -> ident ~loc ~attrs (map_loc sub x)
      | Pexp_constant x -> constant ~loc ~attrs x
      | Pexp_let (r, vbs, e) ->
          let_ ~loc ~attrs r (List.map (sub.value_binding sub) vbs)
            (sub.expr sub e)
      | Pexp_fun (lab, def, p, e) ->
          fun_ ~loc ~attrs lab (map_opt (sub.expr sub) def) (sub.pat sub p)
            (sub.expr sub e)
      | Pexp_function pel -> function_ ~loc ~attrs (sub.cases sub pel)
      | Pexp_apply (e, l) ->
          apply ~loc ~attrs (sub.expr sub e) (List.map (map_snd (sub.expr sub)) l)
      | Pexp_match (e, pel) ->
          match_ ~loc ~attrs (sub.expr sub e) (sub.cases sub pel)
      | Pexp_try (e, pel) -> try_ ~loc ~attrs (sub.expr sub e) (sub.cases sub pel)
      | Pexp_tuple el -> tuple ~loc ~attrs (List.map (sub.expr sub) el)
      | Pexp_construct (lid, arg) ->
          construct ~loc ~attrs (map_loc sub lid) (map_opt (sub.expr sub) arg)
      | Pexp_variant (lab, eo) ->
          variant ~loc ~attrs lab (map_opt (sub.expr sub) eo)
      | Pexp_record (l, eo) ->
          record ~loc ~attrs (List.map (map_tuple (map_loc sub) (sub.expr sub)) l)
            (map_opt (sub.expr sub) eo)
      | Pexp_field (e, lid) ->
          field ~loc ~attrs (sub.expr sub e) (map_loc sub lid)
      | Pexp_setfield (e1, lid, e2) ->
          setfield ~loc ~attrs (sub.expr sub e1) (map_loc sub lid)
            (sub.expr sub e2)
      | Pexp_array el -> array ~loc ~attrs (List.map (sub.expr sub) el)
      | Pexp_ifthenelse (e1, e2, e3) ->
          ifthenelse ~loc ~attrs (sub.expr sub e1) (sub.expr sub e2)
            (map_opt (sub.expr sub) e3)
      | Pexp_sequence (e1, e2) ->
          sequence ~loc ~attrs (sub.expr sub e1) (sub.expr sub e2)
      | Pexp_while (e1, e2) ->
          while_ ~loc ~attrs (sub.expr sub e1) (sub.expr sub e2)
      | Pexp_for (p, e1, e2, d, e3) ->
          for_ ~loc ~attrs (sub.pat sub p) (sub.expr sub e1) (sub.expr sub e2) d
            (sub.expr sub e3)
      | Pexp_coerce (e, t1, t2) ->
          coerce ~loc ~attrs (sub.expr sub e) (map_opt (sub.typ sub) t1)
            (sub.typ sub t2)
      | Pexp_constraint (e, t) ->
          constraint_ ~loc ~attrs (sub.expr sub e) (sub.typ sub t)
      | Pexp_send (e, s) -> send ~loc ~attrs (sub.expr sub e) s
      | Pexp_new lid -> new_ ~loc ~attrs (map_loc sub lid)
      | Pexp_setinstvar (s, e) ->
          setinstvar ~loc ~attrs (map_loc sub s) (sub.expr sub e)
      | Pexp_override sel ->
          override ~loc ~attrs
            (List.map (map_tuple (map_loc sub) (sub.expr sub)) sel)
      | Pexp_letmodule (s, me, e) ->
          letmodule ~loc ~attrs (map_loc sub s) (sub.module_expr sub me)
            (sub.expr sub e)
      | Pexp_assert e -> assert_ ~loc ~attrs (sub.expr sub e)
      | Pexp_lazy e -> lazy_ ~loc ~attrs (sub.expr sub e)
      | Pexp_poly (e, t) ->
          poly ~loc ~attrs (sub.expr sub e) (map_opt (sub.typ sub) t)
      | Pexp_object cls -> object_ ~loc ~attrs (sub.class_structure sub cls)
      | Pexp_newtype (s, e) -> newtype ~loc ~attrs s (sub.expr sub e)
      | Pexp_pack me -> pack ~loc ~attrs (sub.module_expr sub me)
      | Pexp_open (ovf, lid, e) ->
          open_ ~loc ~attrs ovf (map_loc sub lid) (sub.expr sub e)
      | Pexp_extension x -> extension ~loc ~attrs (sub.extension sub x)
      | Pexp_unreachable -> unreachable ~loc ~attrs ()
  end

  module P = struct
    (* Patterns *)

    let map sub {ppat_desc = desc; ppat_loc = loc; ppat_attributes = attrs} =
      let open Pat in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Ppat_any -> any ~loc ~attrs ()
      | Ppat_var s -> var ~loc ~attrs (map_loc sub s)
      | Ppat_alias (p, s) -> alias ~loc ~attrs (sub.pat sub p) (map_loc sub s)
      | Ppat_constant c -> constant ~loc ~attrs c
      | Ppat_interval (c1, c2) -> interval ~loc ~attrs c1 c2
      | Ppat_tuple pl -> tuple ~loc ~attrs (List.map (sub.pat sub) pl)
      | Ppat_construct (l, p) ->
          construct ~loc ~attrs (map_loc sub l) (map_opt (sub.pat sub) p)
      | Ppat_variant (l, p) -> variant ~loc ~attrs l (map_opt (sub.pat sub) p)
      | Ppat_record (lpl, cf) ->
          record ~loc ~attrs
                 (List.map (map_tuple (map_loc sub) (sub.pat sub)) lpl) cf
      | Ppat_array pl -> array ~loc ~attrs (List.map (sub.pat sub) pl)
      | Ppat_or (p1, p2) -> or_ ~loc ~attrs (sub.pat sub p1) (sub.pat sub p2)
      | Ppat_constraint (p, t) ->
          constraint_ ~loc ~attrs (sub.pat sub p) (sub.typ sub t)
      | Ppat_type s -> type_ ~loc ~attrs (map_loc sub s)
      | Ppat_lazy p -> lazy_ ~loc ~attrs (sub.pat sub p)
      | Ppat_unpack s -> unpack ~loc ~attrs (map_loc sub s)
      | Ppat_exception p -> exception_ ~loc ~attrs (sub.pat sub p)
      | Ppat_extension x -> extension ~loc ~attrs (sub.extension sub x)
  end

  module CE = struct
    (* Value expressions for the class language *)

    let map sub {pcl_loc = loc; pcl_desc = desc; pcl_attributes = attrs} =
      let open Cl in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pcl_constr (lid, tys) ->
          constr ~loc ~attrs (map_loc sub lid) (List.map (sub.typ sub) tys)
      | Pcl_structure s ->
          structure ~loc ~attrs (sub.class_structure sub s)
      | Pcl_fun (lab, e, p, ce) ->
          fun_ ~loc ~attrs lab
            (map_opt (sub.expr sub) e)
            (sub.pat sub p)
            (sub.class_expr sub ce)
      | Pcl_apply (ce, l) ->
          apply ~loc ~attrs (sub.class_expr sub ce)
            (List.map (map_snd (sub.expr sub)) l)
      | Pcl_let (r, vbs, ce) ->
          let_ ~loc ~attrs r (List.map (sub.value_binding sub) vbs)
            (sub.class_expr sub ce)
      | Pcl_constraint (ce, ct) ->
          constraint_ ~loc ~attrs (sub.class_expr sub ce) (sub.class_type sub ct)
      | Pcl_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_kind sub = function
      | Cfk_concrete (o, e) -> Cfk_concrete (o, sub.expr sub e)
      | Cfk_virtual t -> Cfk_virtual (sub.typ sub t)

    let map_field sub {pcf_desc = desc; pcf_loc = loc; pcf_attributes = attrs} =
      let open Cf in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pcf_inherit (o, ce, s) -> inherit_ ~loc ~attrs o (sub.class_expr sub ce) s
      | Pcf_val (s, m, k) -> val_ ~loc ~attrs (map_loc sub s) m (map_kind sub k)
      | Pcf_method (s, p, k) ->
          method_ ~loc ~attrs (map_loc sub s) p (map_kind sub k)
      | Pcf_constraint (t1, t2) ->
          constraint_ ~loc ~attrs (sub.typ sub t1) (sub.typ sub t2)
      | Pcf_initializer e -> initializer_ ~loc ~attrs (sub.expr sub e)
      | Pcf_attribute x -> attribute ~loc (sub.attribute sub x)
      | Pcf_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_structure sub {pcstr_self; pcstr_fields} =
      {
        pcstr_self = sub.pat sub pcstr_self;
        pcstr_fields = List.map (sub.class_field sub) pcstr_fields;
      }

    let class_infos sub f {pci_virt; pci_params = pl; pci_name; pci_expr;
                           pci_loc; pci_attributes} =
      Ci.mk
       ~virt:pci_virt
       ~params:(List.map (map_fst (sub.typ sub)) pl)
        (map_loc sub pci_name)
        (f pci_expr)
        ~loc:(sub.location sub pci_loc)
        ~attrs:(sub.attributes sub pci_attributes)
  end

  (* Now, a generic AST mapper, to be extended to cover all kinds and
     cases of the OCaml grammar.  The default behavior of the mapper is
     the identity. *)

  let default_mapper =
    {
      structure = (fun this l -> List.map (this.structure_item this) l);
      structure_item = M.map_structure_item;
      module_expr = M.map;
      signature = (fun this l -> List.map (this.signature_item this) l);
      signature_item = MT.map_signature_item;
      module_type = MT.map;
      with_constraint = MT.map_with_constraint;
      class_declaration =
        (fun this -> CE.class_infos this (this.class_expr this));
      class_expr = CE.map;
      class_field = CE.map_field;
      class_structure = CE.map_structure;
      class_type = CT.map;
      class_type_field = CT.map_field;
      class_signature = CT.map_signature;
      class_type_declaration =
        (fun this -> CE.class_infos this (this.class_type this));
      class_description =
        (fun this -> CE.class_infos this (this.class_type this));
      type_declaration = T.map_type_declaration;
      type_kind = T.map_type_kind;
      typ = T.map;
      type_extension = T.map_type_extension;
      extension_constructor = T.map_extension_constructor;
      value_description =
        (fun this {pval_name; pval_type; pval_prim; pval_loc;
                   pval_attributes} ->
          Val.mk
            (map_loc this pval_name)
            (this.typ this pval_type)
            ~attrs:(this.attributes this pval_attributes)
            ~loc:(this.location this pval_loc)
            ~prim:pval_prim
        );

      pat = P.map;
      expr = E.map;

      module_declaration =
        (fun this {pmd_name; pmd_type; pmd_attributes; pmd_loc} ->
           Md.mk
             (map_loc this pmd_name)
             (this.module_type this pmd_type)
             ~attrs:(this.attributes this pmd_attributes)
             ~loc:(this.location this pmd_loc)
        );

      module_type_declaration =
        (fun this {pmtd_name; pmtd_type; pmtd_attributes; pmtd_loc} ->
           Mtd.mk
             (map_loc this pmtd_name)
             ?typ:(map_opt (this.module_type this) pmtd_type)
             ~attrs:(this.attributes this pmtd_attributes)
             ~loc:(this.location this pmtd_loc)
        );

      module_binding =
        (fun this {pmb_name; pmb_expr; pmb_attributes; pmb_loc} ->
           Mb.mk (map_loc this pmb_name) (this.module_expr this pmb_expr)
             ~attrs:(this.attributes this pmb_attributes)
             ~loc:(this.location this pmb_loc)
        );


      open_description =
        (fun this {popen_lid; popen_override; popen_attributes; popen_loc} ->
           Opn.mk (map_loc this popen_lid)
             ~override:popen_override
             ~loc:(this.location this popen_loc)
             ~attrs:(this.attributes this popen_attributes)
        );


      include_description =
        (fun this {pincl_mod; pincl_attributes; pincl_loc} ->
           Incl.mk (this.module_type this pincl_mod)
             ~loc:(this.location this pincl_loc)
             ~attrs:(this.attributes this pincl_attributes)
        );

      include_declaration =
        (fun this {pincl_mod; pincl_attributes; pincl_loc} ->
           Incl.mk (this.module_expr this pincl_mod)
             ~loc:(this.location this pincl_loc)
             ~attrs:(this.attributes this pincl_attributes)
        );


      value_binding =
        (fun this {pvb_pat; pvb_expr; pvb_attributes; pvb_loc} ->
           Vb.mk
             (this.pat this pvb_pat)
             (this.expr this pvb_expr)
             ~loc:(this.location this pvb_loc)
             ~attrs:(this.attributes this pvb_attributes)
        );


      constructor_declaration =
        (fun this {pcd_name; pcd_args; pcd_res; pcd_loc; pcd_attributes} ->
          Type.constructor
            (map_loc this pcd_name)
            ~args:(T.map_constructor_arguments this pcd_args)
            ?res:(map_opt (this.typ this) pcd_res)
            ~loc:(this.location this pcd_loc)
            ~attrs:(this.attributes this pcd_attributes)
        );

      label_declaration =
        (fun this {pld_name; pld_type; pld_loc; pld_mutable; pld_attributes} ->
           Type.field
             (map_loc this pld_name)
             (this.typ this pld_type)
             ~mut:pld_mutable
             ~loc:(this.location this pld_loc)
             ~attrs:(this.attributes this pld_attributes)
        );

      cases = (fun this l -> List.map (this.case this) l);
      case =
        (fun this {pc_lhs; pc_guard; pc_rhs} ->
           {
             pc_lhs = this.pat this pc_lhs;
             pc_guard = map_opt (this.expr this) pc_guard;
             pc_rhs = this.expr this pc_rhs;
           }
        );



      location = (fun _this l -> l);

      extension = (fun this (s, e) -> (map_loc this s, this.payload this e));
      attribute = (fun this (s, e) -> (map_loc this s, this.payload this e));
      attributes = (fun this l -> List.map (this.attribute this) l);
      payload =
        (fun this -> function
           | PStr x -> PStr (this.structure this x)
           | PSig x -> PSig (this.signature this x)
           | PTyp x -> PTyp (this.typ this x)
           | PPat (x, g) -> PPat (this.pat this x, map_opt (this.expr this) g)
        );
    }

  let rec extension_of_error {loc; msg; if_highlight; sub} =
    { loc; txt = "ocaml.error" },
    PStr ([Str.eval (Exp.constant (Pconst_string (msg, None)));
           Str.eval (Exp.constant (Pconst_string (if_highlight, None)))] @
          (List.map (fun ext -> Str.extension (extension_of_error ext)) sub))

  let attribute_of_warning loc s =
    { loc; txt = "ocaml.ppwarning" },
    PStr ([Str.eval ~loc (Exp.constant (Pconst_string (s, None)))])

end

module Outcometree = struct
  (* Module [Outcometree]: results displayed by the toplevel *)

  (* These types represent messages that the toplevel displays as normal
     results or errors. The real displaying is customisable using the hooks:
        [Toploop.print_out_value]
        [Toploop.print_out_type]
        [Toploop.print_out_sig_item]
        [Toploop.print_out_phrase] *)

  type out_ident (*IF_CURRENT = Outcometree.out_ident *) =
    | Oide_apply of out_ident * out_ident
    | Oide_dot of out_ident * string
    | Oide_ident of string

  type out_attribute (*IF_CURRENT = Outcometree.out_attribute *) =
    { oattr_name: string }

  type out_value (*IF_CURRENT = Outcometree.out_value *) =
    | Oval_array of out_value list
    | Oval_char of char
    | Oval_constr of out_ident * out_value list
    | Oval_ellipsis
    | Oval_float of float
    | Oval_int of int
    | Oval_int32 of int32
    | Oval_int64 of int64
    | Oval_nativeint of nativeint
    | Oval_list of out_value list
    | Oval_printer of (Format.formatter -> unit)
    | Oval_record of (out_ident * out_value) list
    | Oval_string of string
    | Oval_stuff of string
    | Oval_tuple of out_value list
    | Oval_variant of string * out_value option

  type out_type (*IF_CURRENT = Outcometree.out_type *) =
    | Otyp_abstract
    | Otyp_open
    | Otyp_alias of out_type * string
    | Otyp_arrow of string * out_type * out_type
    | Otyp_class of bool * out_ident * out_type list
    | Otyp_constr of out_ident * out_type list
    | Otyp_manifest of out_type * out_type
    | Otyp_object of (string * out_type) list * bool option
    | Otyp_record of (string * bool * out_type) list
    | Otyp_stuff of string
    | Otyp_sum of (string * out_type list * out_type option) list
    | Otyp_tuple of out_type list
    | Otyp_var of bool * string
    | Otyp_variant of
        bool * out_variant * bool * (string list) option
    | Otyp_poly of string list * out_type
    | Otyp_module of string * string list * out_type list
    | Otyp_attribute of out_type * out_attribute

  and out_variant (*IF_CURRENT = Outcometree.out_variant *) =
    | Ovar_fields of (string * bool * out_type list) list
    | Ovar_name of out_ident * out_type list

  type out_class_type (*IF_CURRENT = Outcometree.out_class_type *) =
    | Octy_constr of out_ident * out_type list
    | Octy_arrow of string * out_type * out_class_type
    | Octy_signature of out_type option * out_class_sig_item list
  and out_class_sig_item (*IF_CURRENT = Outcometree.out_class_sig_item *) =
    | Ocsg_constraint of out_type * out_type
    | Ocsg_method of string * bool * bool * out_type
    | Ocsg_value of string * bool * bool * out_type

  type out_module_type (*IF_CURRENT = Outcometree.out_module_type *) =
    | Omty_abstract
    | Omty_functor of string * out_module_type option * out_module_type
    | Omty_ident of out_ident
    | Omty_signature of out_sig_item list
    | Omty_alias of out_ident
  and out_sig_item (*IF_CURRENT = Outcometree.out_sig_item *) =
    | Osig_class of
        bool * string * (string * (bool * bool)) list * out_class_type *
          out_rec_status
    | Osig_class_type of
        bool * string * (string * (bool * bool)) list * out_class_type *
          out_rec_status
    | Osig_typext of out_extension_constructor * out_ext_status
    | Osig_modtype of string * out_module_type
    | Osig_module of string * out_module_type * out_rec_status
    | Osig_type of out_type_decl * out_rec_status
    | Osig_value of out_val_decl
    | Osig_ellipsis
  and out_type_decl (*IF_CURRENT = Outcometree.out_type_decl *) =
    { otype_name: string;
      otype_params: (string * (bool * bool)) list;
      otype_type: out_type;
      otype_private: Asttypes.private_flag;
      otype_immediate: bool;
      otype_cstrs: (out_type * out_type) list }
  and out_extension_constructor (*IF_CURRENT = Outcometree.out_extension_constructor *) =
    { oext_name: string;
      oext_type_name: string;
      oext_type_params: string list;
      oext_args: out_type list;
      oext_ret_type: out_type option;
      oext_private: Asttypes.private_flag }
  and out_type_extension (*IF_CURRENT = Outcometree.out_type_extension *) =
    { otyext_name: string;
      otyext_params: string list;
      otyext_constructors: (string * out_type list * out_type option) list;
      otyext_private: Asttypes.private_flag }
  and out_val_decl (*IF_CURRENT = Outcometree.out_val_decl *) =
    { oval_name: string;
      oval_type: out_type;
      oval_prims: string list;
      oval_attributes: out_attribute list }
  and out_rec_status (*IF_CURRENT = Outcometree.out_rec_status *) =
    | Orec_not
    | Orec_first
    | Orec_next
  and out_ext_status (*IF_CURRENT = Outcometree.out_ext_status *) =
    | Oext_first
    | Oext_next
    | Oext_exception

  type out_phrase (*IF_CURRENT = Outcometree.out_phrase *) =
    | Ophr_eval of out_value * out_type
    | Ophr_signature of (out_sig_item * out_value option) list
    | Ophr_exception of (exn * out_value)

end

module Config = struct
  let ast_impl_magic_number = "Caml1999M019"
  let ast_intf_magic_number = "Caml1999N018"
end

let map_signature mapper = mapper.Ast_mapper.signature mapper
let map_structure mapper = mapper.Ast_mapper.structure mapper

let shallow_identity =
  let id _ x = x in
  {
    Ast_mapper.
    structure               = id;
    structure_item          = id;
    module_expr             = id;
    signature               = id;
    signature_item          = id;
    module_type             = id;
    with_constraint         = id;
    class_declaration       = id;
    class_expr              = id;
    class_field             = id;
    class_structure         = id;
    class_type              = id;
    class_type_field        = id;
    class_signature         = id;
    class_type_declaration  = id;
    class_description       = id;
    type_declaration        = id;
    type_kind               = id;
    typ                     = id;
    type_extension          = id;
    extension_constructor   = id;
    value_description       = id;
    pat                     = id;
    expr                    = id;
    module_declaration      = id;
    module_type_declaration = id;
    module_binding          = id;
    open_description        = id;
    include_description     = id;
    include_declaration     = id;
    value_binding           = id;
    constructor_declaration = id;
    label_declaration       = id;
    cases                   = id;
    case                    = id;
    location                = id;
    extension               = id;
    attribute               = id;
    attributes              = id;
    payload                 = id;
  }

let failing_mapper =
  let fail _ _ =
    invalid_arg "failing_mapper: this mapper function should never get called"
  in
  {
    Ast_mapper.
    structure               = fail;
    structure_item          = fail;
    module_expr             = fail;
    signature               = fail;
    signature_item          = fail;
    module_type             = fail;
    with_constraint         = fail;
    class_declaration       = fail;
    class_expr              = fail;
    class_field             = fail;
    class_structure         = fail;
    class_type              = fail;
    class_type_field        = fail;
    class_signature         = fail;
    class_type_declaration  = fail;
    class_description       = fail;
    type_declaration        = fail;
    type_kind               = fail;
    typ                     = fail;
    type_extension          = fail;
    extension_constructor   = fail;
    value_description       = fail;
    pat                     = fail;
    expr                    = fail;
    module_declaration      = fail;
    module_type_declaration = fail;
    module_binding          = fail;
    open_description        = fail;
    include_description     = fail;
    include_declaration     = fail;
    value_binding           = fail;
    constructor_declaration = fail;
    label_declaration       = fail;
    cases                   = fail;
    case                    = fail;
    location                = fail;
    extension               = fail;
    attribute               = fail;
    attributes              = fail;
    payload                 = fail;
  }

let make_top_mapper ~signature ~structure =
  {failing_mapper with Ast_mapper.
                    signature = (fun _ x -> signature x);
                    structure = (fun _ x -> structure x) }

end
module Ast_404
= struct
#1 "ast_404.ml"
# 1 "src/ast_404.ml"
(**************************************************************************)
(*                                                                        *)
(*                         OCaml Migrate Parsetree                        *)
(*                                                                        *)
(*                             Frédéric Bour                              *)
(*            Jérémie Dimino and Leo White, Jane Street Europe            *)
(*            Xavier Leroy, projet Cristal, INRIA Rocquencourt            *)
(*                         Alain Frisch, LexiFi                           *)
(*       Daniel de Rauglaudre, projet Cristal, INRIA Rocquencourt         *)
(*                                                                        *)
(*   Copyright 2017 Institut National de Recherche en Informatique et     *)
(*     en Automatique (INRIA).                                            *)
(*                                                                        *)
(*   All rights reserved.  This file is distributed under the terms of    *)
(*   the GNU Lesser General Public License version 2.1, with the          *)
(*   special exception on linking described in the file LICENSE.          *)
(*                                                                        *)
(**************************************************************************)

module Location = Location
module Longident = Longident

module Asttypes = struct
  (** Auxiliary AST types used by parsetree and typedtree. *)

  type constant (*IF_CURRENT = Asttypes.constant *) =
      Const_int of int
    | Const_char of char
    | Const_string of string * string option
    | Const_float of string
    | Const_int32 of int32
    | Const_int64 of int64
    | Const_nativeint of nativeint

  type rec_flag (*IF_CURRENT = Asttypes.rec_flag *) = Nonrecursive | Recursive

  type direction_flag (*IF_CURRENT = Asttypes.direction_flag *) = Upto | Downto

  (* Order matters, used in polymorphic comparison *)
  type private_flag (*IF_CURRENT = Asttypes.private_flag *) = Private | Public

  type mutable_flag (*IF_CURRENT = Asttypes.mutable_flag *) = Immutable | Mutable

  type virtual_flag (*IF_CURRENT = Asttypes.virtual_flag *) = Virtual | Concrete

  type override_flag (*IF_CURRENT = Asttypes.override_flag *) = Override | Fresh

  type closed_flag (*IF_CURRENT = Asttypes.closed_flag *) = Closed | Open

  type label = string

  type arg_label (*IF_CURRENT = Asttypes.arg_label *) =
      Nolabel
    | Labelled of string (*  label:T -> ... *)
    | Optional of string (* ?label:T -> ... *)

  type 'a loc = 'a Location.loc = {
    txt : 'a;
    loc : Location.t;
  }


  type variance (*IF_CURRENT = Asttypes.variance *) =
    | Covariant
    | Contravariant
    | Invariant
end

module Parsetree = struct
  (** Abstract syntax tree produced by parsing *)

  open Asttypes

  type constant (*IF_CURRENT = Parsetree.constant *) =
      Pconst_integer of string * char option
    (* 3 3l 3L 3n

       Suffixes [g-z][G-Z] are accepted by the parser.
       Suffixes except 'l', 'L' and 'n' are rejected by the typechecker
    *)
    | Pconst_char of char
    (* 'c' *)
    | Pconst_string of string * string option
    (* "constant"
       {delim|other constant|delim}
    *)
    | Pconst_float of string * char option
    (* 3.4 2e5 1.4e-4

       Suffixes [g-z][G-Z] are accepted by the parser.
       Suffixes are rejected by the typechecker.
    *)

  (** {2 Extension points} *)

  type attribute = string loc * payload
         (* [@id ARG]
            [@@id ARG]

            Metadata containers passed around within the AST.
            The compiler ignores unknown attributes.
         *)

  and extension = string loc * payload
        (* [%id ARG]
           [%%id ARG]

           Sub-language placeholder -- rejected by the typechecker.
        *)

  and attributes = attribute list

  and payload (*IF_CURRENT = Parsetree.payload *) =
    | PStr of structure
    | PSig of signature (* : SIG *)
    | PTyp of core_type  (* : T *)
    | PPat of pattern * expression option  (* ? P  or  ? P when E *)

  (** {2 Core language} *)

  (* Type expressions *)

  and core_type (*IF_CURRENT = Parsetree.core_type *) =
      {
       ptyp_desc: core_type_desc;
       ptyp_loc: Location.t;
       ptyp_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and core_type_desc (*IF_CURRENT = Parsetree.core_type_desc *) =
    | Ptyp_any
          (*  _ *)
    | Ptyp_var of string
          (* 'a *)
    | Ptyp_arrow of arg_label * core_type * core_type
          (* T1 -> T2       Simple
             ~l:T1 -> T2    Labelled
             ?l:T1 -> T2    Otional
           *)
    | Ptyp_tuple of core_type list
          (* T1 * ... * Tn

             Invariant: n >= 2
          *)
    | Ptyp_constr of Longident.t loc * core_type list
          (* tconstr
             T tconstr
             (T1, ..., Tn) tconstr
           *)
    | Ptyp_object of (string * attributes * core_type) list * closed_flag
          (* < l1:T1; ...; ln:Tn >     (flag = Closed)
             < l1:T1; ...; ln:Tn; .. > (flag = Open)
           *)
    | Ptyp_class of Longident.t loc * core_type list
          (* #tconstr
             T #tconstr
             (T1, ..., Tn) #tconstr
           *)
    | Ptyp_alias of core_type * string
          (* T as 'a *)
    | Ptyp_variant of row_field list * closed_flag * label list option
          (* [ `A|`B ]         (flag = Closed; labels = None)
             [> `A|`B ]        (flag = Open;   labels = None)
             [< `A|`B ]        (flag = Closed; labels = Some [])
             [< `A|`B > `X `Y ](flag = Closed; labels = Some ["X";"Y"])
           *)
    | Ptyp_poly of string list * core_type
          (* 'a1 ... 'an. T

             Can only appear in the following context:

             - As the core_type of a Ppat_constraint node corresponding
               to a constraint on a let-binding: let x : 'a1 ... 'an. T
               = e ...

             - Under Cfk_virtual for methods (not values).

             - As the core_type of a Pctf_method node.

             - As the core_type of a Pexp_poly node.

             - As the pld_type field of a label_declaration.

             - As a core_type of a Ptyp_object node.
           *)

    | Ptyp_package of package_type
          (* (module S) *)
    | Ptyp_extension of extension
          (* [%id] *)

  and package_type = Longident.t loc * (Longident.t loc * core_type) list
        (*
          (module S)
          (module S with type t1 = T1 and ... and tn = Tn)
         *)

  and row_field (*IF_CURRENT = Parsetree.row_field *) =
    | Rtag of label * attributes * bool * core_type list
          (* [`A]                   ( true,  [] )
             [`A of T]              ( false, [T] )
             [`A of T1 & .. & Tn]   ( false, [T1;...Tn] )
             [`A of & T1 & .. & Tn] ( true,  [T1;...Tn] )

            - The 2nd field is true if the tag contains a
              constant (empty) constructor.
            - '&' occurs when several types are used for the same constructor
              (see 4.2 in the manual)

            - TODO: switch to a record representation, and keep location
          *)
    | Rinherit of core_type
          (* [ T ] *)

  (* Patterns *)

  and pattern (*IF_CURRENT = Parsetree.pattern *) =
      {
       ppat_desc: pattern_desc;
       ppat_loc: Location.t;
       ppat_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and pattern_desc (*IF_CURRENT = Parsetree.pattern_desc *) =
    | Ppat_any
          (* _ *)
    | Ppat_var of string loc
          (* x *)
    | Ppat_alias of pattern * string loc
          (* P as 'a *)
    | Ppat_constant of constant
          (* 1, 'a', "true", 1.0, 1l, 1L, 1n *)
    | Ppat_interval of constant * constant
          (* 'a'..'z'

             Other forms of interval are recognized by the parser
             but rejected by the type-checker. *)
    | Ppat_tuple of pattern list
          (* (P1, ..., Pn)

             Invariant: n >= 2
          *)
    | Ppat_construct of Longident.t loc * pattern option
          (* C                None
             C P              Some P
             C (P1, ..., Pn)  Some (Ppat_tuple [P1; ...; Pn])
           *)
    | Ppat_variant of label * pattern option
          (* `A             (None)
             `A P           (Some P)
           *)
    | Ppat_record of (Longident.t loc * pattern) list * closed_flag
          (* { l1=P1; ...; ln=Pn }     (flag = Closed)
             { l1=P1; ...; ln=Pn; _}   (flag = Open)

             Invariant: n > 0
           *)
    | Ppat_array of pattern list
          (* [| P1; ...; Pn |] *)
    | Ppat_or of pattern * pattern
          (* P1 | P2 *)
    | Ppat_constraint of pattern * core_type
          (* (P : T) *)
    | Ppat_type of Longident.t loc
          (* #tconst *)
    | Ppat_lazy of pattern
          (* lazy P *)
    | Ppat_unpack of string loc
          (* (module P)
             Note: (module P : S) is represented as
             Ppat_constraint(Ppat_unpack, Ptyp_package)
           *)
    | Ppat_exception of pattern
          (* exception P *)
    | Ppat_extension of extension
          (* [%id] *)
    | Ppat_open of Longident.t loc * pattern

  (* Value expressions *)

  and expression (*IF_CURRENT = Parsetree.expression *) =
      {
       pexp_desc: expression_desc;
       pexp_loc: Location.t;
       pexp_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and expression_desc (*IF_CURRENT = Parsetree.expression_desc *) =
    | Pexp_ident of Longident.t loc
          (* x
             M.x
           *)
    | Pexp_constant of constant
          (* 1, 'a', "true", 1.0, 1l, 1L, 1n *)
    | Pexp_let of rec_flag * value_binding list * expression
          (* let P1 = E1 and ... and Pn = EN in E       (flag = Nonrecursive)
             let rec P1 = E1 and ... and Pn = EN in E   (flag = Recursive)
           *)
    | Pexp_function of case list
          (* function P1 -> E1 | ... | Pn -> En *)
    | Pexp_fun of arg_label * expression option * pattern * expression
          (* fun P -> E1                          (Simple, None)
             fun ~l:P -> E1                       (Labelled l, None)
             fun ?l:P -> E1                       (Optional l, None)
             fun ?l:(P = E0) -> E1                (Optional l, Some E0)

             Notes:
             - If E0 is provided, only Optional is allowed.
             - "fun P1 P2 .. Pn -> E1" is represented as nested Pexp_fun.
             - "let f P = E" is represented using Pexp_fun.
           *)
    | Pexp_apply of expression * (arg_label * expression) list
          (* E0 ~l1:E1 ... ~ln:En
             li can be empty (non labeled argument) or start with '?'
             (optional argument).

             Invariant: n > 0
           *)
    | Pexp_match of expression * case list
          (* match E0 with P1 -> E1 | ... | Pn -> En *)
    | Pexp_try of expression * case list
          (* try E0 with P1 -> E1 | ... | Pn -> En *)
    | Pexp_tuple of expression list
          (* (E1, ..., En)

             Invariant: n >= 2
          *)
    | Pexp_construct of Longident.t loc * expression option
          (* C                None
             C E              Some E
             C (E1, ..., En)  Some (Pexp_tuple[E1;...;En])
          *)
    | Pexp_variant of label * expression option
          (* `A             (None)
             `A E           (Some E)
           *)
    | Pexp_record of (Longident.t loc * expression) list * expression option
          (* { l1=P1; ...; ln=Pn }     (None)
             { E0 with l1=P1; ...; ln=Pn }   (Some E0)

             Invariant: n > 0
           *)
    | Pexp_field of expression * Longident.t loc
          (* E.l *)
    | Pexp_setfield of expression * Longident.t loc * expression
          (* E1.l <- E2 *)
    | Pexp_array of expression list
          (* [| E1; ...; En |] *)
    | Pexp_ifthenelse of expression * expression * expression option
          (* if E1 then E2 else E3 *)
    | Pexp_sequence of expression * expression
          (* E1; E2 *)
    | Pexp_while of expression * expression
          (* while E1 do E2 done *)
    | Pexp_for of
        pattern *  expression * expression * direction_flag * expression
          (* for i = E1 to E2 do E3 done      (flag = Upto)
             for i = E1 downto E2 do E3 done  (flag = Downto)
           *)
    | Pexp_constraint of expression * core_type
          (* (E : T) *)
    | Pexp_coerce of expression * core_type option * core_type
          (* (E :> T)        (None, T)
             (E : T0 :> T)   (Some T0, T)
           *)
    | Pexp_send of expression * string
          (*  E # m *)
    | Pexp_new of Longident.t loc
          (* new M.c *)
    | Pexp_setinstvar of string loc * expression
          (* x <- 2 *)
    | Pexp_override of (string loc * expression) list
          (* {< x1 = E1; ...; Xn = En >} *)
    | Pexp_letmodule of string loc * module_expr * expression
          (* let module M = ME in E *)
    | Pexp_letexception of extension_constructor * expression
          (* let exception C in E *)
    | Pexp_assert of expression
          (* assert E
             Note: "assert false" is treated in a special way by the
             type-checker. *)
    | Pexp_lazy of expression
          (* lazy E *)
    | Pexp_poly of expression * core_type option
          (* Used for method bodies.

             Can only be used as the expression under Cfk_concrete
             for methods (not values). *)
    | Pexp_object of class_structure
          (* object ... end *)
    | Pexp_newtype of string * expression
          (* fun (type t) -> E *)
    | Pexp_pack of module_expr
          (* (module ME)

             (module ME : S) is represented as
             Pexp_constraint(Pexp_pack, Ptyp_package S) *)
    | Pexp_open of override_flag * Longident.t loc * expression
          (* let open M in E
             let! open M in E
          *)
    | Pexp_extension of extension
          (* [%id] *)
    | Pexp_unreachable
          (* . *)

  and case (*IF_CURRENT = Parsetree.case *) =   (* (P -> E) or (P when E0 -> E) *)
      {
       pc_lhs: pattern;
       pc_guard: expression option;
       pc_rhs: expression;
      }

  (* Value descriptions *)

  and value_description (*IF_CURRENT = Parsetree.value_description *) =
      {
       pval_name: string loc;
       pval_type: core_type;
       pval_prim: string list;
       pval_attributes: attributes;  (* ... [@@id1] [@@id2] *)
       pval_loc: Location.t;
      }

  (*
    val x: T                            (prim = [])
    external x: T = "s1" ... "sn"       (prim = ["s1";..."sn"])
  *)

  (* Type declarations *)

  and type_declaration (*IF_CURRENT = Parsetree.type_declaration *) =
      {
       ptype_name: string loc;
       ptype_params: (core_type * variance) list;
             (* ('a1,...'an) t; None represents  _*)
       ptype_cstrs: (core_type * core_type * Location.t) list;
             (* ... constraint T1=T1'  ... constraint Tn=Tn' *)
       ptype_kind: type_kind;
       ptype_private: private_flag;   (* = private ... *)
       ptype_manifest: core_type option;  (* = T *)
       ptype_attributes: attributes;   (* ... [@@id1] [@@id2] *)
       ptype_loc: Location.t;
      }

  (*
    type t                     (abstract, no manifest)
    type t = T0                (abstract, manifest=T0)
    type t = C of T | ...      (variant,  no manifest)
    type t = T0 = C of T | ... (variant,  manifest=T0)
    type t = {l: T; ...}       (record,   no manifest)
    type t = T0 = {l : T; ...} (record,   manifest=T0)
    type t = ..                (open,     no manifest)
  *)

  and type_kind (*IF_CURRENT = Parsetree.type_kind *) =
    | Ptype_abstract
    | Ptype_variant of constructor_declaration list
          (* Invariant: non-empty list *)
    | Ptype_record of label_declaration list
          (* Invariant: non-empty list *)
    | Ptype_open

  and label_declaration (*IF_CURRENT = Parsetree.label_declaration *) =
      {
       pld_name: string loc;
       pld_mutable: mutable_flag;
       pld_type: core_type;
       pld_loc: Location.t;
       pld_attributes: attributes; (* l [@id1] [@id2] : T *)
      }

  (*  { ...; l: T; ... }            (mutable=Immutable)
      { ...; mutable l: T; ... }    (mutable=Mutable)

      Note: T can be a Ptyp_poly.
  *)

  and constructor_declaration (*IF_CURRENT = Parsetree.constructor_declaration *) =
      {
       pcd_name: string loc;
       pcd_args: constructor_arguments;
       pcd_res: core_type option;
       pcd_loc: Location.t;
       pcd_attributes: attributes; (* C [@id1] [@id2] of ... *)
      }

  and constructor_arguments (*IF_CURRENT = Parsetree.constructor_arguments *) =
    | Pcstr_tuple of core_type list
    | Pcstr_record of label_declaration list

  (*
    | C of T1 * ... * Tn     (res = None,    args = Pcstr_tuple [])
    | C: T0                  (res = Some T0, args = [])
    | C: T1 * ... * Tn -> T0 (res = Some T0, args = Pcstr_tuple)
    | C of {...}             (res = None,    args = Pcstr_record)
    | C: {...} -> T0         (res = Some T0, args = Pcstr_record)
    | C of {...} as t        (res = None,    args = Pcstr_record)
  *)

  and type_extension (*IF_CURRENT = Parsetree.type_extension *) =
      {
       ptyext_path: Longident.t loc;
       ptyext_params: (core_type * variance) list;
       ptyext_constructors: extension_constructor list;
       ptyext_private: private_flag;
       ptyext_attributes: attributes;   (* ... [@@id1] [@@id2] *)
      }
  (*
    type t += ...
  *)

  and extension_constructor (*IF_CURRENT = Parsetree.extension_constructor *) =
      {
       pext_name: string loc;
       pext_kind : extension_constructor_kind;
       pext_loc : Location.t;
       pext_attributes: attributes; (* C [@id1] [@id2] of ... *)
      }

  and extension_constructor_kind (*IF_CURRENT = Parsetree.extension_constructor_kind *) =
      Pext_decl of constructor_arguments * core_type option
        (*
           | C of T1 * ... * Tn     ([T1; ...; Tn], None)
           | C: T0                  ([], Some T0)
           | C: T1 * ... * Tn -> T0 ([T1; ...; Tn], Some T0)
         *)
    | Pext_rebind of Longident.t loc
        (*
           | C = D
         *)

  (** {2 Class language} *)

  (* Type expressions for the class language *)

  and class_type (*IF_CURRENT = Parsetree.class_type *) =
      {
       pcty_desc: class_type_desc;
       pcty_loc: Location.t;
       pcty_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and class_type_desc (*IF_CURRENT = Parsetree.class_type_desc *) =
    | Pcty_constr of Longident.t loc * core_type list
          (* c
             ['a1, ..., 'an] c *)
    | Pcty_signature of class_signature
          (* object ... end *)
    | Pcty_arrow of arg_label * core_type * class_type
          (* T -> CT       Simple
             ~l:T -> CT    Labelled l
             ?l:T -> CT    Optional l
           *)
    | Pcty_extension of extension
          (* [%id] *)

  and class_signature (*IF_CURRENT = Parsetree.class_signature *) =
      {
       pcsig_self: core_type;
       pcsig_fields: class_type_field list;
      }
  (* object('selfpat) ... end
     object ... end             (self = Ptyp_any)
   *)

  and class_type_field (*IF_CURRENT = Parsetree.class_type_field *) =
      {
       pctf_desc: class_type_field_desc;
       pctf_loc: Location.t;
       pctf_attributes: attributes; (* ... [@@id1] [@@id2] *)
      }

  and class_type_field_desc (*IF_CURRENT = Parsetree.class_type_field_desc *) =
    | Pctf_inherit of class_type
          (* inherit CT *)
    | Pctf_val of (string * mutable_flag * virtual_flag * core_type)
          (* val x: T *)
    | Pctf_method  of (string * private_flag * virtual_flag * core_type)
          (* method x: T

             Note: T can be a Ptyp_poly.
           *)
    | Pctf_constraint  of (core_type * core_type)
          (* constraint T1 = T2 *)
    | Pctf_attribute of attribute
          (* [@@@id] *)
    | Pctf_extension of extension
          (* [%%id] *)

  and 'a class_infos (*IF_CURRENT = 'a Parsetree.class_infos *) =
      {
       pci_virt: virtual_flag;
       pci_params: (core_type * variance) list;
       pci_name: string loc;
       pci_expr: 'a;
       pci_loc: Location.t;
       pci_attributes: attributes;  (* ... [@@id1] [@@id2] *)
      }
  (* class c = ...
     class ['a1,...,'an] c = ...
     class virtual c = ...

     Also used for "class type" declaration.
  *)

  and class_description = class_type class_infos

  and class_type_declaration = class_type class_infos

  (* Value expressions for the class language *)

  and class_expr (*IF_CURRENT = Parsetree.class_expr *) =
      {
       pcl_desc: class_expr_desc;
       pcl_loc: Location.t;
       pcl_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and class_expr_desc (*IF_CURRENT = Parsetree.class_expr_desc *) =
    | Pcl_constr of Longident.t loc * core_type list
          (* c
             ['a1, ..., 'an] c *)
    | Pcl_structure of class_structure
          (* object ... end *)
    | Pcl_fun of arg_label * expression option * pattern * class_expr
          (* fun P -> CE                          (Simple, None)
             fun ~l:P -> CE                       (Labelled l, None)
             fun ?l:P -> CE                       (Optional l, None)
             fun ?l:(P = E0) -> CE                (Optional l, Some E0)
           *)
    | Pcl_apply of class_expr * (arg_label * expression) list
          (* CE ~l1:E1 ... ~ln:En
             li can be empty (non labeled argument) or start with '?'
             (optional argument).

             Invariant: n > 0
           *)
    | Pcl_let of rec_flag * value_binding list * class_expr
          (* let P1 = E1 and ... and Pn = EN in CE      (flag = Nonrecursive)
             let rec P1 = E1 and ... and Pn = EN in CE  (flag = Recursive)
           *)
    | Pcl_constraint of class_expr * class_type
          (* (CE : CT) *)
    | Pcl_extension of extension
          (* [%id] *)

  and class_structure (*IF_CURRENT = Parsetree.class_structure *) =
      {
       pcstr_self: pattern;
       pcstr_fields: class_field list;
      }
  (* object(selfpat) ... end
     object ... end           (self = Ppat_any)
   *)

  and class_field (*IF_CURRENT = Parsetree.class_field *) =
      {
       pcf_desc: class_field_desc;
       pcf_loc: Location.t;
       pcf_attributes: attributes; (* ... [@@id1] [@@id2] *)
      }

  and class_field_desc (*IF_CURRENT = Parsetree.class_field_desc *) =
    | Pcf_inherit of override_flag * class_expr * string option
          (* inherit CE
             inherit CE as x
             inherit! CE
             inherit! CE as x
           *)
    | Pcf_val of (string loc * mutable_flag * class_field_kind)
          (* val x = E
             val virtual x: T
           *)
    | Pcf_method of (string loc * private_flag * class_field_kind)
          (* method x = E            (E can be a Pexp_poly)
             method virtual x: T     (T can be a Ptyp_poly)
           *)
    | Pcf_constraint of (core_type * core_type)
          (* constraint T1 = T2 *)
    | Pcf_initializer of expression
          (* initializer E *)
    | Pcf_attribute of attribute
          (* [@@@id] *)
    | Pcf_extension of extension
          (* [%%id] *)

  and class_field_kind (*IF_CURRENT = Parsetree.class_field_kind *) =
    | Cfk_virtual of core_type
    | Cfk_concrete of override_flag * expression

  and class_declaration = class_expr class_infos

  (** {2 Module language} *)

  (* Type expressions for the module language *)

  and module_type (*IF_CURRENT = Parsetree.module_type *) =
      {
       pmty_desc: module_type_desc;
       pmty_loc: Location.t;
       pmty_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and module_type_desc (*IF_CURRENT = Parsetree.module_type_desc *) =
    | Pmty_ident of Longident.t loc
          (* S *)
    | Pmty_signature of signature
          (* sig ... end *)
    | Pmty_functor of string loc * module_type option * module_type
          (* functor(X : MT1) -> MT2 *)
    | Pmty_with of module_type * with_constraint list
          (* MT with ... *)
    | Pmty_typeof of module_expr
          (* module type of ME *)
    | Pmty_extension of extension
          (* [%id] *)
    | Pmty_alias of Longident.t loc
          (* (module M) *)

  and signature = signature_item list

  and signature_item (*IF_CURRENT = Parsetree.signature_item *) =
      {
       psig_desc: signature_item_desc;
       psig_loc: Location.t;
      }

  and signature_item_desc (*IF_CURRENT = Parsetree.signature_item_desc *) =
    | Psig_value of value_description
          (*
            val x: T
            external x: T = "s1" ... "sn"
           *)
    | Psig_type of rec_flag * type_declaration list
          (* type t1 = ... and ... and tn = ... *)
    | Psig_typext of type_extension
          (* type t1 += ... *)
    | Psig_exception of extension_constructor
          (* exception C of T *)
    | Psig_module of module_declaration
          (* module X : MT *)
    | Psig_recmodule of module_declaration list
          (* module rec X1 : MT1 and ... and Xn : MTn *)
    | Psig_modtype of module_type_declaration
          (* module type S = MT
             module type S *)
    | Psig_open of open_description
          (* open X *)
    | Psig_include of include_description
          (* include MT *)
    | Psig_class of class_description list
          (* class c1 : ... and ... and cn : ... *)
    | Psig_class_type of class_type_declaration list
          (* class type ct1 = ... and ... and ctn = ... *)
    | Psig_attribute of attribute
          (* [@@@id] *)
    | Psig_extension of extension * attributes
          (* [%%id] *)

  and module_declaration (*IF_CURRENT = Parsetree.module_declaration *) =
      {
       pmd_name: string loc;
       pmd_type: module_type;
       pmd_attributes: attributes; (* ... [@@id1] [@@id2] *)
       pmd_loc: Location.t;
      }
  (* S : MT *)

  and module_type_declaration (*IF_CURRENT = Parsetree.module_type_declaration *) =
      {
       pmtd_name: string loc;
       pmtd_type: module_type option;
       pmtd_attributes: attributes; (* ... [@@id1] [@@id2] *)
       pmtd_loc: Location.t;
      }
  (* S = MT
     S       (abstract module type declaration, pmtd_type = None)
  *)

  and open_description (*IF_CURRENT = Parsetree.open_description *) =
      {
       popen_lid: Longident.t loc;
       popen_override: override_flag;
       popen_loc: Location.t;
       popen_attributes: attributes;
      }
  (* open! X - popen_override = Override (silences the 'used identifier
                                shadowing' warning)
     open  X - popen_override = Fresh
   *)

  and 'a include_infos (*IF_CURRENT = 'a Parsetree.include_infos *) =
      {
       pincl_mod: 'a;
       pincl_loc: Location.t;
       pincl_attributes: attributes;
      }

  and include_description = module_type include_infos
  (* include MT *)

  and include_declaration = module_expr include_infos
  (* include ME *)

  and with_constraint (*IF_CURRENT = Parsetree.with_constraint *) =
    | Pwith_type of Longident.t loc * type_declaration
          (* with type X.t = ...

             Note: the last component of the longident must match
             the name of the type_declaration. *)
    | Pwith_module of Longident.t loc * Longident.t loc
          (* with module X.Y = Z *)
    | Pwith_typesubst of type_declaration
          (* with type t := ... *)
    | Pwith_modsubst of string loc * Longident.t loc
          (* with module X := Z *)

  (* Value expressions for the module language *)

  and module_expr (*IF_CURRENT = Parsetree.module_expr *) =
      {
       pmod_desc: module_expr_desc;
       pmod_loc: Location.t;
       pmod_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and module_expr_desc (*IF_CURRENT = Parsetree.module_expr_desc *) =
    | Pmod_ident of Longident.t loc
          (* X *)
    | Pmod_structure of structure
          (* struct ... end *)
    | Pmod_functor of string loc * module_type option * module_expr
          (* functor(X : MT1) -> ME *)
    | Pmod_apply of module_expr * module_expr
          (* ME1(ME2) *)
    | Pmod_constraint of module_expr * module_type
          (* (ME : MT) *)
    | Pmod_unpack of expression
          (* (val E) *)
    | Pmod_extension of extension
          (* [%id] *)

  and structure = structure_item list

  and structure_item (*IF_CURRENT = Parsetree.structure_item *) =
      {
       pstr_desc: structure_item_desc;
       pstr_loc: Location.t;
      }

  and structure_item_desc (*IF_CURRENT = Parsetree.structure_item_desc *) =
    | Pstr_eval of expression * attributes
          (* E *)
    | Pstr_value of rec_flag * value_binding list
          (* let P1 = E1 and ... and Pn = EN       (flag = Nonrecursive)
             let rec P1 = E1 and ... and Pn = EN   (flag = Recursive)
           *)
    | Pstr_primitive of value_description
          (*  val x: T
              external x: T = "s1" ... "sn" *)
    | Pstr_type of rec_flag * type_declaration list
          (* type t1 = ... and ... and tn = ... *)
    | Pstr_typext of type_extension
          (* type t1 += ... *)
    | Pstr_exception of extension_constructor
          (* exception C of T
             exception C = M.X *)
    | Pstr_module of module_binding
          (* module X = ME *)
    | Pstr_recmodule of module_binding list
          (* module rec X1 = ME1 and ... and Xn = MEn *)
    | Pstr_modtype of module_type_declaration
          (* module type S = MT *)
    | Pstr_open of open_description
          (* open X *)
    | Pstr_class of class_declaration list
          (* class c1 = ... and ... and cn = ... *)
    | Pstr_class_type of class_type_declaration list
          (* class type ct1 = ... and ... and ctn = ... *)
    | Pstr_include of include_declaration
          (* include ME *)
    | Pstr_attribute of attribute
          (* [@@@id] *)
    | Pstr_extension of extension * attributes
          (* [%%id] *)

  and value_binding (*IF_CURRENT = Parsetree.value_binding *) =
    {
      pvb_pat: pattern;
      pvb_expr: expression;
      pvb_attributes: attributes;
      pvb_loc: Location.t;
    }

  and module_binding (*IF_CURRENT = Parsetree.module_binding *) =
      {
       pmb_name: string loc;
       pmb_expr: module_expr;
       pmb_attributes: attributes;
       pmb_loc: Location.t;
      }
  (* X = ME *)

  (** {2 Toplevel} *)

  (* Toplevel phrases *)

  type toplevel_phrase (*IF_CURRENT = Parsetree.toplevel_phrase *) =
    | Ptop_def of structure
    | Ptop_dir of string * directive_argument
       (* #use, #load ... *)

  and directive_argument (*IF_CURRENT = Parsetree.directive_argument *) =
    | Pdir_none
    | Pdir_string of string
    | Pdir_int of string * char option
    | Pdir_ident of Longident.t
    | Pdir_bool of bool
end

module Docstrings : sig
  (** {3 Docstrings} *)

  (** Documentation comments *)
  type docstring

  (** Create a docstring *)
  val docstring : string -> Location.t -> docstring

  (** Get the text of a docstring *)
  val docstring_body : docstring -> string

  (** Get the location of a docstring *)
  val docstring_loc : docstring -> Location.t

  (** {3 Items}

      The {!docs} type represents documentation attached to an item. *)

  type docs =
    { docs_pre: docstring option;
      docs_post: docstring option; }

  val empty_docs : docs

  val docs_attr : docstring -> Parsetree.attribute

  (** Convert item documentation to attributes and add them to an
      attribute list *)
  val add_docs_attrs : docs -> Parsetree.attributes -> Parsetree.attributes

  (** {3 Fields and constructors}

      The {!info} type represents documentation attached to a field or
      constructor. *)

  type info = docstring option

  val empty_info : info

  val info_attr : docstring -> Parsetree.attribute

  (** Convert field info to attributes and add them to an
      attribute list *)
  val add_info_attrs : info -> Parsetree.attributes -> Parsetree.attributes

  (** {3 Unattached comments}

      The {!text} type represents documentation which is not attached to
      anything. *)

  type text = docstring list

  val empty_text : text

  val text_attr : docstring -> Parsetree.attribute

  (** Convert text to attributes and add them to an attribute list *)
  val add_text_attrs : text -> Parsetree.attributes -> Parsetree.attributes

end = struct
  open Location

  (* Docstrings *)

  type docstring =
    { ds_body: string;
      ds_loc: Location.t; }

  (* Docstring constructors and destructors *)

  let docstring body loc =
    let ds =
      { ds_body = body;
        ds_loc = loc; }
    in
    ds

  let docstring_body ds = ds.ds_body

  let docstring_loc ds = ds.ds_loc

  (* Docstrings attached to items *)

  type docs =
    { docs_pre: docstring option;
      docs_post: docstring option; }

  let empty_docs = { docs_pre = None; docs_post = None }

  let doc_loc = {txt = "ocaml.doc"; loc = Location.none}

  let docs_attr ds =
    let open Parsetree in
    let exp =
      { pexp_desc = Pexp_constant (Pconst_string(ds.ds_body, None));
        pexp_loc = ds.ds_loc;
        pexp_attributes = []; }
    in
    let item =
      { pstr_desc = Pstr_eval (exp, []); pstr_loc = exp.pexp_loc }
    in
      (doc_loc, PStr [item])

  let add_docs_attrs docs attrs =
    let attrs =
      match docs.docs_pre with
      | None | Some { ds_body=""; _ } -> attrs
      | Some ds -> docs_attr ds :: attrs
    in
    let attrs =
      match docs.docs_post with
      | None | Some { ds_body=""; _ } -> attrs
      | Some ds -> attrs @ [docs_attr ds]
    in
    attrs

  (* Docstrings attached to constructors or fields *)

  type info = docstring option

  let empty_info = None

  let info_attr = docs_attr

  let add_info_attrs info attrs =
    match info with
    | None | Some {ds_body=""; _} -> attrs
    | Some ds -> attrs @ [info_attr ds]

  (* Docstrings not attached to a specific item *)

  type text = docstring list

  let empty_text = []

  let text_loc = {txt = "ocaml.text"; loc = Location.none}

  let text_attr ds =
    let open Parsetree in
    let exp =
      { pexp_desc = Pexp_constant (Pconst_string(ds.ds_body, None));
        pexp_loc = ds.ds_loc;
        pexp_attributes = []; }
    in
    let item =
      { pstr_desc = Pstr_eval (exp, []); pstr_loc = exp.pexp_loc }
    in
      (text_loc, PStr [item])

  let add_text_attrs dsl attrs =
    let fdsl = List.filter (function {ds_body=""; _} -> false| _ ->true) dsl in
    (List.map text_attr fdsl) @ attrs

end

module Ast_helper : sig
  (** Helpers to produce Parsetree fragments *)

  open Asttypes
  open Docstrings
  open Parsetree

  type lid = Longident.t loc
  type str = string loc
  type loc = Location.t
  type attrs = attribute list

  (** {2 Default locations} *)

  val default_loc: loc ref
      (** Default value for all optional location arguments. *)

  val with_default_loc: loc -> (unit -> 'a) -> 'a
      (** Set the [default_loc] within the scope of the execution
          of the provided function. *)

  (** {2 Constants} *)

  module Const : sig
    val char : char -> constant
    val string : ?quotation_delimiter:string -> string -> constant
    val integer : ?suffix:char -> string -> constant
    val int : ?suffix:char -> int -> constant
    val int32 : ?suffix:char -> int32 -> constant
    val int64 : ?suffix:char -> int64 -> constant
    val nativeint : ?suffix:char -> nativeint -> constant
    val float : ?suffix:char -> string -> constant
  end

  (** {2 Core language} *)

  (** Type expressions *)
  module Typ :
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> core_type_desc -> core_type
      val attr: core_type -> attribute -> core_type

      val any: ?loc:loc -> ?attrs:attrs -> unit -> core_type
      val var: ?loc:loc -> ?attrs:attrs -> string -> core_type
      val arrow: ?loc:loc -> ?attrs:attrs -> arg_label -> core_type -> core_type
                 -> core_type
      val tuple: ?loc:loc -> ?attrs:attrs -> core_type list -> core_type
      val constr: ?loc:loc -> ?attrs:attrs -> lid -> core_type list -> core_type
      val object_: ?loc:loc -> ?attrs:attrs ->
                    (string * attributes * core_type) list -> closed_flag ->
                    core_type
      val class_: ?loc:loc -> ?attrs:attrs -> lid -> core_type list -> core_type
      val alias: ?loc:loc -> ?attrs:attrs -> core_type -> string -> core_type
      val variant: ?loc:loc -> ?attrs:attrs -> row_field list -> closed_flag
                   -> label list option -> core_type
      val poly: ?loc:loc -> ?attrs:attrs -> string list -> core_type -> core_type
      val package: ?loc:loc -> ?attrs:attrs -> lid -> (lid * core_type) list
                   -> core_type
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> core_type

      val force_poly: core_type -> core_type
    end

  (** Patterns *)
  module Pat:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> pattern_desc -> pattern
      val attr:pattern -> attribute -> pattern

      val any: ?loc:loc -> ?attrs:attrs -> unit -> pattern
      val var: ?loc:loc -> ?attrs:attrs -> str -> pattern
      val alias: ?loc:loc -> ?attrs:attrs -> pattern -> str -> pattern
      val constant: ?loc:loc -> ?attrs:attrs -> constant -> pattern
      val interval: ?loc:loc -> ?attrs:attrs -> constant -> constant -> pattern
      val tuple: ?loc:loc -> ?attrs:attrs -> pattern list -> pattern
      val construct: ?loc:loc -> ?attrs:attrs -> lid -> pattern option -> pattern
      val variant: ?loc:loc -> ?attrs:attrs -> label -> pattern option -> pattern
      val record: ?loc:loc -> ?attrs:attrs -> (lid * pattern) list -> closed_flag
                  -> pattern
      val array: ?loc:loc -> ?attrs:attrs -> pattern list -> pattern
      val or_: ?loc:loc -> ?attrs:attrs -> pattern -> pattern -> pattern
      val constraint_: ?loc:loc -> ?attrs:attrs -> pattern -> core_type -> pattern
      val type_: ?loc:loc -> ?attrs:attrs -> lid -> pattern
      val lazy_: ?loc:loc -> ?attrs:attrs -> pattern -> pattern
      val unpack: ?loc:loc -> ?attrs:attrs -> str -> pattern
      val open_: ?loc:loc -> ?attrs:attrs  -> lid -> pattern -> pattern
      val exception_: ?loc:loc -> ?attrs:attrs -> pattern -> pattern
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> pattern
    end

  (** Expressions *)
  module Exp:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> expression_desc -> expression
      val attr: expression -> attribute -> expression

      val ident: ?loc:loc -> ?attrs:attrs -> lid -> expression
      val constant: ?loc:loc -> ?attrs:attrs -> constant -> expression
      val let_: ?loc:loc -> ?attrs:attrs -> rec_flag -> value_binding list
                -> expression -> expression
      val fun_: ?loc:loc -> ?attrs:attrs -> arg_label -> expression option
                -> pattern -> expression -> expression
      val function_: ?loc:loc -> ?attrs:attrs -> case list -> expression
      val apply: ?loc:loc -> ?attrs:attrs -> expression
                 -> (arg_label * expression) list -> expression
      val match_: ?loc:loc -> ?attrs:attrs -> expression -> case list
                  -> expression
      val try_: ?loc:loc -> ?attrs:attrs -> expression -> case list -> expression
      val tuple: ?loc:loc -> ?attrs:attrs -> expression list -> expression
      val construct: ?loc:loc -> ?attrs:attrs -> lid -> expression option
                     -> expression
      val variant: ?loc:loc -> ?attrs:attrs -> label -> expression option
                   -> expression
      val record: ?loc:loc -> ?attrs:attrs -> (lid * expression) list
                  -> expression option -> expression
      val field: ?loc:loc -> ?attrs:attrs -> expression -> lid -> expression
      val setfield: ?loc:loc -> ?attrs:attrs -> expression -> lid -> expression
                    -> expression
      val array: ?loc:loc -> ?attrs:attrs -> expression list -> expression
      val ifthenelse: ?loc:loc -> ?attrs:attrs -> expression -> expression
                      -> expression option -> expression
      val sequence: ?loc:loc -> ?attrs:attrs -> expression -> expression
                    -> expression
      val while_: ?loc:loc -> ?attrs:attrs -> expression -> expression
                  -> expression
      val for_: ?loc:loc -> ?attrs:attrs -> pattern -> expression -> expression
                -> direction_flag -> expression -> expression
      val coerce: ?loc:loc -> ?attrs:attrs -> expression -> core_type option
                  -> core_type -> expression
      val constraint_: ?loc:loc -> ?attrs:attrs -> expression -> core_type
                       -> expression
      val send: ?loc:loc -> ?attrs:attrs -> expression -> string -> expression
      val new_: ?loc:loc -> ?attrs:attrs -> lid -> expression
      val setinstvar: ?loc:loc -> ?attrs:attrs -> str -> expression -> expression
      val override: ?loc:loc -> ?attrs:attrs -> (str * expression) list
                    -> expression
      val letmodule: ?loc:loc -> ?attrs:attrs -> str -> module_expr -> expression
                     -> expression
      val letexception:
        ?loc:loc -> ?attrs:attrs -> extension_constructor -> expression
        -> expression
      val assert_: ?loc:loc -> ?attrs:attrs -> expression -> expression
      val lazy_: ?loc:loc -> ?attrs:attrs -> expression -> expression
      val poly: ?loc:loc -> ?attrs:attrs -> expression -> core_type option
                -> expression
      val object_: ?loc:loc -> ?attrs:attrs -> class_structure -> expression
      val newtype: ?loc:loc -> ?attrs:attrs -> string -> expression -> expression
      val pack: ?loc:loc -> ?attrs:attrs -> module_expr -> expression
      val open_: ?loc:loc -> ?attrs:attrs -> override_flag -> lid -> expression
                 -> expression
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> expression
      val unreachable: ?loc:loc -> ?attrs:attrs -> unit -> expression

      val case: pattern -> ?guard:expression -> expression -> case
    end

  (** Value declarations *)
  module Val:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs ->
        ?prim:string list -> str -> core_type -> value_description
    end

  (** Type declarations *)
  module Type:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text ->
        ?params:(core_type * variance) list ->
        ?cstrs:(core_type * core_type * loc) list ->
        ?kind:type_kind -> ?priv:private_flag -> ?manifest:core_type -> str ->
        type_declaration

      val constructor: ?loc:loc -> ?attrs:attrs -> ?info:info ->
        ?args:constructor_arguments -> ?res:core_type -> str ->
        constructor_declaration
      val field: ?loc:loc -> ?attrs:attrs -> ?info:info ->
        ?mut:mutable_flag -> str -> core_type -> label_declaration
    end

  (** Type extensions *)
  module Te:
    sig
      val mk: ?attrs:attrs -> ?docs:docs ->
        ?params:(core_type * variance) list -> ?priv:private_flag ->
        lid -> extension_constructor list -> type_extension

      val constructor: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?info:info ->
        str -> extension_constructor_kind -> extension_constructor

      val decl: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?info:info ->
        ?args:constructor_arguments -> ?res:core_type -> str ->
        extension_constructor
      val rebind: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?info:info ->
        str -> lid -> extension_constructor
    end

  (** {2 Module language} *)

  (** Module type expressions *)
  module Mty:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> module_type_desc -> module_type
      val attr: module_type -> attribute -> module_type

      val ident: ?loc:loc -> ?attrs:attrs -> lid -> module_type
      val alias: ?loc:loc -> ?attrs:attrs -> lid -> module_type
      val signature: ?loc:loc -> ?attrs:attrs -> signature -> module_type
      val functor_: ?loc:loc -> ?attrs:attrs ->
        str -> module_type option -> module_type -> module_type
      val with_: ?loc:loc -> ?attrs:attrs -> module_type ->
        with_constraint list -> module_type
      val typeof_: ?loc:loc -> ?attrs:attrs -> module_expr -> module_type
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> module_type
    end

  (** Module expressions *)
  module Mod:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> module_expr_desc -> module_expr
      val attr: module_expr -> attribute -> module_expr

      val ident: ?loc:loc -> ?attrs:attrs -> lid -> module_expr
      val structure: ?loc:loc -> ?attrs:attrs -> structure -> module_expr
      val functor_: ?loc:loc -> ?attrs:attrs ->
        str -> module_type option -> module_expr -> module_expr
      val apply: ?loc:loc -> ?attrs:attrs -> module_expr -> module_expr ->
        module_expr
      val constraint_: ?loc:loc -> ?attrs:attrs -> module_expr -> module_type ->
        module_expr
      val unpack: ?loc:loc -> ?attrs:attrs -> expression -> module_expr
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> module_expr
    end

  (** Signature items *)
  module Sig:
    sig
      val mk: ?loc:loc -> signature_item_desc -> signature_item

      val value: ?loc:loc -> value_description -> signature_item
      val type_: ?loc:loc -> rec_flag -> type_declaration list -> signature_item
      val type_extension: ?loc:loc -> type_extension -> signature_item
      val exception_: ?loc:loc -> extension_constructor -> signature_item
      val module_: ?loc:loc -> module_declaration -> signature_item
      val rec_module: ?loc:loc -> module_declaration list -> signature_item
      val modtype: ?loc:loc -> module_type_declaration -> signature_item
      val open_: ?loc:loc -> open_description -> signature_item
      val include_: ?loc:loc -> include_description -> signature_item
      val class_: ?loc:loc -> class_description list -> signature_item
      val class_type: ?loc:loc -> class_type_declaration list -> signature_item
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> signature_item
      val attribute: ?loc:loc -> attribute -> signature_item
      val text: text -> signature_item list
    end

  (** Structure items *)
  module Str:
    sig
      val mk: ?loc:loc -> structure_item_desc -> structure_item

      val eval: ?loc:loc -> ?attrs:attributes -> expression -> structure_item
      val value: ?loc:loc -> rec_flag -> value_binding list -> structure_item
      val primitive: ?loc:loc -> value_description -> structure_item
      val type_: ?loc:loc -> rec_flag -> type_declaration list -> structure_item
      val type_extension: ?loc:loc -> type_extension -> structure_item
      val exception_: ?loc:loc -> extension_constructor -> structure_item
      val module_: ?loc:loc -> module_binding -> structure_item
      val rec_module: ?loc:loc -> module_binding list -> structure_item
      val modtype: ?loc:loc -> module_type_declaration -> structure_item
      val open_: ?loc:loc -> open_description -> structure_item
      val class_: ?loc:loc -> class_declaration list -> structure_item
      val class_type: ?loc:loc -> class_type_declaration list -> structure_item
      val include_: ?loc:loc -> include_declaration -> structure_item
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> structure_item
      val attribute: ?loc:loc -> attribute -> structure_item
      val text: text -> structure_item list
    end

  (** Module declarations *)
  module Md:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text ->
        str -> module_type -> module_declaration
    end

  (** Module type declarations *)
  module Mtd:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text ->
        ?typ:module_type -> str -> module_type_declaration
    end

  (** Module bindings *)
  module Mb:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text ->
        str -> module_expr -> module_binding
    end

  (** Opens *)
  module Opn:
    sig
      val mk: ?loc: loc -> ?attrs:attrs -> ?docs:docs ->
        ?override:override_flag -> lid -> open_description
    end

  (** Includes *)
  module Incl:
    sig
      val mk: ?loc: loc -> ?attrs:attrs -> ?docs:docs -> 'a -> 'a include_infos
    end

  (** Value bindings *)
  module Vb:
    sig
      val mk: ?loc: loc -> ?attrs:attrs -> ?docs:docs -> ?text:text ->
        pattern -> expression -> value_binding
    end


  (** {2 Class language} *)

  (** Class type expressions *)
  module Cty:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> class_type_desc -> class_type
      val attr: class_type -> attribute -> class_type

      val constr: ?loc:loc -> ?attrs:attrs -> lid -> core_type list -> class_type
      val signature: ?loc:loc -> ?attrs:attrs -> class_signature -> class_type
      val arrow: ?loc:loc -> ?attrs:attrs -> arg_label -> core_type ->
        class_type -> class_type
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> class_type
    end

  (** Class type fields *)
  module Ctf:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs ->
        class_type_field_desc -> class_type_field
      val attr: class_type_field -> attribute -> class_type_field

      val inherit_: ?loc:loc -> ?attrs:attrs -> class_type -> class_type_field
      val val_: ?loc:loc -> ?attrs:attrs -> string -> mutable_flag ->
        virtual_flag -> core_type -> class_type_field
      val method_: ?loc:loc -> ?attrs:attrs -> string -> private_flag ->
        virtual_flag -> core_type -> class_type_field
      val constraint_: ?loc:loc -> ?attrs:attrs -> core_type -> core_type ->
        class_type_field
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> class_type_field
      val attribute: ?loc:loc -> attribute -> class_type_field
      val text: text -> class_type_field list
    end

  (** Class expressions *)
  module Cl:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> class_expr_desc -> class_expr
      val attr: class_expr -> attribute -> class_expr

      val constr: ?loc:loc -> ?attrs:attrs -> lid -> core_type list -> class_expr
      val structure: ?loc:loc -> ?attrs:attrs -> class_structure -> class_expr
      val fun_: ?loc:loc -> ?attrs:attrs -> arg_label -> expression option ->
        pattern -> class_expr -> class_expr
      val apply: ?loc:loc -> ?attrs:attrs -> class_expr ->
        (arg_label * expression) list -> class_expr
      val let_: ?loc:loc -> ?attrs:attrs -> rec_flag -> value_binding list ->
        class_expr -> class_expr
      val constraint_: ?loc:loc -> ?attrs:attrs -> class_expr -> class_type ->
        class_expr
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> class_expr
    end

  (** Class fields *)
  module Cf:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> class_field_desc ->
        class_field
      val attr: class_field -> attribute -> class_field

      val inherit_: ?loc:loc -> ?attrs:attrs -> override_flag -> class_expr ->
        string option -> class_field
      val val_: ?loc:loc -> ?attrs:attrs -> str -> mutable_flag ->
        class_field_kind -> class_field
      val method_: ?loc:loc -> ?attrs:attrs -> str -> private_flag ->
        class_field_kind -> class_field
      val constraint_: ?loc:loc -> ?attrs:attrs -> core_type -> core_type ->
        class_field
      val initializer_: ?loc:loc -> ?attrs:attrs -> expression -> class_field
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> class_field
      val attribute: ?loc:loc -> attribute -> class_field
      val text: text -> class_field list

      val virtual_: core_type -> class_field_kind
      val concrete: override_flag -> expression -> class_field_kind

    end

  (** Classes *)
  module Ci:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text ->
        ?virt:virtual_flag -> ?params:(core_type * variance) list ->
        str -> 'a -> 'a class_infos
    end

  (** Class signatures *)
  module Csig:
    sig
      val mk: core_type -> class_type_field list -> class_signature
    end

  (** Class structures *)
  module Cstr:
    sig
      val mk: pattern -> class_field list -> class_structure
    end

end = struct
  (** Helpers to produce Parsetree fragments *)

  open Asttypes
  open Parsetree
  open Docstrings

  type lid = Longident.t loc
  type str = string loc
  type loc = Location.t
  type attrs = attribute list

  let default_loc = ref Location.none

  let with_default_loc l f =
    let old = !default_loc in
    default_loc := l;
    try let r = f () in default_loc := old; r
    with exn -> default_loc := old; raise exn

  module Const = struct
    let integer ?suffix i = Pconst_integer (i, suffix)
    let int ?suffix i = integer ?suffix (string_of_int i)
    let int32 ?(suffix='l') i = integer ~suffix (Int32.to_string i)
    let int64 ?(suffix='L') i = integer ~suffix (Int64.to_string i)
    let nativeint ?(suffix='n') i = integer ~suffix (Nativeint.to_string i)
    let float ?suffix f = Pconst_float (f, suffix)
    let char c = Pconst_char c
    let string ?quotation_delimiter s = Pconst_string (s, quotation_delimiter)
  end

  module Typ = struct
    let mk ?(loc = !default_loc) ?(attrs = []) d =
      {ptyp_desc = d; ptyp_loc = loc; ptyp_attributes = attrs}
    let attr d a = {d with ptyp_attributes = d.ptyp_attributes @ [a]}

    let any ?loc ?attrs () = mk ?loc ?attrs Ptyp_any
    let var ?loc ?attrs a = mk ?loc ?attrs (Ptyp_var a)
    let arrow ?loc ?attrs a b c = mk ?loc ?attrs (Ptyp_arrow (a, b, c))
    let tuple ?loc ?attrs a = mk ?loc ?attrs (Ptyp_tuple a)
    let constr ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_constr (a, b))
    let object_ ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_object (a, b))
    let class_ ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_class (a, b))
    let alias ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_alias (a, b))
    let variant ?loc ?attrs a b c = mk ?loc ?attrs (Ptyp_variant (a, b, c))
    let poly ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_poly (a, b))
    let package ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_package (a, b))
    let extension ?loc ?attrs a = mk ?loc ?attrs (Ptyp_extension a)

    let force_poly t =
      match t.ptyp_desc with
      | Ptyp_poly _ -> t
      | _ -> poly ~loc:t.ptyp_loc [] t (* -> ghost? *)
  end

  module Pat = struct
    let mk ?(loc = !default_loc) ?(attrs = []) d =
      {ppat_desc = d; ppat_loc = loc; ppat_attributes = attrs}
    let attr d a = {d with ppat_attributes = d.ppat_attributes @ [a]}

    let any ?loc ?attrs () = mk ?loc ?attrs Ppat_any
    let var ?loc ?attrs a = mk ?loc ?attrs (Ppat_var a)
    let alias ?loc ?attrs a b = mk ?loc ?attrs (Ppat_alias (a, b))
    let constant ?loc ?attrs a = mk ?loc ?attrs (Ppat_constant a)
    let interval ?loc ?attrs a b = mk ?loc ?attrs (Ppat_interval (a, b))
    let tuple ?loc ?attrs a = mk ?loc ?attrs (Ppat_tuple a)
    let construct ?loc ?attrs a b = mk ?loc ?attrs (Ppat_construct (a, b))
    let variant ?loc ?attrs a b = mk ?loc ?attrs (Ppat_variant (a, b))
    let record ?loc ?attrs a b = mk ?loc ?attrs (Ppat_record (a, b))
    let array ?loc ?attrs a = mk ?loc ?attrs (Ppat_array a)
    let or_ ?loc ?attrs a b = mk ?loc ?attrs (Ppat_or (a, b))
    let constraint_ ?loc ?attrs a b = mk ?loc ?attrs (Ppat_constraint (a, b))
    let type_ ?loc ?attrs a = mk ?loc ?attrs (Ppat_type a)
    let lazy_ ?loc ?attrs a = mk ?loc ?attrs (Ppat_lazy a)
    let unpack ?loc ?attrs a = mk ?loc ?attrs (Ppat_unpack a)
    let open_ ?loc ?attrs a b = mk ?loc ?attrs (Ppat_open (a, b))
    let exception_ ?loc ?attrs a = mk ?loc ?attrs (Ppat_exception a)
    let extension ?loc ?attrs a = mk ?loc ?attrs (Ppat_extension a)
  end

  module Exp = struct
    let mk ?(loc = !default_loc) ?(attrs = []) d =
      {pexp_desc = d; pexp_loc = loc; pexp_attributes = attrs}
    let attr d a = {d with pexp_attributes = d.pexp_attributes @ [a]}

    let ident ?loc ?attrs a = mk ?loc ?attrs (Pexp_ident a)
    let constant ?loc ?attrs a = mk ?loc ?attrs (Pexp_constant a)
    let let_ ?loc ?attrs a b c = mk ?loc ?attrs (Pexp_let (a, b, c))
    let fun_ ?loc ?attrs a b c d = mk ?loc ?attrs (Pexp_fun (a, b, c, d))
    let function_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_function a)
    let apply ?loc ?attrs a b = mk ?loc ?attrs (Pexp_apply (a, b))
    let match_ ?loc ?attrs a b = mk ?loc ?attrs (Pexp_match (a, b))
    let try_ ?loc ?attrs a b = mk ?loc ?attrs (Pexp_try (a, b))
    let tuple ?loc ?attrs a = mk ?loc ?attrs (Pexp_tuple a)
    let construct ?loc ?attrs a b = mk ?loc ?attrs (Pexp_construct (a, b))
    let variant ?loc ?attrs a b = mk ?loc ?attrs (Pexp_variant (a, b))
    let record ?loc ?attrs a b = mk ?loc ?attrs (Pexp_record (a, b))
    let field ?loc ?attrs a b = mk ?loc ?attrs (Pexp_field (a, b))
    let setfield ?loc ?attrs a b c = mk ?loc ?attrs (Pexp_setfield (a, b, c))
    let array ?loc ?attrs a = mk ?loc ?attrs (Pexp_array a)
    let ifthenelse ?loc ?attrs a b c = mk ?loc ?attrs (Pexp_ifthenelse (a, b, c))
    let sequence ?loc ?attrs a b = mk ?loc ?attrs (Pexp_sequence (a, b))
    let while_ ?loc ?attrs a b = mk ?loc ?attrs (Pexp_while (a, b))
    let for_ ?loc ?attrs a b c d e = mk ?loc ?attrs (Pexp_for (a, b, c, d, e))
    let constraint_ ?loc ?attrs a b = mk ?loc ?attrs (Pexp_constraint (a, b))
    let coerce ?loc ?attrs a b c = mk ?loc ?attrs (Pexp_coerce (a, b, c))
    let send ?loc ?attrs a b = mk ?loc ?attrs (Pexp_send (a, b))
    let new_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_new a)
    let setinstvar ?loc ?attrs a b = mk ?loc ?attrs (Pexp_setinstvar (a, b))
    let override ?loc ?attrs a = mk ?loc ?attrs (Pexp_override a)
    let letmodule ?loc ?attrs a b c= mk ?loc ?attrs (Pexp_letmodule (a, b, c))
    let letexception ?loc ?attrs a b = mk ?loc ?attrs (Pexp_letexception (a, b))
    let assert_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_assert a)
    let lazy_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_lazy a)
    let poly ?loc ?attrs a b = mk ?loc ?attrs (Pexp_poly (a, b))
    let object_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_object a)
    let newtype ?loc ?attrs a b = mk ?loc ?attrs (Pexp_newtype (a, b))
    let pack ?loc ?attrs a = mk ?loc ?attrs (Pexp_pack a)
    let open_ ?loc ?attrs a b c = mk ?loc ?attrs (Pexp_open (a, b, c))
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pexp_extension a)
    let unreachable ?loc ?attrs () = mk ?loc ?attrs Pexp_unreachable

    let case lhs ?guard rhs =
      {
       pc_lhs = lhs;
       pc_guard = guard;
       pc_rhs = rhs;
      }
  end

  module Mty = struct
    let mk ?(loc = !default_loc) ?(attrs = []) d =
      {pmty_desc = d; pmty_loc = loc; pmty_attributes = attrs}
    let attr d a = {d with pmty_attributes = d.pmty_attributes @ [a]}

    let ident ?loc ?attrs a = mk ?loc ?attrs (Pmty_ident a)
    let alias ?loc ?attrs a = mk ?loc ?attrs (Pmty_alias a)
    let signature ?loc ?attrs a = mk ?loc ?attrs (Pmty_signature a)
    let functor_ ?loc ?attrs a b c = mk ?loc ?attrs (Pmty_functor (a, b, c))
    let with_ ?loc ?attrs a b = mk ?loc ?attrs (Pmty_with (a, b))
    let typeof_ ?loc ?attrs a = mk ?loc ?attrs (Pmty_typeof a)
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pmty_extension a)
  end

  module Mod = struct
  let mk ?(loc = !default_loc) ?(attrs = []) d =
    {pmod_desc = d; pmod_loc = loc; pmod_attributes = attrs}
    let attr d a = {d with pmod_attributes = d.pmod_attributes @ [a]}

    let ident ?loc ?attrs x = mk ?loc ?attrs (Pmod_ident x)
    let structure ?loc ?attrs x = mk ?loc ?attrs (Pmod_structure x)
    let functor_ ?loc ?attrs arg arg_ty body =
      mk ?loc ?attrs (Pmod_functor (arg, arg_ty, body))
    let apply ?loc ?attrs m1 m2 = mk ?loc ?attrs (Pmod_apply (m1, m2))
    let constraint_ ?loc ?attrs m mty = mk ?loc ?attrs (Pmod_constraint (m, mty))
    let unpack ?loc ?attrs e = mk ?loc ?attrs (Pmod_unpack e)
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pmod_extension a)
  end

  module Sig = struct
    let mk ?(loc = !default_loc) d = {psig_desc = d; psig_loc = loc}

    let value ?loc a = mk ?loc (Psig_value a)
    let type_ ?loc rec_flag a = mk ?loc (Psig_type (rec_flag, a))
    let type_extension ?loc a = mk ?loc (Psig_typext a)
    let exception_ ?loc a = mk ?loc (Psig_exception a)
    let module_ ?loc a = mk ?loc (Psig_module a)
    let rec_module ?loc a = mk ?loc (Psig_recmodule a)
    let modtype ?loc a = mk ?loc (Psig_modtype a)
    let open_ ?loc a = mk ?loc (Psig_open a)
    let include_ ?loc a = mk ?loc (Psig_include a)
    let class_ ?loc a = mk ?loc (Psig_class a)
    let class_type ?loc a = mk ?loc (Psig_class_type a)
    let extension ?loc ?(attrs = []) a = mk ?loc (Psig_extension (a, attrs))
    let attribute ?loc a = mk ?loc (Psig_attribute a)
    let text txt =
      let f_txt = List.filter (fun ds -> docstring_body ds <> "") txt in
      List.map
        (fun ds -> attribute ~loc:(docstring_loc ds) (text_attr ds))
        f_txt
  end

  module Str = struct
    let mk ?(loc = !default_loc) d = {pstr_desc = d; pstr_loc = loc}

    let eval ?loc ?(attrs = []) a = mk ?loc (Pstr_eval (a, attrs))
    let value ?loc a b = mk ?loc (Pstr_value (a, b))
    let primitive ?loc a = mk ?loc (Pstr_primitive a)
    let type_ ?loc rec_flag a = mk ?loc (Pstr_type (rec_flag, a))
    let type_extension ?loc a = mk ?loc (Pstr_typext a)
    let exception_ ?loc a = mk ?loc (Pstr_exception a)
    let module_ ?loc a = mk ?loc (Pstr_module a)
    let rec_module ?loc a = mk ?loc (Pstr_recmodule a)
    let modtype ?loc a = mk ?loc (Pstr_modtype a)
    let open_ ?loc a = mk ?loc (Pstr_open a)
    let class_ ?loc a = mk ?loc (Pstr_class a)
    let class_type ?loc a = mk ?loc (Pstr_class_type a)
    let include_ ?loc a = mk ?loc (Pstr_include a)
    let extension ?loc ?(attrs = []) a = mk ?loc (Pstr_extension (a, attrs))
    let attribute ?loc a = mk ?loc (Pstr_attribute a)
    let text txt =
      let f_txt = List.filter (fun ds -> docstring_body ds <> "") txt in
      List.map
        (fun ds -> attribute ~loc:(docstring_loc ds) (text_attr ds))
        f_txt
  end

  module Cl = struct
    let mk ?(loc = !default_loc) ?(attrs = []) d =
      {
       pcl_desc = d;
       pcl_loc = loc;
       pcl_attributes = attrs;
      }
    let attr d a = {d with pcl_attributes = d.pcl_attributes @ [a]}

    let constr ?loc ?attrs a b = mk ?loc ?attrs (Pcl_constr (a, b))
    let structure ?loc ?attrs a = mk ?loc ?attrs (Pcl_structure a)
    let fun_ ?loc ?attrs a b c d = mk ?loc ?attrs (Pcl_fun (a, b, c, d))
    let apply ?loc ?attrs a b = mk ?loc ?attrs (Pcl_apply (a, b))
    let let_ ?loc ?attrs a b c = mk ?loc ?attrs (Pcl_let (a, b, c))
    let constraint_ ?loc ?attrs a b = mk ?loc ?attrs (Pcl_constraint (a, b))
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pcl_extension a)
  end

  module Cty = struct
    let mk ?(loc = !default_loc) ?(attrs = []) d =
      {
       pcty_desc = d;
       pcty_loc = loc;
       pcty_attributes = attrs;
      }
    let attr d a = {d with pcty_attributes = d.pcty_attributes @ [a]}

    let constr ?loc ?attrs a b = mk ?loc ?attrs (Pcty_constr (a, b))
    let signature ?loc ?attrs a = mk ?loc ?attrs (Pcty_signature a)
    let arrow ?loc ?attrs a b c = mk ?loc ?attrs (Pcty_arrow (a, b, c))
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pcty_extension a)
  end

  module Ctf = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
             ?(docs = empty_docs) d =
      {
       pctf_desc = d;
       pctf_loc = loc;
       pctf_attributes = add_docs_attrs docs attrs;
      }

    let inherit_ ?loc ?attrs a = mk ?loc ?attrs (Pctf_inherit a)
    let val_ ?loc ?attrs a b c d = mk ?loc ?attrs (Pctf_val (a, b, c, d))
    let method_ ?loc ?attrs a b c d = mk ?loc ?attrs (Pctf_method (a, b, c, d))
    let constraint_ ?loc ?attrs a b = mk ?loc ?attrs (Pctf_constraint (a, b))
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pctf_extension a)
    let attribute ?loc a = mk ?loc (Pctf_attribute a)
    let text txt =
     let f_txt = List.filter (fun ds -> docstring_body ds <> "") txt in
       List.map
        (fun ds -> attribute ~loc:(docstring_loc ds) (text_attr ds))
        f_txt

    let attr d a = {d with pctf_attributes = d.pctf_attributes @ [a]}

  end

  module Cf = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) d =
      {
       pcf_desc = d;
       pcf_loc = loc;
       pcf_attributes = add_docs_attrs docs attrs;
      }

    let inherit_ ?loc ?attrs a b c = mk ?loc ?attrs (Pcf_inherit (a, b, c))
    let val_ ?loc ?attrs a b c = mk ?loc ?attrs (Pcf_val (a, b, c))
    let method_ ?loc ?attrs a b c = mk ?loc ?attrs (Pcf_method (a, b, c))
    let constraint_ ?loc ?attrs a b = mk ?loc ?attrs (Pcf_constraint (a, b))
    let initializer_ ?loc ?attrs a = mk ?loc ?attrs (Pcf_initializer a)
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pcf_extension a)
    let attribute ?loc a = mk ?loc (Pcf_attribute a)
    let text txt =
      let f_txt = List.filter (fun ds -> docstring_body ds <> "") txt in
      List.map
        (fun ds -> attribute ~loc:(docstring_loc ds) (text_attr ds))
        f_txt

    let virtual_ ct = Cfk_virtual ct
    let concrete o e = Cfk_concrete (o, e)

    let attr d a = {d with pcf_attributes = d.pcf_attributes @ [a]}

  end

  module Val = struct
    let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs)
          ?(prim = []) name typ =
      {
       pval_name = name;
       pval_type = typ;
       pval_attributes = add_docs_attrs docs attrs;
       pval_loc = loc;
       pval_prim = prim;
      }
  end

  module Md = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(text = []) name typ =
      {
       pmd_name = name;
       pmd_type = typ;
       pmd_attributes =
         add_text_attrs text (add_docs_attrs docs attrs);
       pmd_loc = loc;
      }
  end

  module Mtd = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(text = []) ?typ name =
      {
       pmtd_name = name;
       pmtd_type = typ;
       pmtd_attributes =
         add_text_attrs text (add_docs_attrs docs attrs);
       pmtd_loc = loc;
      }
  end

  module Mb = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(text = []) name expr =
      {
       pmb_name = name;
       pmb_expr = expr;
       pmb_attributes =
         add_text_attrs text (add_docs_attrs docs attrs);
       pmb_loc = loc;
      }
  end

  module Opn = struct
    let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs)
          ?(override = Fresh) lid =
      {
       popen_lid = lid;
       popen_override = override;
       popen_loc = loc;
       popen_attributes = add_docs_attrs docs attrs;
      }
  end

  module Incl = struct
    let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs) mexpr =
      {
       pincl_mod = mexpr;
       pincl_loc = loc;
       pincl_attributes = add_docs_attrs docs attrs;
      }

  end

  module Vb = struct
    let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs)
          ?(text = []) pat expr =
      {
       pvb_pat = pat;
       pvb_expr = expr;
       pvb_attributes =
         add_text_attrs text (add_docs_attrs docs attrs);
       pvb_loc = loc;
      }
  end

  module Ci = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(text = [])
          ?(virt = Concrete) ?(params = []) name expr =
      {
       pci_virt = virt;
       pci_params = params;
       pci_name = name;
       pci_expr = expr;
       pci_attributes =
         add_text_attrs text (add_docs_attrs docs attrs);
       pci_loc = loc;
      }
  end

  module Type = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(text = [])
        ?(params = [])
        ?(cstrs = [])
        ?(kind = Ptype_abstract)
        ?(priv = Public)
        ?manifest
        name =
      {
       ptype_name = name;
       ptype_params = params;
       ptype_cstrs = cstrs;
       ptype_kind = kind;
       ptype_private = priv;
       ptype_manifest = manifest;
       ptype_attributes =
         add_text_attrs text (add_docs_attrs docs attrs);
       ptype_loc = loc;
      }

    let constructor ?(loc = !default_loc) ?(attrs = []) ?(info = empty_info)
          ?(args = Pcstr_tuple []) ?res name =
      {
       pcd_name = name;
       pcd_args = args;
       pcd_res = res;
       pcd_loc = loc;
       pcd_attributes = add_info_attrs info attrs;
      }

    let field ?(loc = !default_loc) ?(attrs = []) ?(info = empty_info)
          ?(mut = Immutable) name typ =
      {
       pld_name = name;
       pld_mutable = mut;
       pld_type = typ;
       pld_loc = loc;
       pld_attributes = add_info_attrs info attrs;
      }

  end

  (** Type extensions *)
  module Te = struct
    let mk ?(attrs = []) ?(docs = empty_docs)
          ?(params = []) ?(priv = Public) path constructors =
      {
       ptyext_path = path;
       ptyext_params = params;
       ptyext_constructors = constructors;
       ptyext_private = priv;
       ptyext_attributes = add_docs_attrs docs attrs;
      }

    let constructor ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(info = empty_info) name kind =
      {
       pext_name = name;
       pext_kind = kind;
       pext_loc = loc;
       pext_attributes = add_docs_attrs docs (add_info_attrs info attrs);
      }

    let decl ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs)
               ?(info = empty_info) ?(args = Pcstr_tuple []) ?res name =
      {
       pext_name = name;
       pext_kind = Pext_decl(args, res);
       pext_loc = loc;
       pext_attributes = add_docs_attrs docs (add_info_attrs info attrs);
      }

    let rebind ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(info = empty_info) name lid =
      {
       pext_name = name;
       pext_kind = Pext_rebind lid;
       pext_loc = loc;
       pext_attributes = add_docs_attrs docs (add_info_attrs info attrs);
      }

  end

  module Csig = struct
    let mk self fields =
      {
       pcsig_self = self;
       pcsig_fields = fields;
      }
  end

  module Cstr = struct
    let mk self fields =
      {
       pcstr_self = self;
       pcstr_fields = fields;
      }
  end

end

module Ast_mapper : sig
  (** The interface of a -ppx rewriter

    A -ppx rewriter is a program that accepts a serialized abstract syntax
    tree and outputs another, possibly modified, abstract syntax tree.
    This module encapsulates the interface between the compiler and
    the -ppx rewriters, handling such details as the serialization format,
    forwarding of command-line flags, and storing state.

    {!mapper} allows to implement AST rewriting using open recursion.
    A typical mapper would be based on {!default_mapper}, a deep
    identity mapper, and will fall back on it for handling the syntax it
    does not modify. For example:

    {[
  open Asttypes
  open Parsetree
  open Ast_mapper

  let test_mapper argv =
    { default_mapper with
      expr = fun mapper expr ->
        match expr with
        | { pexp_desc = Pexp_extension ({ txt = "test" }, PStr [])} ->
          Ast_helper.Exp.constant (Const_int 42)
        | other -> default_mapper.expr mapper other; }

  let () =
    register "ppx_test" test_mapper]}

    This -ppx rewriter, which replaces [[%test]] in expressions with
    the constant [42], can be compiled using
    [ocamlc -o ppx_test -I +compiler-libs ocamlcommon.cma ppx_test.ml].

    *)

  open Parsetree

  (** {2 A generic Parsetree mapper} *)

  type mapper (*IF_CURRENT = Ast_mapper.mapper*) = {
    attribute: mapper -> attribute -> attribute;
    attributes: mapper -> attribute list -> attribute list;
    case: mapper -> case -> case;
    cases: mapper -> case list -> case list;
    class_declaration: mapper -> class_declaration -> class_declaration;
    class_description: mapper -> class_description -> class_description;
    class_expr: mapper -> class_expr -> class_expr;
    class_field: mapper -> class_field -> class_field;
    class_signature: mapper -> class_signature -> class_signature;
    class_structure: mapper -> class_structure -> class_structure;
    class_type: mapper -> class_type -> class_type;
    class_type_declaration: mapper -> class_type_declaration
                            -> class_type_declaration;
    class_type_field: mapper -> class_type_field -> class_type_field;
    constructor_declaration: mapper -> constructor_declaration
                             -> constructor_declaration;
    expr: mapper -> expression -> expression;
    extension: mapper -> extension -> extension;
    extension_constructor: mapper -> extension_constructor
                           -> extension_constructor;
    include_declaration: mapper -> include_declaration -> include_declaration;
    include_description: mapper -> include_description -> include_description;
    label_declaration: mapper -> label_declaration -> label_declaration;
    location: mapper -> Location.t -> Location.t;
    module_binding: mapper -> module_binding -> module_binding;
    module_declaration: mapper -> module_declaration -> module_declaration;
    module_expr: mapper -> module_expr -> module_expr;
    module_type: mapper -> module_type -> module_type;
    module_type_declaration: mapper -> module_type_declaration
                             -> module_type_declaration;
    open_description: mapper -> open_description -> open_description;
    pat: mapper -> pattern -> pattern;
    payload: mapper -> payload -> payload;
    signature: mapper -> signature -> signature;
    signature_item: mapper -> signature_item -> signature_item;
    structure: mapper -> structure -> structure;
    structure_item: mapper -> structure_item -> structure_item;
    typ: mapper -> core_type -> core_type;
    type_declaration: mapper -> type_declaration -> type_declaration;
    type_extension: mapper -> type_extension -> type_extension;
    type_kind: mapper -> type_kind -> type_kind;
    value_binding: mapper -> value_binding -> value_binding;
    value_description: mapper -> value_description -> value_description;
    with_constraint: mapper -> with_constraint -> with_constraint;
  }
  (** A mapper record implements one "method" per syntactic category,
      using an open recursion style: each method takes as its first
      argument the mapper to be applied to children in the syntax
      tree. *)

  val default_mapper: mapper
  (** A default mapper, which implements a "deep identity" mapping. *)

  (** {2 Convenience functions to write mappers} *)

  val map_opt: ('a -> 'b) -> 'a option -> 'b option

  val extension_of_error: Location.error -> extension
  (** Encode an error into an 'ocaml.error' extension node which can be
      inserted in a generated Parsetree.  The compiler will be
      responsible for reporting the error. *)

  val attribute_of_warning: Location.t -> string -> attribute
  (** Encode a warning message into an 'ocaml.ppwarning' attribute which can be
      inserted in a generated Parsetree.  The compiler will be
      responsible for reporting the warning. *)

end = struct
  (* A generic Parsetree mapping class *)

  (*
  [@@@ocaml.warning "+9"]
    (* Ensure that record patterns don't miss any field. *)
  *)


  open Parsetree
  open Ast_helper
  open Location

  type mapper (*IF_CURRENT = Ast_mapper.mapper*) = {
    attribute: mapper -> attribute -> attribute;
    attributes: mapper -> attribute list -> attribute list;
    case: mapper -> case -> case;
    cases: mapper -> case list -> case list;
    class_declaration: mapper -> class_declaration -> class_declaration;
    class_description: mapper -> class_description -> class_description;
    class_expr: mapper -> class_expr -> class_expr;
    class_field: mapper -> class_field -> class_field;
    class_signature: mapper -> class_signature -> class_signature;
    class_structure: mapper -> class_structure -> class_structure;
    class_type: mapper -> class_type -> class_type;
    class_type_declaration: mapper -> class_type_declaration
                            -> class_type_declaration;
    class_type_field: mapper -> class_type_field -> class_type_field;
    constructor_declaration: mapper -> constructor_declaration
                             -> constructor_declaration;
    expr: mapper -> expression -> expression;
    extension: mapper -> extension -> extension;
    extension_constructor: mapper -> extension_constructor
                           -> extension_constructor;
    include_declaration: mapper -> include_declaration -> include_declaration;
    include_description: mapper -> include_description -> include_description;
    label_declaration: mapper -> label_declaration -> label_declaration;
    location: mapper -> Location.t -> Location.t;
    module_binding: mapper -> module_binding -> module_binding;
    module_declaration: mapper -> module_declaration -> module_declaration;
    module_expr: mapper -> module_expr -> module_expr;
    module_type: mapper -> module_type -> module_type;
    module_type_declaration: mapper -> module_type_declaration
                             -> module_type_declaration;
    open_description: mapper -> open_description -> open_description;
    pat: mapper -> pattern -> pattern;
    payload: mapper -> payload -> payload;
    signature: mapper -> signature -> signature;
    signature_item: mapper -> signature_item -> signature_item;
    structure: mapper -> structure -> structure;
    structure_item: mapper -> structure_item -> structure_item;
    typ: mapper -> core_type -> core_type;
    type_declaration: mapper -> type_declaration -> type_declaration;
    type_extension: mapper -> type_extension -> type_extension;
    type_kind: mapper -> type_kind -> type_kind;
    value_binding: mapper -> value_binding -> value_binding;
    value_description: mapper -> value_description -> value_description;
    with_constraint: mapper -> with_constraint -> with_constraint;
  }

  let map_fst f (x, y) = (f x, y)
  let map_snd f (x, y) = (x, f y)
  let map_tuple f1 f2 (x, y) = (f1 x, f2 y)
  let map_tuple3 f1 f2 f3 (x, y, z) = (f1 x, f2 y, f3 z)
  let map_opt f = function None -> None | Some x -> Some (f x)

  let map_loc sub {loc; txt} = {loc = sub.location sub loc; txt}

  module T = struct
    (* Type expressions for the core language *)

    let row_field sub = function
      | Rtag (l, attrs, b, tl) ->
          Rtag (l, sub.attributes sub attrs, b, List.map (sub.typ sub) tl)
      | Rinherit t -> Rinherit (sub.typ sub t)

    let map sub {ptyp_desc = desc; ptyp_loc = loc; ptyp_attributes = attrs} =
      let open Typ in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Ptyp_any -> any ~loc ~attrs ()
      | Ptyp_var s -> var ~loc ~attrs s
      | Ptyp_arrow (lab, t1, t2) ->
          arrow ~loc ~attrs lab (sub.typ sub t1) (sub.typ sub t2)
      | Ptyp_tuple tyl -> tuple ~loc ~attrs (List.map (sub.typ sub) tyl)
      | Ptyp_constr (lid, tl) ->
          constr ~loc ~attrs (map_loc sub lid) (List.map (sub.typ sub) tl)
      | Ptyp_object (l, o) ->
          let f (s, a, t) = (s, sub.attributes sub a, sub.typ sub t) in
          object_ ~loc ~attrs (List.map f l) o
      | Ptyp_class (lid, tl) ->
          class_ ~loc ~attrs (map_loc sub lid) (List.map (sub.typ sub) tl)
      | Ptyp_alias (t, s) -> alias ~loc ~attrs (sub.typ sub t) s
      | Ptyp_variant (rl, b, ll) ->
          variant ~loc ~attrs (List.map (row_field sub) rl) b ll
      | Ptyp_poly (sl, t) -> poly ~loc ~attrs sl (sub.typ sub t)
      | Ptyp_package (lid, l) ->
          package ~loc ~attrs (map_loc sub lid)
            (List.map (map_tuple (map_loc sub) (sub.typ sub)) l)
      | Ptyp_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_type_declaration sub
        {ptype_name; ptype_params; ptype_cstrs;
         ptype_kind;
         ptype_private;
         ptype_manifest;
         ptype_attributes;
         ptype_loc} =
      Type.mk (map_loc sub ptype_name)
        ~params:(List.map (map_fst (sub.typ sub)) ptype_params)
        ~priv:ptype_private
        ~cstrs:(List.map
                  (map_tuple3 (sub.typ sub) (sub.typ sub) (sub.location sub))
                  ptype_cstrs)
        ~kind:(sub.type_kind sub ptype_kind)
        ?manifest:(map_opt (sub.typ sub) ptype_manifest)
        ~loc:(sub.location sub ptype_loc)
        ~attrs:(sub.attributes sub ptype_attributes)

    let map_type_kind sub = function
      | Ptype_abstract -> Ptype_abstract
      | Ptype_variant l ->
          Ptype_variant (List.map (sub.constructor_declaration sub) l)
      | Ptype_record l -> Ptype_record (List.map (sub.label_declaration sub) l)
      | Ptype_open -> Ptype_open

    let map_constructor_arguments sub = function
      | Pcstr_tuple l -> Pcstr_tuple (List.map (sub.typ sub) l)
      | Pcstr_record l ->
          Pcstr_record (List.map (sub.label_declaration sub) l)

    let map_type_extension sub
        {ptyext_path; ptyext_params;
         ptyext_constructors;
         ptyext_private;
         ptyext_attributes} =
      Te.mk
        (map_loc sub ptyext_path)
        (List.map (sub.extension_constructor sub) ptyext_constructors)
        ~params:(List.map (map_fst (sub.typ sub)) ptyext_params)
        ~priv:ptyext_private
        ~attrs:(sub.attributes sub ptyext_attributes)

    let map_extension_constructor_kind sub = function
        Pext_decl(ctl, cto) ->
          Pext_decl(map_constructor_arguments sub ctl, map_opt (sub.typ sub) cto)
      | Pext_rebind li ->
          Pext_rebind (map_loc sub li)

    let map_extension_constructor sub
        {pext_name;
         pext_kind;
         pext_loc;
         pext_attributes} =
      Te.constructor
        (map_loc sub pext_name)
        (map_extension_constructor_kind sub pext_kind)
        ~loc:(sub.location sub pext_loc)
        ~attrs:(sub.attributes sub pext_attributes)

  end

  module CT = struct
    (* Type expressions for the class language *)

    let map sub {pcty_loc = loc; pcty_desc = desc; pcty_attributes = attrs} =
      let open Cty in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pcty_constr (lid, tys) ->
          constr ~loc ~attrs (map_loc sub lid) (List.map (sub.typ sub) tys)
      | Pcty_signature x -> signature ~loc ~attrs (sub.class_signature sub x)
      | Pcty_arrow (lab, t, ct) ->
          arrow ~loc ~attrs lab (sub.typ sub t) (sub.class_type sub ct)
      | Pcty_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_field sub {pctf_desc = desc; pctf_loc = loc; pctf_attributes = attrs}
      =
      let open Ctf in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pctf_inherit ct -> inherit_ ~loc ~attrs (sub.class_type sub ct)
      | Pctf_val (s, m, v, t) -> val_ ~loc ~attrs s m v (sub.typ sub t)
      | Pctf_method (s, p, v, t) -> method_ ~loc ~attrs s p v (sub.typ sub t)
      | Pctf_constraint (t1, t2) ->
          constraint_ ~loc ~attrs (sub.typ sub t1) (sub.typ sub t2)
      | Pctf_attribute x -> attribute ~loc (sub.attribute sub x)
      | Pctf_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_signature sub {pcsig_self; pcsig_fields} =
      Csig.mk
        (sub.typ sub pcsig_self)
        (List.map (sub.class_type_field sub) pcsig_fields)
  end

  module MT = struct
    (* Type expressions for the module language *)

    let map sub {pmty_desc = desc; pmty_loc = loc; pmty_attributes = attrs} =
      let open Mty in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pmty_ident s -> ident ~loc ~attrs (map_loc sub s)
      | Pmty_alias s -> alias ~loc ~attrs (map_loc sub s)
      | Pmty_signature sg -> signature ~loc ~attrs (sub.signature sub sg)
      | Pmty_functor (s, mt1, mt2) ->
          functor_ ~loc ~attrs (map_loc sub s)
            (Misc.may_map (sub.module_type sub) mt1)
            (sub.module_type sub mt2)
      | Pmty_with (mt, l) ->
          with_ ~loc ~attrs (sub.module_type sub mt)
            (List.map (sub.with_constraint sub) l)
      | Pmty_typeof me -> typeof_ ~loc ~attrs (sub.module_expr sub me)
      | Pmty_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_with_constraint sub = function
      | Pwith_type (lid, d) ->
          Pwith_type (map_loc sub lid, sub.type_declaration sub d)
      | Pwith_module (lid, lid2) ->
          Pwith_module (map_loc sub lid, map_loc sub lid2)
      | Pwith_typesubst d -> Pwith_typesubst (sub.type_declaration sub d)
      | Pwith_modsubst (s, lid) ->
          Pwith_modsubst (map_loc sub s, map_loc sub lid)

    let map_signature_item sub {psig_desc = desc; psig_loc = loc} =
      let open Sig in
      let loc = sub.location sub loc in
      match desc with
      | Psig_value vd -> value ~loc (sub.value_description sub vd)
      | Psig_type (rf, l) -> type_ ~loc rf (List.map (sub.type_declaration sub) l)
      | Psig_typext te -> type_extension ~loc (sub.type_extension sub te)
      | Psig_exception ed -> exception_ ~loc (sub.extension_constructor sub ed)
      | Psig_module x -> module_ ~loc (sub.module_declaration sub x)
      | Psig_recmodule l ->
          rec_module ~loc (List.map (sub.module_declaration sub) l)
      | Psig_modtype x -> modtype ~loc (sub.module_type_declaration sub x)
      | Psig_open x -> open_ ~loc (sub.open_description sub x)
      | Psig_include x -> include_ ~loc (sub.include_description sub x)
      | Psig_class l -> class_ ~loc (List.map (sub.class_description sub) l)
      | Psig_class_type l ->
          class_type ~loc (List.map (sub.class_type_declaration sub) l)
      | Psig_extension (x, attrs) ->
          extension ~loc (sub.extension sub x) ~attrs:(sub.attributes sub attrs)
      | Psig_attribute x -> attribute ~loc (sub.attribute sub x)
  end


  module M = struct
    (* Value expressions for the module language *)

    let map sub {pmod_loc = loc; pmod_desc = desc; pmod_attributes = attrs} =
      let open Mod in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pmod_ident x -> ident ~loc ~attrs (map_loc sub x)
      | Pmod_structure str -> structure ~loc ~attrs (sub.structure sub str)
      | Pmod_functor (arg, arg_ty, body) ->
          functor_ ~loc ~attrs (map_loc sub arg)
            (Misc.may_map (sub.module_type sub) arg_ty)
            (sub.module_expr sub body)
      | Pmod_apply (m1, m2) ->
          apply ~loc ~attrs (sub.module_expr sub m1) (sub.module_expr sub m2)
      | Pmod_constraint (m, mty) ->
          constraint_ ~loc ~attrs (sub.module_expr sub m)
                      (sub.module_type sub mty)
      | Pmod_unpack e -> unpack ~loc ~attrs (sub.expr sub e)
      | Pmod_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_structure_item sub {pstr_loc = loc; pstr_desc = desc} =
      let open Str in
      let loc = sub.location sub loc in
      match desc with
      | Pstr_eval (x, attrs) ->
          eval ~loc ~attrs:(sub.attributes sub attrs) (sub.expr sub x)
      | Pstr_value (r, vbs) -> value ~loc r (List.map (sub.value_binding sub) vbs)
      | Pstr_primitive vd -> primitive ~loc (sub.value_description sub vd)
      | Pstr_type (rf, l) -> type_ ~loc rf (List.map (sub.type_declaration sub) l)
      | Pstr_typext te -> type_extension ~loc (sub.type_extension sub te)
      | Pstr_exception ed -> exception_ ~loc (sub.extension_constructor sub ed)
      | Pstr_module x -> module_ ~loc (sub.module_binding sub x)
      | Pstr_recmodule l -> rec_module ~loc (List.map (sub.module_binding sub) l)
      | Pstr_modtype x -> modtype ~loc (sub.module_type_declaration sub x)
      | Pstr_open x -> open_ ~loc (sub.open_description sub x)
      | Pstr_class l -> class_ ~loc (List.map (sub.class_declaration sub) l)
      | Pstr_class_type l ->
          class_type ~loc (List.map (sub.class_type_declaration sub) l)
      | Pstr_include x -> include_ ~loc (sub.include_declaration sub x)
      | Pstr_extension (x, attrs) ->
          extension ~loc (sub.extension sub x) ~attrs:(sub.attributes sub attrs)
      | Pstr_attribute x -> attribute ~loc (sub.attribute sub x)
  end

  module E = struct
    (* Value expressions for the core language *)

    let map sub {pexp_loc = loc; pexp_desc = desc; pexp_attributes = attrs} =
      let open Exp in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pexp_ident x -> ident ~loc ~attrs (map_loc sub x)
      | Pexp_constant x -> constant ~loc ~attrs x
      | Pexp_let (r, vbs, e) ->
          let_ ~loc ~attrs r (List.map (sub.value_binding sub) vbs)
            (sub.expr sub e)
      | Pexp_fun (lab, def, p, e) ->
          fun_ ~loc ~attrs lab (map_opt (sub.expr sub) def) (sub.pat sub p)
            (sub.expr sub e)
      | Pexp_function pel -> function_ ~loc ~attrs (sub.cases sub pel)
      | Pexp_apply (e, l) ->
          apply ~loc ~attrs (sub.expr sub e) (List.map (map_snd (sub.expr sub)) l)
      | Pexp_match (e, pel) ->
          match_ ~loc ~attrs (sub.expr sub e) (sub.cases sub pel)
      | Pexp_try (e, pel) -> try_ ~loc ~attrs (sub.expr sub e) (sub.cases sub pel)
      | Pexp_tuple el -> tuple ~loc ~attrs (List.map (sub.expr sub) el)
      | Pexp_construct (lid, arg) ->
          construct ~loc ~attrs (map_loc sub lid) (map_opt (sub.expr sub) arg)
      | Pexp_variant (lab, eo) ->
          variant ~loc ~attrs lab (map_opt (sub.expr sub) eo)
      | Pexp_record (l, eo) ->
          record ~loc ~attrs (List.map (map_tuple (map_loc sub) (sub.expr sub)) l)
            (map_opt (sub.expr sub) eo)
      | Pexp_field (e, lid) ->
          field ~loc ~attrs (sub.expr sub e) (map_loc sub lid)
      | Pexp_setfield (e1, lid, e2) ->
          setfield ~loc ~attrs (sub.expr sub e1) (map_loc sub lid)
            (sub.expr sub e2)
      | Pexp_array el -> array ~loc ~attrs (List.map (sub.expr sub) el)
      | Pexp_ifthenelse (e1, e2, e3) ->
          ifthenelse ~loc ~attrs (sub.expr sub e1) (sub.expr sub e2)
            (map_opt (sub.expr sub) e3)
      | Pexp_sequence (e1, e2) ->
          sequence ~loc ~attrs (sub.expr sub e1) (sub.expr sub e2)
      | Pexp_while (e1, e2) ->
          while_ ~loc ~attrs (sub.expr sub e1) (sub.expr sub e2)
      | Pexp_for (p, e1, e2, d, e3) ->
          for_ ~loc ~attrs (sub.pat sub p) (sub.expr sub e1) (sub.expr sub e2) d
            (sub.expr sub e3)
      | Pexp_coerce (e, t1, t2) ->
          coerce ~loc ~attrs (sub.expr sub e) (map_opt (sub.typ sub) t1)
            (sub.typ sub t2)
      | Pexp_constraint (e, t) ->
          constraint_ ~loc ~attrs (sub.expr sub e) (sub.typ sub t)
      | Pexp_send (e, s) -> send ~loc ~attrs (sub.expr sub e) s
      | Pexp_new lid -> new_ ~loc ~attrs (map_loc sub lid)
      | Pexp_setinstvar (s, e) ->
          setinstvar ~loc ~attrs (map_loc sub s) (sub.expr sub e)
      | Pexp_override sel ->
          override ~loc ~attrs
            (List.map (map_tuple (map_loc sub) (sub.expr sub)) sel)
      | Pexp_letmodule (s, me, e) ->
          letmodule ~loc ~attrs (map_loc sub s) (sub.module_expr sub me)
            (sub.expr sub e)
      | Pexp_letexception (cd, e) ->
          letexception ~loc ~attrs
            (sub.extension_constructor sub cd)
            (sub.expr sub e)
      | Pexp_assert e -> assert_ ~loc ~attrs (sub.expr sub e)
      | Pexp_lazy e -> lazy_ ~loc ~attrs (sub.expr sub e)
      | Pexp_poly (e, t) ->
          poly ~loc ~attrs (sub.expr sub e) (map_opt (sub.typ sub) t)
      | Pexp_object cls -> object_ ~loc ~attrs (sub.class_structure sub cls)
      | Pexp_newtype (s, e) -> newtype ~loc ~attrs s (sub.expr sub e)
      | Pexp_pack me -> pack ~loc ~attrs (sub.module_expr sub me)
      | Pexp_open (ovf, lid, e) ->
          open_ ~loc ~attrs ovf (map_loc sub lid) (sub.expr sub e)
      | Pexp_extension x -> extension ~loc ~attrs (sub.extension sub x)
      | Pexp_unreachable -> unreachable ~loc ~attrs ()
  end

  module P = struct
    (* Patterns *)

    let map sub {ppat_desc = desc; ppat_loc = loc; ppat_attributes = attrs} =
      let open Pat in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Ppat_any -> any ~loc ~attrs ()
      | Ppat_var s -> var ~loc ~attrs (map_loc sub s)
      | Ppat_alias (p, s) -> alias ~loc ~attrs (sub.pat sub p) (map_loc sub s)
      | Ppat_constant c -> constant ~loc ~attrs c
      | Ppat_interval (c1, c2) -> interval ~loc ~attrs c1 c2
      | Ppat_tuple pl -> tuple ~loc ~attrs (List.map (sub.pat sub) pl)
      | Ppat_construct (l, p) ->
          construct ~loc ~attrs (map_loc sub l) (map_opt (sub.pat sub) p)
      | Ppat_variant (l, p) -> variant ~loc ~attrs l (map_opt (sub.pat sub) p)
      | Ppat_record (lpl, cf) ->
          record ~loc ~attrs
                 (List.map (map_tuple (map_loc sub) (sub.pat sub)) lpl) cf
      | Ppat_array pl -> array ~loc ~attrs (List.map (sub.pat sub) pl)
      | Ppat_or (p1, p2) -> or_ ~loc ~attrs (sub.pat sub p1) (sub.pat sub p2)
      | Ppat_constraint (p, t) ->
          constraint_ ~loc ~attrs (sub.pat sub p) (sub.typ sub t)
      | Ppat_type s -> type_ ~loc ~attrs (map_loc sub s)
      | Ppat_lazy p -> lazy_ ~loc ~attrs (sub.pat sub p)
      | Ppat_unpack s -> unpack ~loc ~attrs (map_loc sub s)
      | Ppat_open (lid,p) -> open_ ~loc ~attrs (map_loc sub lid) (sub.pat sub p)
      | Ppat_exception p -> exception_ ~loc ~attrs (sub.pat sub p)
      | Ppat_extension x -> extension ~loc ~attrs (sub.extension sub x)
  end

  module CE = struct
    (* Value expressions for the class language *)

    let map sub {pcl_loc = loc; pcl_desc = desc; pcl_attributes = attrs} =
      let open Cl in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pcl_constr (lid, tys) ->
          constr ~loc ~attrs (map_loc sub lid) (List.map (sub.typ sub) tys)
      | Pcl_structure s ->
          structure ~loc ~attrs (sub.class_structure sub s)
      | Pcl_fun (lab, e, p, ce) ->
          fun_ ~loc ~attrs lab
            (map_opt (sub.expr sub) e)
            (sub.pat sub p)
            (sub.class_expr sub ce)
      | Pcl_apply (ce, l) ->
          apply ~loc ~attrs (sub.class_expr sub ce)
            (List.map (map_snd (sub.expr sub)) l)
      | Pcl_let (r, vbs, ce) ->
          let_ ~loc ~attrs r (List.map (sub.value_binding sub) vbs)
            (sub.class_expr sub ce)
      | Pcl_constraint (ce, ct) ->
          constraint_ ~loc ~attrs (sub.class_expr sub ce) (sub.class_type sub ct)
      | Pcl_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_kind sub = function
      | Cfk_concrete (o, e) -> Cfk_concrete (o, sub.expr sub e)
      | Cfk_virtual t -> Cfk_virtual (sub.typ sub t)

    let map_field sub {pcf_desc = desc; pcf_loc = loc; pcf_attributes = attrs} =
      let open Cf in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pcf_inherit (o, ce, s) -> inherit_ ~loc ~attrs o (sub.class_expr sub ce) s
      | Pcf_val (s, m, k) -> val_ ~loc ~attrs (map_loc sub s) m (map_kind sub k)
      | Pcf_method (s, p, k) ->
          method_ ~loc ~attrs (map_loc sub s) p (map_kind sub k)
      | Pcf_constraint (t1, t2) ->
          constraint_ ~loc ~attrs (sub.typ sub t1) (sub.typ sub t2)
      | Pcf_initializer e -> initializer_ ~loc ~attrs (sub.expr sub e)
      | Pcf_attribute x -> attribute ~loc (sub.attribute sub x)
      | Pcf_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_structure sub {pcstr_self; pcstr_fields} =
      {
        pcstr_self = sub.pat sub pcstr_self;
        pcstr_fields = List.map (sub.class_field sub) pcstr_fields;
      }

    let class_infos sub f {pci_virt; pci_params = pl; pci_name; pci_expr;
                           pci_loc; pci_attributes} =
      Ci.mk
       ~virt:pci_virt
       ~params:(List.map (map_fst (sub.typ sub)) pl)
        (map_loc sub pci_name)
        (f pci_expr)
        ~loc:(sub.location sub pci_loc)
        ~attrs:(sub.attributes sub pci_attributes)
  end

  (* Now, a generic AST mapper, to be extended to cover all kinds and
     cases of the OCaml grammar.  The default behavior of the mapper is
     the identity. *)

  let default_mapper =
    {
      structure = (fun this l -> List.map (this.structure_item this) l);
      structure_item = M.map_structure_item;
      module_expr = M.map;
      signature = (fun this l -> List.map (this.signature_item this) l);
      signature_item = MT.map_signature_item;
      module_type = MT.map;
      with_constraint = MT.map_with_constraint;
      class_declaration =
        (fun this -> CE.class_infos this (this.class_expr this));
      class_expr = CE.map;
      class_field = CE.map_field;
      class_structure = CE.map_structure;
      class_type = CT.map;
      class_type_field = CT.map_field;
      class_signature = CT.map_signature;
      class_type_declaration =
        (fun this -> CE.class_infos this (this.class_type this));
      class_description =
        (fun this -> CE.class_infos this (this.class_type this));
      type_declaration = T.map_type_declaration;
      type_kind = T.map_type_kind;
      typ = T.map;
      type_extension = T.map_type_extension;
      extension_constructor = T.map_extension_constructor;
      value_description =
        (fun this {pval_name; pval_type; pval_prim; pval_loc;
                   pval_attributes} ->
          Val.mk
            (map_loc this pval_name)
            (this.typ this pval_type)
            ~attrs:(this.attributes this pval_attributes)
            ~loc:(this.location this pval_loc)
            ~prim:pval_prim
        );

      pat = P.map;
      expr = E.map;

      module_declaration =
        (fun this {pmd_name; pmd_type; pmd_attributes; pmd_loc} ->
           Md.mk
             (map_loc this pmd_name)
             (this.module_type this pmd_type)
             ~attrs:(this.attributes this pmd_attributes)
             ~loc:(this.location this pmd_loc)
        );

      module_type_declaration =
        (fun this {pmtd_name; pmtd_type; pmtd_attributes; pmtd_loc} ->
           Mtd.mk
             (map_loc this pmtd_name)
             ?typ:(map_opt (this.module_type this) pmtd_type)
             ~attrs:(this.attributes this pmtd_attributes)
             ~loc:(this.location this pmtd_loc)
        );

      module_binding =
        (fun this {pmb_name; pmb_expr; pmb_attributes; pmb_loc} ->
           Mb.mk (map_loc this pmb_name) (this.module_expr this pmb_expr)
             ~attrs:(this.attributes this pmb_attributes)
             ~loc:(this.location this pmb_loc)
        );


      open_description =
        (fun this {popen_lid; popen_override; popen_attributes; popen_loc} ->
           Opn.mk (map_loc this popen_lid)
             ~override:popen_override
             ~loc:(this.location this popen_loc)
             ~attrs:(this.attributes this popen_attributes)
        );


      include_description =
        (fun this {pincl_mod; pincl_attributes; pincl_loc} ->
           Incl.mk (this.module_type this pincl_mod)
             ~loc:(this.location this pincl_loc)
             ~attrs:(this.attributes this pincl_attributes)
        );

      include_declaration =
        (fun this {pincl_mod; pincl_attributes; pincl_loc} ->
           Incl.mk (this.module_expr this pincl_mod)
             ~loc:(this.location this pincl_loc)
             ~attrs:(this.attributes this pincl_attributes)
        );


      value_binding =
        (fun this {pvb_pat; pvb_expr; pvb_attributes; pvb_loc} ->
           Vb.mk
             (this.pat this pvb_pat)
             (this.expr this pvb_expr)
             ~loc:(this.location this pvb_loc)
             ~attrs:(this.attributes this pvb_attributes)
        );


      constructor_declaration =
        (fun this {pcd_name; pcd_args; pcd_res; pcd_loc; pcd_attributes} ->
          Type.constructor
            (map_loc this pcd_name)
            ~args:(T.map_constructor_arguments this pcd_args)
            ?res:(map_opt (this.typ this) pcd_res)
            ~loc:(this.location this pcd_loc)
            ~attrs:(this.attributes this pcd_attributes)
        );

      label_declaration =
        (fun this {pld_name; pld_type; pld_loc; pld_mutable; pld_attributes} ->
           Type.field
             (map_loc this pld_name)
             (this.typ this pld_type)
             ~mut:pld_mutable
             ~loc:(this.location this pld_loc)
             ~attrs:(this.attributes this pld_attributes)
        );

      cases = (fun this l -> List.map (this.case this) l);
      case =
        (fun this {pc_lhs; pc_guard; pc_rhs} ->
           {
             pc_lhs = this.pat this pc_lhs;
             pc_guard = map_opt (this.expr this) pc_guard;
             pc_rhs = this.expr this pc_rhs;
           }
        );



      location = (fun _this l -> l);

      extension = (fun this (s, e) -> (map_loc this s, this.payload this e));
      attribute = (fun this (s, e) -> (map_loc this s, this.payload this e));
      attributes = (fun this l -> List.map (this.attribute this) l);
      payload =
        (fun this -> function
           | PStr x -> PStr (this.structure this x)
           | PSig x -> PSig (this.signature this x)
           | PTyp x -> PTyp (this.typ this x)
           | PPat (x, g) -> PPat (this.pat this x, map_opt (this.expr this) g)
        );
    }

  let rec extension_of_error {loc; msg; if_highlight; sub} =
    { loc; txt = "ocaml.error" },
    PStr ([Str.eval (Exp.constant (Pconst_string (msg, None)));
           Str.eval (Exp.constant (Pconst_string (if_highlight, None)))] @
          (List.map (fun ext -> Str.extension (extension_of_error ext)) sub))

  let attribute_of_warning loc s =
    { loc; txt = "ocaml.ppwarning" },
    PStr ([Str.eval ~loc (Exp.constant (Pconst_string (s, None)))])

end

module Outcometree = struct
  (* Module [Outcometree]: results displayed by the toplevel *)

  (* These types represent messages that the toplevel displays as normal
     results or errors. The real displaying is customisable using the hooks:
        [Toploop.print_out_value]
        [Toploop.print_out_type]
        [Toploop.print_out_sig_item]
        [Toploop.print_out_phrase] *)

  type out_ident (*IF_CURRENT = Outcometree.out_ident *) =
    | Oide_apply of out_ident * out_ident
    | Oide_dot of out_ident * string
    | Oide_ident of string

  type out_attribute (*IF_CURRENT = Outcometree.out_attribute *) =
    { oattr_name: string }

  type out_value (*IF_CURRENT = Outcometree.out_value *) =
    | Oval_array of out_value list
    | Oval_char of char
    | Oval_constr of out_ident * out_value list
    | Oval_ellipsis
    | Oval_float of float
    | Oval_int of int
    | Oval_int32 of int32
    | Oval_int64 of int64
    | Oval_nativeint of nativeint
    | Oval_list of out_value list
    | Oval_printer of (Format.formatter -> unit)
    | Oval_record of (out_ident * out_value) list
    | Oval_string of string
    | Oval_stuff of string
    | Oval_tuple of out_value list
    | Oval_variant of string * out_value option

  type out_type (*IF_CURRENT = Outcometree.out_type *) =
    | Otyp_abstract
    | Otyp_open
    | Otyp_alias of out_type * string
    | Otyp_arrow of string * out_type * out_type
    | Otyp_class of bool * out_ident * out_type list
    | Otyp_constr of out_ident * out_type list
    | Otyp_manifest of out_type * out_type
    | Otyp_object of (string * out_type) list * bool option
    | Otyp_record of (string * bool * out_type) list
    | Otyp_stuff of string
    | Otyp_sum of (string * out_type list * out_type option) list
    | Otyp_tuple of out_type list
    | Otyp_var of bool * string
    | Otyp_variant of
        bool * out_variant * bool * (string list) option
    | Otyp_poly of string list * out_type
    | Otyp_module of string * string list * out_type list
    | Otyp_attribute of out_type * out_attribute

  and out_variant (*IF_CURRENT = Outcometree.out_variant *) =
    | Ovar_fields of (string * bool * out_type list) list
    | Ovar_name of out_ident * out_type list

  type out_class_type (*IF_CURRENT = Outcometree.out_class_type *) =
    | Octy_constr of out_ident * out_type list
    | Octy_arrow of string * out_type * out_class_type
    | Octy_signature of out_type option * out_class_sig_item list
  and out_class_sig_item (*IF_CURRENT = Outcometree.out_class_sig_item *) =
    | Ocsg_constraint of out_type * out_type
    | Ocsg_method of string * bool * bool * out_type
    | Ocsg_value of string * bool * bool * out_type

  type out_module_type (*IF_CURRENT = Outcometree.out_module_type *) =
    | Omty_abstract
    | Omty_functor of string * out_module_type option * out_module_type
    | Omty_ident of out_ident
    | Omty_signature of out_sig_item list
    | Omty_alias of out_ident
  and out_sig_item (*IF_CURRENT = Outcometree.out_sig_item *) =
    | Osig_class of
        bool * string * (string * (bool * bool)) list * out_class_type *
          out_rec_status
    | Osig_class_type of
        bool * string * (string * (bool * bool)) list * out_class_type *
          out_rec_status
    | Osig_typext of out_extension_constructor * out_ext_status
    | Osig_modtype of string * out_module_type
    | Osig_module of string * out_module_type * out_rec_status
    | Osig_type of out_type_decl * out_rec_status
    | Osig_value of out_val_decl
    | Osig_ellipsis
  and out_type_decl (*IF_CURRENT = Outcometree.out_type_decl *) =
    { otype_name: string;
      otype_params: (string * (bool * bool)) list;
      otype_type: out_type;
      otype_private: Asttypes.private_flag;
      otype_immediate: bool;
      otype_unboxed: bool;
      otype_cstrs: (out_type * out_type) list }
  and out_extension_constructor (*IF_CURRENT = Outcometree.out_extension_constructor *) =
    { oext_name: string;
      oext_type_name: string;
      oext_type_params: string list;
      oext_args: out_type list;
      oext_ret_type: out_type option;
      oext_private: Asttypes.private_flag }
  and out_type_extension (*IF_CURRENT = Outcometree.out_type_extension *) =
    { otyext_name: string;
      otyext_params: string list;
      otyext_constructors: (string * out_type list * out_type option) list;
      otyext_private: Asttypes.private_flag }
  and out_val_decl (*IF_CURRENT = Outcometree.out_val_decl *) =
    { oval_name: string;
      oval_type: out_type;
      oval_prims: string list;
      oval_attributes: out_attribute list }
  and out_rec_status (*IF_CURRENT = Outcometree.out_rec_status *) =
    | Orec_not
    | Orec_first
    | Orec_next
  and out_ext_status (*IF_CURRENT = Outcometree.out_ext_status *) =
    | Oext_first
    | Oext_next
    | Oext_exception

  type out_phrase (*IF_CURRENT = Outcometree.out_phrase *) =
    | Ophr_eval of out_value * out_type
    | Ophr_signature of (out_sig_item * out_value option) list
    | Ophr_exception of (exn * out_value)

end

module Config = struct
  let ast_impl_magic_number = "Caml1999M020"
  let ast_intf_magic_number = "Caml1999N018"
end

let map_signature mapper = mapper.Ast_mapper.signature mapper
let map_structure mapper = mapper.Ast_mapper.structure mapper

let shallow_identity =
  let id _ x = x in
  {
    Ast_mapper.
    structure               = id;
    structure_item          = id;
    module_expr             = id;
    signature               = id;
    signature_item          = id;
    module_type             = id;
    with_constraint         = id;
    class_declaration       = id;
    class_expr              = id;
    class_field             = id;
    class_structure         = id;
    class_type              = id;
    class_type_field        = id;
    class_signature         = id;
    class_type_declaration  = id;
    class_description       = id;
    type_declaration        = id;
    type_kind               = id;
    typ                     = id;
    type_extension          = id;
    extension_constructor   = id;
    value_description       = id;
    pat                     = id;
    expr                    = id;
    module_declaration      = id;
    module_type_declaration = id;
    module_binding          = id;
    open_description        = id;
    include_description     = id;
    include_declaration     = id;
    value_binding           = id;
    constructor_declaration = id;
    label_declaration       = id;
    cases                   = id;
    case                    = id;
    location                = id;
    extension               = id;
    attribute               = id;
    attributes              = id;
    payload                 = id;
  }

let failing_mapper =
  let fail _ _ =
    invalid_arg "failing_mapper: this mapper function should never get called"
  in
  {
    Ast_mapper.
    structure               = fail;
    structure_item          = fail;
    module_expr             = fail;
    signature               = fail;
    signature_item          = fail;
    module_type             = fail;
    with_constraint         = fail;
    class_declaration       = fail;
    class_expr              = fail;
    class_field             = fail;
    class_structure         = fail;
    class_type              = fail;
    class_type_field        = fail;
    class_signature         = fail;
    class_type_declaration  = fail;
    class_description       = fail;
    type_declaration        = fail;
    type_kind               = fail;
    typ                     = fail;
    type_extension          = fail;
    extension_constructor   = fail;
    value_description       = fail;
    pat                     = fail;
    expr                    = fail;
    module_declaration      = fail;
    module_type_declaration = fail;
    module_binding          = fail;
    open_description        = fail;
    include_description     = fail;
    include_declaration     = fail;
    value_binding           = fail;
    constructor_declaration = fail;
    label_declaration       = fail;
    cases                   = fail;
    case                    = fail;
    location                = fail;
    extension               = fail;
    attribute               = fail;
    attributes              = fail;
    payload                 = fail;
  }

let make_top_mapper ~signature ~structure =
  {failing_mapper with Ast_mapper.
                    signature = (fun _ x -> signature x);
                    structure = (fun _ x -> structure x) }

end
module Ast_405
= struct
#1 "ast_405.ml"
# 1 "src/ast_405.ml"
(**************************************************************************)
(*                                                                        *)
(*                         OCaml Migrate Parsetree                        *)
(*                                                                        *)
(*                             Frédéric Bour                              *)
(*            Jérémie Dimino and Leo White, Jane Street Europe            *)
(*            Xavier Leroy, projet Cristal, INRIA Rocquencourt            *)
(*                         Alain Frisch, LexiFi                           *)
(*       Daniel de Rauglaudre, projet Cristal, INRIA Rocquencourt         *)
(*                                                                        *)
(*   Copyright 2017 Institut National de Recherche en Informatique et     *)
(*     en Automatique (INRIA).                                            *)
(*                                                                        *)
(*   All rights reserved.  This file is distributed under the terms of    *)
(*   the GNU Lesser General Public License version 2.1, with the          *)
(*   special exception on linking described in the file LICENSE.          *)
(*                                                                        *)
(**************************************************************************)

module Location = Location
module Longident = Longident

module Asttypes = struct
  (** Auxiliary AST types used by parsetree and typedtree. *)

  type constant (*IF_CURRENT = Asttypes.constant *) =
      Const_int of int
    | Const_char of char
    | Const_string of string * string option
    | Const_float of string
    | Const_int32 of int32
    | Const_int64 of int64
    | Const_nativeint of nativeint

  type rec_flag (*IF_CURRENT = Asttypes.rec_flag *) = Nonrecursive | Recursive

  type direction_flag (*IF_CURRENT = Asttypes.direction_flag *) = Upto | Downto

  (* Order matters, used in polymorphic comparison *)
  type private_flag (*IF_CURRENT = Asttypes.private_flag *) = Private | Public

  type mutable_flag (*IF_CURRENT = Asttypes.mutable_flag *) = Immutable | Mutable

  type virtual_flag (*IF_CURRENT = Asttypes.virtual_flag *) = Virtual | Concrete

  type override_flag (*IF_CURRENT = Asttypes.override_flag *) = Override | Fresh

  type closed_flag (*IF_CURRENT = Asttypes.closed_flag *) = Closed | Open

  type label = string

  type arg_label (*IF_CURRENT = Asttypes.arg_label *) =
      Nolabel
    | Labelled of string (*  label:T -> ... *)
    | Optional of string (* ?label:T -> ... *)

  type 'a loc = 'a Location.loc = {
    txt : 'a;
    loc : Location.t;
  }


  type variance (*IF_CURRENT = Asttypes.variance *) =
    | Covariant
    | Contravariant
    | Invariant
end

module Parsetree = struct
  (** Abstract syntax tree produced by parsing *)

  open Asttypes

  type constant (*IF_CURRENT = Parsetree.constant *) =
      Pconst_integer of string * char option
    (* 3 3l 3L 3n

       Suffixes [g-z][G-Z] are accepted by the parser.
       Suffixes except 'l', 'L' and 'n' are rejected by the typechecker
    *)
    | Pconst_char of char
    (* 'c' *)
    | Pconst_string of string * string option
    (* "constant"
       {delim|other constant|delim}
    *)
    | Pconst_float of string * char option
    (* 3.4 2e5 1.4e-4

       Suffixes [g-z][G-Z] are accepted by the parser.
       Suffixes are rejected by the typechecker.
    *)

  (** {2 Extension points} *)

  type attribute = string loc * payload
         (* [@id ARG]
            [@@id ARG]

            Metadata containers passed around within the AST.
            The compiler ignores unknown attributes.
         *)

  and extension = string loc * payload
        (* [%id ARG]
           [%%id ARG]

           Sub-language placeholder -- rejected by the typechecker.
        *)

  and attributes = attribute list

  and payload (*IF_CURRENT = Parsetree.payload *) =
    | PStr of structure
    | PSig of signature (* : SIG *)
    | PTyp of core_type  (* : T *)
    | PPat of pattern * expression option  (* ? P  or  ? P when E *)

  (** {2 Core language} *)

  (* Type expressions *)

  and core_type (*IF_CURRENT = Parsetree.core_type *) =
      {
       ptyp_desc: core_type_desc;
       ptyp_loc: Location.t;
       ptyp_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and core_type_desc (*IF_CURRENT = Parsetree.core_type_desc *) =
    | Ptyp_any
          (*  _ *)
    | Ptyp_var of string
          (* 'a *)
    | Ptyp_arrow of arg_label * core_type * core_type
          (* T1 -> T2       Simple
             ~l:T1 -> T2    Labelled
             ?l:T1 -> T2    Otional
           *)
    | Ptyp_tuple of core_type list
          (* T1 * ... * Tn

             Invariant: n >= 2
          *)
    | Ptyp_constr of Longident.t loc * core_type list
          (* tconstr
             T tconstr
             (T1, ..., Tn) tconstr
           *)
    | Ptyp_object of (string loc * attributes * core_type) list * closed_flag
          (* < l1:T1; ...; ln:Tn >     (flag = Closed)
             < l1:T1; ...; ln:Tn; .. > (flag = Open)
           *)
    | Ptyp_class of Longident.t loc * core_type list
          (* #tconstr
             T #tconstr
             (T1, ..., Tn) #tconstr
           *)
    | Ptyp_alias of core_type * string
          (* T as 'a *)
    | Ptyp_variant of row_field list * closed_flag * label list option
          (* [ `A|`B ]         (flag = Closed; labels = None)
             [> `A|`B ]        (flag = Open;   labels = None)
             [< `A|`B ]        (flag = Closed; labels = Some [])
             [< `A|`B > `X `Y ](flag = Closed; labels = Some ["X";"Y"])
           *)
    | Ptyp_poly of string loc list * core_type
          (* 'a1 ... 'an. T

             Can only appear in the following context:

             - As the core_type of a Ppat_constraint node corresponding
               to a constraint on a let-binding: let x : 'a1 ... 'an. T
               = e ...

             - Under Cfk_virtual for methods (not values).

             - As the core_type of a Pctf_method node.

             - As the core_type of a Pexp_poly node.

             - As the pld_type field of a label_declaration.

             - As a core_type of a Ptyp_object node.
           *)

    | Ptyp_package of package_type
          (* (module S) *)
    | Ptyp_extension of extension
          (* [%id] *)

  and package_type = Longident.t loc * (Longident.t loc * core_type) list
        (*
          (module S)
          (module S with type t1 = T1 and ... and tn = Tn)
         *)

  and row_field (*IF_CURRENT = Parsetree.row_field *) =
    | Rtag of label * attributes * bool * core_type list
          (* [`A]                   ( true,  [] )
             [`A of T]              ( false, [T] )
             [`A of T1 & .. & Tn]   ( false, [T1;...Tn] )
             [`A of & T1 & .. & Tn] ( true,  [T1;...Tn] )

            - The 2nd field is true if the tag contains a
              constant (empty) constructor.
            - '&' occurs when several types are used for the same constructor
              (see 4.2 in the manual)

            - TODO: switch to a record representation, and keep location
          *)
    | Rinherit of core_type
          (* [ T ] *)

  (* Patterns *)

  and pattern (*IF_CURRENT = Parsetree.pattern *) =
      {
       ppat_desc: pattern_desc;
       ppat_loc: Location.t;
       ppat_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and pattern_desc (*IF_CURRENT = Parsetree.pattern_desc *) =
    | Ppat_any
          (* _ *)
    | Ppat_var of string loc
          (* x *)
    | Ppat_alias of pattern * string loc
          (* P as 'a *)
    | Ppat_constant of constant
          (* 1, 'a', "true", 1.0, 1l, 1L, 1n *)
    | Ppat_interval of constant * constant
          (* 'a'..'z'

             Other forms of interval are recognized by the parser
             but rejected by the type-checker. *)
    | Ppat_tuple of pattern list
          (* (P1, ..., Pn)

             Invariant: n >= 2
          *)
    | Ppat_construct of Longident.t loc * pattern option
          (* C                None
             C P              Some P
             C (P1, ..., Pn)  Some (Ppat_tuple [P1; ...; Pn])
           *)
    | Ppat_variant of label * pattern option
          (* `A             (None)
             `A P           (Some P)
           *)
    | Ppat_record of (Longident.t loc * pattern) list * closed_flag
          (* { l1=P1; ...; ln=Pn }     (flag = Closed)
             { l1=P1; ...; ln=Pn; _}   (flag = Open)

             Invariant: n > 0
           *)
    | Ppat_array of pattern list
          (* [| P1; ...; Pn |] *)
    | Ppat_or of pattern * pattern
          (* P1 | P2 *)
    | Ppat_constraint of pattern * core_type
          (* (P : T) *)
    | Ppat_type of Longident.t loc
          (* #tconst *)
    | Ppat_lazy of pattern
          (* lazy P *)
    | Ppat_unpack of string loc
          (* (module P)
             Note: (module P : S) is represented as
             Ppat_constraint(Ppat_unpack, Ptyp_package)
           *)
    | Ppat_exception of pattern
          (* exception P *)
    | Ppat_extension of extension
          (* [%id] *)
    | Ppat_open of Longident.t loc * pattern
          (* M.(P) *)

  (* Value expressions *)

  and expression (*IF_CURRENT = Parsetree.expression *) =
      {
       pexp_desc: expression_desc;
       pexp_loc: Location.t;
       pexp_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and expression_desc (*IF_CURRENT = Parsetree.expression_desc *) =
    | Pexp_ident of Longident.t loc
          (* x
             M.x
           *)
    | Pexp_constant of constant
          (* 1, 'a', "true", 1.0, 1l, 1L, 1n *)
    | Pexp_let of rec_flag * value_binding list * expression
          (* let P1 = E1 and ... and Pn = EN in E       (flag = Nonrecursive)
             let rec P1 = E1 and ... and Pn = EN in E   (flag = Recursive)
           *)
    | Pexp_function of case list
          (* function P1 -> E1 | ... | Pn -> En *)
    | Pexp_fun of arg_label * expression option * pattern * expression
          (* fun P -> E1                          (Simple, None)
             fun ~l:P -> E1                       (Labelled l, None)
             fun ?l:P -> E1                       (Optional l, None)
             fun ?l:(P = E0) -> E1                (Optional l, Some E0)

             Notes:
             - If E0 is provided, only Optional is allowed.
             - "fun P1 P2 .. Pn -> E1" is represented as nested Pexp_fun.
             - "let f P = E" is represented using Pexp_fun.
           *)
    | Pexp_apply of expression * (arg_label * expression) list
          (* E0 ~l1:E1 ... ~ln:En
             li can be empty (non labeled argument) or start with '?'
             (optional argument).

             Invariant: n > 0
           *)
    | Pexp_match of expression * case list
          (* match E0 with P1 -> E1 | ... | Pn -> En *)
    | Pexp_try of expression * case list
          (* try E0 with P1 -> E1 | ... | Pn -> En *)
    | Pexp_tuple of expression list
          (* (E1, ..., En)

             Invariant: n >= 2
          *)
    | Pexp_construct of Longident.t loc * expression option
          (* C                None
             C E              Some E
             C (E1, ..., En)  Some (Pexp_tuple[E1;...;En])
          *)
    | Pexp_variant of label * expression option
          (* `A             (None)
             `A E           (Some E)
           *)
    | Pexp_record of (Longident.t loc * expression) list * expression option
          (* { l1=P1; ...; ln=Pn }     (None)
             { E0 with l1=P1; ...; ln=Pn }   (Some E0)

             Invariant: n > 0
           *)
    | Pexp_field of expression * Longident.t loc
          (* E.l *)
    | Pexp_setfield of expression * Longident.t loc * expression
          (* E1.l <- E2 *)
    | Pexp_array of expression list
          (* [| E1; ...; En |] *)
    | Pexp_ifthenelse of expression * expression * expression option
          (* if E1 then E2 else E3 *)
    | Pexp_sequence of expression * expression
          (* E1; E2 *)
    | Pexp_while of expression * expression
          (* while E1 do E2 done *)
    | Pexp_for of
        pattern *  expression * expression * direction_flag * expression
          (* for i = E1 to E2 do E3 done      (flag = Upto)
             for i = E1 downto E2 do E3 done  (flag = Downto)
           *)
    | Pexp_constraint of expression * core_type
          (* (E : T) *)
    | Pexp_coerce of expression * core_type option * core_type
          (* (E :> T)        (None, T)
             (E : T0 :> T)   (Some T0, T)
           *)
    | Pexp_send of expression * string loc
          (*  E # m *)
    | Pexp_new of Longident.t loc
          (* new M.c *)
    | Pexp_setinstvar of string loc * expression
          (* x <- 2 *)
    | Pexp_override of (string loc * expression) list
          (* {< x1 = E1; ...; Xn = En >} *)
    | Pexp_letmodule of string loc * module_expr * expression
          (* let module M = ME in E *)
    | Pexp_letexception of extension_constructor * expression
          (* let exception C in E *)
    | Pexp_assert of expression
          (* assert E
             Note: "assert false" is treated in a special way by the
             type-checker. *)
    | Pexp_lazy of expression
          (* lazy E *)
    | Pexp_poly of expression * core_type option
          (* Used for method bodies.

             Can only be used as the expression under Cfk_concrete
             for methods (not values). *)
    | Pexp_object of class_structure
          (* object ... end *)
    | Pexp_newtype of string loc * expression
          (* fun (type t) -> E *)
    | Pexp_pack of module_expr
          (* (module ME)

             (module ME : S) is represented as
             Pexp_constraint(Pexp_pack, Ptyp_package S) *)
    | Pexp_open of override_flag * Longident.t loc * expression
          (* M.(E)
             let open M in E
             let! open M in E *)
    | Pexp_extension of extension
          (* [%id] *)
    | Pexp_unreachable
          (* . *)

  and case (*IF_CURRENT = Parsetree.case *) =   (* (P -> E) or (P when E0 -> E) *)
      {
       pc_lhs: pattern;
       pc_guard: expression option;
       pc_rhs: expression;
      }

  (* Value descriptions *)

  and value_description (*IF_CURRENT = Parsetree.value_description *) =
      {
       pval_name: string loc;
       pval_type: core_type;
       pval_prim: string list;
       pval_attributes: attributes;  (* ... [@@id1] [@@id2] *)
       pval_loc: Location.t;
      }

  (*
    val x: T                            (prim = [])
    external x: T = "s1" ... "sn"       (prim = ["s1";..."sn"])
  *)

  (* Type declarations *)

  and type_declaration (*IF_CURRENT = Parsetree.type_declaration *) =
      {
       ptype_name: string loc;
       ptype_params: (core_type * variance) list;
             (* ('a1,...'an) t; None represents  _*)
       ptype_cstrs: (core_type * core_type * Location.t) list;
             (* ... constraint T1=T1'  ... constraint Tn=Tn' *)
       ptype_kind: type_kind;
       ptype_private: private_flag;   (* = private ... *)
       ptype_manifest: core_type option;  (* = T *)
       ptype_attributes: attributes;   (* ... [@@id1] [@@id2] *)
       ptype_loc: Location.t;
      }

  (*
    type t                     (abstract, no manifest)
    type t = T0                (abstract, manifest=T0)
    type t = C of T | ...      (variant,  no manifest)
    type t = T0 = C of T | ... (variant,  manifest=T0)
    type t = {l: T; ...}       (record,   no manifest)
    type t = T0 = {l : T; ...} (record,   manifest=T0)
    type t = ..                (open,     no manifest)
  *)

  and type_kind (*IF_CURRENT = Parsetree.type_kind *) =
    | Ptype_abstract
    | Ptype_variant of constructor_declaration list
          (* Invariant: non-empty list *)
    | Ptype_record of label_declaration list
          (* Invariant: non-empty list *)
    | Ptype_open

  and label_declaration (*IF_CURRENT = Parsetree.label_declaration *) =
      {
       pld_name: string loc;
       pld_mutable: mutable_flag;
       pld_type: core_type;
       pld_loc: Location.t;
       pld_attributes: attributes; (* l [@id1] [@id2] : T *)
      }

  (*  { ...; l: T; ... }            (mutable=Immutable)
      { ...; mutable l: T; ... }    (mutable=Mutable)

      Note: T can be a Ptyp_poly.
  *)

  and constructor_declaration (*IF_CURRENT = Parsetree.constructor_declaration *) =
      {
       pcd_name: string loc;
       pcd_args: constructor_arguments;
       pcd_res: core_type option;
       pcd_loc: Location.t;
       pcd_attributes: attributes; (* C [@id1] [@id2] of ... *)
      }

  and constructor_arguments (*IF_CURRENT = Parsetree.constructor_arguments *) =
    | Pcstr_tuple of core_type list
    | Pcstr_record of label_declaration list

  (*
    | C of T1 * ... * Tn     (res = None,    args = Pcstr_tuple [])
    | C: T0                  (res = Some T0, args = [])
    | C: T1 * ... * Tn -> T0 (res = Some T0, args = Pcstr_tuple)
    | C of {...}             (res = None,    args = Pcstr_record)
    | C: {...} -> T0         (res = Some T0, args = Pcstr_record)
    | C of {...} as t        (res = None,    args = Pcstr_record)
  *)

  and type_extension (*IF_CURRENT = Parsetree.type_extension *) =
      {
       ptyext_path: Longident.t loc;
       ptyext_params: (core_type * variance) list;
       ptyext_constructors: extension_constructor list;
       ptyext_private: private_flag;
       ptyext_attributes: attributes;   (* ... [@@id1] [@@id2] *)
      }
  (*
    type t += ...
  *)

  and extension_constructor (*IF_CURRENT = Parsetree.extension_constructor *) =
      {
       pext_name: string loc;
       pext_kind : extension_constructor_kind;
       pext_loc : Location.t;
       pext_attributes: attributes; (* C [@id1] [@id2] of ... *)
      }

  and extension_constructor_kind (*IF_CURRENT = Parsetree.extension_constructor_kind *) =
      Pext_decl of constructor_arguments * core_type option
        (*
           | C of T1 * ... * Tn     ([T1; ...; Tn], None)
           | C: T0                  ([], Some T0)
           | C: T1 * ... * Tn -> T0 ([T1; ...; Tn], Some T0)
         *)
    | Pext_rebind of Longident.t loc
        (*
           | C = D
         *)

  (** {2 Class language} *)

  (* Type expressions for the class language *)

  and class_type (*IF_CURRENT = Parsetree.class_type *) =
      {
       pcty_desc: class_type_desc;
       pcty_loc: Location.t;
       pcty_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and class_type_desc (*IF_CURRENT = Parsetree.class_type_desc *) =
    | Pcty_constr of Longident.t loc * core_type list
          (* c
             ['a1, ..., 'an] c *)
    | Pcty_signature of class_signature
          (* object ... end *)
    | Pcty_arrow of arg_label * core_type * class_type
          (* T -> CT       Simple
             ~l:T -> CT    Labelled l
             ?l:T -> CT    Optional l
           *)
    | Pcty_extension of extension
          (* [%id] *)

  and class_signature (*IF_CURRENT = Parsetree.class_signature *) =
      {
       pcsig_self: core_type;
       pcsig_fields: class_type_field list;
      }
  (* object('selfpat) ... end
     object ... end             (self = Ptyp_any)
   *)

  and class_type_field (*IF_CURRENT = Parsetree.class_type_field *) =
      {
       pctf_desc: class_type_field_desc;
       pctf_loc: Location.t;
       pctf_attributes: attributes; (* ... [@@id1] [@@id2] *)
      }

  and class_type_field_desc (*IF_CURRENT = Parsetree.class_type_field_desc *) =
    | Pctf_inherit of class_type
          (* inherit CT *)
    | Pctf_val of (string loc * mutable_flag * virtual_flag * core_type)
          (* val x: T *)
    | Pctf_method  of (string loc * private_flag * virtual_flag * core_type)
          (* method x: T

             Note: T can be a Ptyp_poly.
           *)
    | Pctf_constraint  of (core_type * core_type)
          (* constraint T1 = T2 *)
    | Pctf_attribute of attribute
          (* [@@@id] *)
    | Pctf_extension of extension
          (* [%%id] *)

  and 'a class_infos (*IF_CURRENT = 'a Parsetree.class_infos *) =
      {
       pci_virt: virtual_flag;
       pci_params: (core_type * variance) list;
       pci_name: string loc;
       pci_expr: 'a;
       pci_loc: Location.t;
       pci_attributes: attributes;  (* ... [@@id1] [@@id2] *)
      }
  (* class c = ...
     class ['a1,...,'an] c = ...
     class virtual c = ...

     Also used for "class type" declaration.
  *)

  and class_description = class_type class_infos

  and class_type_declaration = class_type class_infos

  (* Value expressions for the class language *)

  and class_expr (*IF_CURRENT = Parsetree.class_expr *) =
      {
       pcl_desc: class_expr_desc;
       pcl_loc: Location.t;
       pcl_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and class_expr_desc (*IF_CURRENT = Parsetree.class_expr_desc *) =
    | Pcl_constr of Longident.t loc * core_type list
          (* c
             ['a1, ..., 'an] c *)
    | Pcl_structure of class_structure
          (* object ... end *)
    | Pcl_fun of arg_label * expression option * pattern * class_expr
          (* fun P -> CE                          (Simple, None)
             fun ~l:P -> CE                       (Labelled l, None)
             fun ?l:P -> CE                       (Optional l, None)
             fun ?l:(P = E0) -> CE                (Optional l, Some E0)
           *)
    | Pcl_apply of class_expr * (arg_label * expression) list
          (* CE ~l1:E1 ... ~ln:En
             li can be empty (non labeled argument) or start with '?'
             (optional argument).

             Invariant: n > 0
           *)
    | Pcl_let of rec_flag * value_binding list * class_expr
          (* let P1 = E1 and ... and Pn = EN in CE      (flag = Nonrecursive)
             let rec P1 = E1 and ... and Pn = EN in CE  (flag = Recursive)
           *)
    | Pcl_constraint of class_expr * class_type
          (* (CE : CT) *)
    | Pcl_extension of extension
          (* [%id] *)

  and class_structure (*IF_CURRENT = Parsetree.class_structure *) =
      {
       pcstr_self: pattern;
       pcstr_fields: class_field list;
      }
  (* object(selfpat) ... end
     object ... end           (self = Ppat_any)
   *)

  and class_field (*IF_CURRENT = Parsetree.class_field *) =
      {
       pcf_desc: class_field_desc;
       pcf_loc: Location.t;
       pcf_attributes: attributes; (* ... [@@id1] [@@id2] *)
      }

  and class_field_desc (*IF_CURRENT = Parsetree.class_field_desc *) =
    | Pcf_inherit of override_flag * class_expr * string loc option
          (* inherit CE
             inherit CE as x
             inherit! CE
             inherit! CE as x
           *)
    | Pcf_val of (string loc * mutable_flag * class_field_kind)
          (* val x = E
             val virtual x: T
           *)
    | Pcf_method of (string loc * private_flag * class_field_kind)
          (* method x = E            (E can be a Pexp_poly)
             method virtual x: T     (T can be a Ptyp_poly)
           *)
    | Pcf_constraint of (core_type * core_type)
          (* constraint T1 = T2 *)
    | Pcf_initializer of expression
          (* initializer E *)
    | Pcf_attribute of attribute
          (* [@@@id] *)
    | Pcf_extension of extension
          (* [%%id] *)

  and class_field_kind (*IF_CURRENT = Parsetree.class_field_kind *) =
    | Cfk_virtual of core_type
    | Cfk_concrete of override_flag * expression

  and class_declaration = class_expr class_infos

  (** {2 Module language} *)

  (* Type expressions for the module language *)

  and module_type (*IF_CURRENT = Parsetree.module_type *) =
      {
       pmty_desc: module_type_desc;
       pmty_loc: Location.t;
       pmty_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and module_type_desc (*IF_CURRENT = Parsetree.module_type_desc *) =
    | Pmty_ident of Longident.t loc
          (* S *)
    | Pmty_signature of signature
          (* sig ... end *)
    | Pmty_functor of string loc * module_type option * module_type
          (* functor(X : MT1) -> MT2 *)
    | Pmty_with of module_type * with_constraint list
          (* MT with ... *)
    | Pmty_typeof of module_expr
          (* module type of ME *)
    | Pmty_extension of extension
          (* [%id] *)
    | Pmty_alias of Longident.t loc
          (* (module M) *)

  and signature = signature_item list

  and signature_item (*IF_CURRENT = Parsetree.signature_item *) =
      {
       psig_desc: signature_item_desc;
       psig_loc: Location.t;
      }

  and signature_item_desc (*IF_CURRENT = Parsetree.signature_item_desc *) =
    | Psig_value of value_description
          (*
            val x: T
            external x: T = "s1" ... "sn"
           *)
    | Psig_type of rec_flag * type_declaration list
          (* type t1 = ... and ... and tn = ... *)
    | Psig_typext of type_extension
          (* type t1 += ... *)
    | Psig_exception of extension_constructor
          (* exception C of T *)
    | Psig_module of module_declaration
          (* module X : MT *)
    | Psig_recmodule of module_declaration list
          (* module rec X1 : MT1 and ... and Xn : MTn *)
    | Psig_modtype of module_type_declaration
          (* module type S = MT
             module type S *)
    | Psig_open of open_description
          (* open X *)
    | Psig_include of include_description
          (* include MT *)
    | Psig_class of class_description list
          (* class c1 : ... and ... and cn : ... *)
    | Psig_class_type of class_type_declaration list
          (* class type ct1 = ... and ... and ctn = ... *)
    | Psig_attribute of attribute
          (* [@@@id] *)
    | Psig_extension of extension * attributes
          (* [%%id] *)

  and module_declaration (*IF_CURRENT = Parsetree.module_declaration *) =
      {
       pmd_name: string loc;
       pmd_type: module_type;
       pmd_attributes: attributes; (* ... [@@id1] [@@id2] *)
       pmd_loc: Location.t;
      }
  (* S : MT *)

  and module_type_declaration (*IF_CURRENT = Parsetree.module_type_declaration *) =
      {
       pmtd_name: string loc;
       pmtd_type: module_type option;
       pmtd_attributes: attributes; (* ... [@@id1] [@@id2] *)
       pmtd_loc: Location.t;
      }
  (* S = MT
     S       (abstract module type declaration, pmtd_type = None)
  *)

  and open_description (*IF_CURRENT = Parsetree.open_description *) =
      {
       popen_lid: Longident.t loc;
       popen_override: override_flag;
       popen_loc: Location.t;
       popen_attributes: attributes;
      }
  (* open! X - popen_override = Override (silences the 'used identifier
                                shadowing' warning)
     open  X - popen_override = Fresh
   *)

  and 'a include_infos (*IF_CURRENT = 'a Parsetree.include_infos *) =
      {
       pincl_mod: 'a;
       pincl_loc: Location.t;
       pincl_attributes: attributes;
      }

  and include_description = module_type include_infos
  (* include MT *)

  and include_declaration = module_expr include_infos
  (* include ME *)

  and with_constraint (*IF_CURRENT = Parsetree.with_constraint *) =
    | Pwith_type of Longident.t loc * type_declaration
          (* with type X.t = ...

             Note: the last component of the longident must match
             the name of the type_declaration. *)
    | Pwith_module of Longident.t loc * Longident.t loc
          (* with module X.Y = Z *)
    | Pwith_typesubst of type_declaration
          (* with type t := ... *)
    | Pwith_modsubst of string loc * Longident.t loc
          (* with module X := Z *)

  (* Value expressions for the module language *)

  and module_expr (*IF_CURRENT = Parsetree.module_expr *) =
      {
       pmod_desc: module_expr_desc;
       pmod_loc: Location.t;
       pmod_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and module_expr_desc (*IF_CURRENT = Parsetree.module_expr_desc *) =
    | Pmod_ident of Longident.t loc
          (* X *)
    | Pmod_structure of structure
          (* struct ... end *)
    | Pmod_functor of string loc * module_type option * module_expr
          (* functor(X : MT1) -> ME *)
    | Pmod_apply of module_expr * module_expr
          (* ME1(ME2) *)
    | Pmod_constraint of module_expr * module_type
          (* (ME : MT) *)
    | Pmod_unpack of expression
          (* (val E) *)
    | Pmod_extension of extension
          (* [%id] *)

  and structure = structure_item list

  and structure_item (*IF_CURRENT = Parsetree.structure_item *) =
      {
       pstr_desc: structure_item_desc;
       pstr_loc: Location.t;
      }

  and structure_item_desc (*IF_CURRENT = Parsetree.structure_item_desc *) =
    | Pstr_eval of expression * attributes
          (* E *)
    | Pstr_value of rec_flag * value_binding list
          (* let P1 = E1 and ... and Pn = EN       (flag = Nonrecursive)
             let rec P1 = E1 and ... and Pn = EN   (flag = Recursive)
           *)
    | Pstr_primitive of value_description
          (*  val x: T
              external x: T = "s1" ... "sn" *)
    | Pstr_type of rec_flag * type_declaration list
          (* type t1 = ... and ... and tn = ... *)
    | Pstr_typext of type_extension
          (* type t1 += ... *)
    | Pstr_exception of extension_constructor
          (* exception C of T
             exception C = M.X *)
    | Pstr_module of module_binding
          (* module X = ME *)
    | Pstr_recmodule of module_binding list
          (* module rec X1 = ME1 and ... and Xn = MEn *)
    | Pstr_modtype of module_type_declaration
          (* module type S = MT *)
    | Pstr_open of open_description
          (* open X *)
    | Pstr_class of class_declaration list
          (* class c1 = ... and ... and cn = ... *)
    | Pstr_class_type of class_type_declaration list
          (* class type ct1 = ... and ... and ctn = ... *)
    | Pstr_include of include_declaration
          (* include ME *)
    | Pstr_attribute of attribute
          (* [@@@id] *)
    | Pstr_extension of extension * attributes
          (* [%%id] *)

  and value_binding (*IF_CURRENT = Parsetree.value_binding *) =
    {
      pvb_pat: pattern;
      pvb_expr: expression;
      pvb_attributes: attributes;
      pvb_loc: Location.t;
    }

  and module_binding (*IF_CURRENT = Parsetree.module_binding *) =
      {
       pmb_name: string loc;
       pmb_expr: module_expr;
       pmb_attributes: attributes;
       pmb_loc: Location.t;
      }
  (* X = ME *)

  (** {2 Toplevel} *)

  (* Toplevel phrases *)

  type toplevel_phrase (*IF_CURRENT = Parsetree.toplevel_phrase *) =
    | Ptop_def of structure
    | Ptop_dir of string * directive_argument
       (* #use, #load ... *)

  and directive_argument (*IF_CURRENT = Parsetree.directive_argument *) =
    | Pdir_none
    | Pdir_string of string
    | Pdir_int of string * char option
    | Pdir_ident of Longident.t
    | Pdir_bool of bool

end

module Docstrings : sig
  (** {3 Docstrings} *)

  (** Documentation comments *)
  type docstring

  (** Create a docstring *)
  val docstring : string -> Location.t -> docstring

  (** Get the text of a docstring *)
  val docstring_body : docstring -> string

  (** Get the location of a docstring *)
  val docstring_loc : docstring -> Location.t

  (** {3 Items}

      The {!docs} type represents documentation attached to an item. *)

  type docs =
    { docs_pre: docstring option;
      docs_post: docstring option; }

  val empty_docs : docs

  val docs_attr : docstring -> Parsetree.attribute

  (** Convert item documentation to attributes and add them to an
      attribute list *)
  val add_docs_attrs : docs -> Parsetree.attributes -> Parsetree.attributes

  (** {3 Fields and constructors}

      The {!info} type represents documentation attached to a field or
      constructor. *)

  type info = docstring option

  val empty_info : info

  val info_attr : docstring -> Parsetree.attribute

  (** Convert field info to attributes and add them to an
      attribute list *)
  val add_info_attrs : info -> Parsetree.attributes -> Parsetree.attributes

  (** {3 Unattached comments}

      The {!text} type represents documentation which is not attached to
      anything. *)

  type text = docstring list

  val empty_text : text

  val text_attr : docstring -> Parsetree.attribute

  (** Convert text to attributes and add them to an attribute list *)
  val add_text_attrs : text -> Parsetree.attributes -> Parsetree.attributes

end = struct
  open Location

  (* Docstrings *)

  type docstring =
    { ds_body: string;
      ds_loc: Location.t;
    }

  (* Docstring constructors and destructors *)

  let docstring body loc =
    let ds =
      { ds_body = body;
        ds_loc = loc;
      }
    in
    ds

  let docstring_body ds = ds.ds_body

  let docstring_loc ds = ds.ds_loc

  (* Docstrings attached to items *)

  type docs =
    { docs_pre: docstring option;
      docs_post: docstring option; }

  let empty_docs = { docs_pre = None; docs_post = None }

  let doc_loc = {txt = "ocaml.doc"; loc = Location.none}

  let docs_attr ds =
    let open Parsetree in
    let exp =
      { pexp_desc = Pexp_constant (Pconst_string(ds.ds_body, None));
        pexp_loc = ds.ds_loc;
        pexp_attributes = []; }
    in
    let item =
      { pstr_desc = Pstr_eval (exp, []); pstr_loc = exp.pexp_loc }
    in
      (doc_loc, PStr [item])

  let add_docs_attrs docs attrs =
    let attrs =
      match docs.docs_pre with
      | None | Some { ds_body=""; _ } -> attrs
      | Some ds -> docs_attr ds :: attrs
    in
    let attrs =
      match docs.docs_post with
      | None | Some { ds_body=""; _ } -> attrs
      | Some ds -> attrs @ [docs_attr ds]
    in
    attrs

  (* Docstrings attached to constructors or fields *)

  type info = docstring option

  let empty_info = None

  let info_attr = docs_attr

  let add_info_attrs info attrs =
    match info with
    | None | Some {ds_body=""; _} -> attrs
    | Some ds -> attrs @ [info_attr ds]

  (* Docstrings not attached to a specific item *)

  type text = docstring list

  let empty_text = []

  let text_loc = {txt = "ocaml.text"; loc = Location.none}

  let text_attr ds =
    let open Parsetree in
    let exp =
      { pexp_desc = Pexp_constant (Pconst_string(ds.ds_body, None));
        pexp_loc = ds.ds_loc;
        pexp_attributes = []; }
    in
    let item =
      { pstr_desc = Pstr_eval (exp, []); pstr_loc = exp.pexp_loc }
    in
      (text_loc, PStr [item])

  let add_text_attrs dsl attrs =
    let fdsl = List.filter (function {ds_body=""; _} -> false| _ ->true) dsl in
    (List.map text_attr fdsl) @ attrs

end

module Ast_helper : sig

  (** Helpers to produce Parsetree fragments *)

  open Asttypes
  open Docstrings
  open Parsetree

  type lid = Longident.t loc
  type str = string loc
  type loc = Location.t
  type attrs = attribute list

  (** {2 Default locations} *)

  val default_loc: loc ref
      (** Default value for all optional location arguments. *)

  val with_default_loc: loc -> (unit -> 'a) -> 'a
      (** Set the [default_loc] within the scope of the execution
          of the provided function. *)

  (** {2 Constants} *)

  module Const : sig
    val char : char -> constant
    val string : ?quotation_delimiter:string -> string -> constant
    val integer : ?suffix:char -> string -> constant
    val int : ?suffix:char -> int -> constant
    val int32 : ?suffix:char -> int32 -> constant
    val int64 : ?suffix:char -> int64 -> constant
    val nativeint : ?suffix:char -> nativeint -> constant
    val float : ?suffix:char -> string -> constant
  end

  (** {2 Core language} *)

  (** Type expressions *)
  module Typ :
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> core_type_desc -> core_type
      val attr: core_type -> attribute -> core_type

      val any: ?loc:loc -> ?attrs:attrs -> unit -> core_type
      val var: ?loc:loc -> ?attrs:attrs -> string -> core_type
      val arrow: ?loc:loc -> ?attrs:attrs -> arg_label -> core_type -> core_type
                 -> core_type
      val tuple: ?loc:loc -> ?attrs:attrs -> core_type list -> core_type
      val constr: ?loc:loc -> ?attrs:attrs -> lid -> core_type list -> core_type
      val object_: ?loc:loc -> ?attrs:attrs ->
                    (str * attributes * core_type) list -> closed_flag ->
                    core_type
      val class_: ?loc:loc -> ?attrs:attrs -> lid -> core_type list -> core_type
      val alias: ?loc:loc -> ?attrs:attrs -> core_type -> string -> core_type
      val variant: ?loc:loc -> ?attrs:attrs -> row_field list -> closed_flag
                   -> label list option -> core_type
      val poly: ?loc:loc -> ?attrs:attrs -> str list -> core_type -> core_type
      val package: ?loc:loc -> ?attrs:attrs -> lid -> (lid * core_type) list
                   -> core_type
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> core_type

      val force_poly: core_type -> core_type

      val varify_constructors: str list -> core_type -> core_type
      (** [varify_constructors newtypes te] is type expression [te], of which
          any of nullary type constructor [tc] is replaced by type variable of
          the same name, if [tc]'s name appears in [newtypes].
          Raise [Syntaxerr.Variable_in_scope] if any type variable inside [te]
          appears in [newtypes].
          @since 4.05
       *)
    end

  (** Patterns *)
  module Pat:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> pattern_desc -> pattern
      val attr:pattern -> attribute -> pattern

      val any: ?loc:loc -> ?attrs:attrs -> unit -> pattern
      val var: ?loc:loc -> ?attrs:attrs -> str -> pattern
      val alias: ?loc:loc -> ?attrs:attrs -> pattern -> str -> pattern
      val constant: ?loc:loc -> ?attrs:attrs -> constant -> pattern
      val interval: ?loc:loc -> ?attrs:attrs -> constant -> constant -> pattern
      val tuple: ?loc:loc -> ?attrs:attrs -> pattern list -> pattern
      val construct: ?loc:loc -> ?attrs:attrs -> lid -> pattern option -> pattern
      val variant: ?loc:loc -> ?attrs:attrs -> label -> pattern option -> pattern
      val record: ?loc:loc -> ?attrs:attrs -> (lid * pattern) list -> closed_flag
                  -> pattern
      val array: ?loc:loc -> ?attrs:attrs -> pattern list -> pattern
      val or_: ?loc:loc -> ?attrs:attrs -> pattern -> pattern -> pattern
      val constraint_: ?loc:loc -> ?attrs:attrs -> pattern -> core_type -> pattern
      val type_: ?loc:loc -> ?attrs:attrs -> lid -> pattern
      val lazy_: ?loc:loc -> ?attrs:attrs -> pattern -> pattern
      val unpack: ?loc:loc -> ?attrs:attrs -> str -> pattern
      val open_: ?loc:loc -> ?attrs:attrs  -> lid -> pattern -> pattern
      val exception_: ?loc:loc -> ?attrs:attrs -> pattern -> pattern
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> pattern
    end

  (** Expressions *)
  module Exp:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> expression_desc -> expression
      val attr: expression -> attribute -> expression

      val ident: ?loc:loc -> ?attrs:attrs -> lid -> expression
      val constant: ?loc:loc -> ?attrs:attrs -> constant -> expression
      val let_: ?loc:loc -> ?attrs:attrs -> rec_flag -> value_binding list
                -> expression -> expression
      val fun_: ?loc:loc -> ?attrs:attrs -> arg_label -> expression option
                -> pattern -> expression -> expression
      val function_: ?loc:loc -> ?attrs:attrs -> case list -> expression
      val apply: ?loc:loc -> ?attrs:attrs -> expression
                 -> (arg_label * expression) list -> expression
      val match_: ?loc:loc -> ?attrs:attrs -> expression -> case list
                  -> expression
      val try_: ?loc:loc -> ?attrs:attrs -> expression -> case list -> expression
      val tuple: ?loc:loc -> ?attrs:attrs -> expression list -> expression
      val construct: ?loc:loc -> ?attrs:attrs -> lid -> expression option
                     -> expression
      val variant: ?loc:loc -> ?attrs:attrs -> label -> expression option
                   -> expression
      val record: ?loc:loc -> ?attrs:attrs -> (lid * expression) list
                  -> expression option -> expression
      val field: ?loc:loc -> ?attrs:attrs -> expression -> lid -> expression
      val setfield: ?loc:loc -> ?attrs:attrs -> expression -> lid -> expression
                    -> expression
      val array: ?loc:loc -> ?attrs:attrs -> expression list -> expression
      val ifthenelse: ?loc:loc -> ?attrs:attrs -> expression -> expression
                      -> expression option -> expression
      val sequence: ?loc:loc -> ?attrs:attrs -> expression -> expression
                    -> expression
      val while_: ?loc:loc -> ?attrs:attrs -> expression -> expression
                  -> expression
      val for_: ?loc:loc -> ?attrs:attrs -> pattern -> expression -> expression
                -> direction_flag -> expression -> expression
      val coerce: ?loc:loc -> ?attrs:attrs -> expression -> core_type option
                  -> core_type -> expression
      val constraint_: ?loc:loc -> ?attrs:attrs -> expression -> core_type
                       -> expression
      val send: ?loc:loc -> ?attrs:attrs -> expression -> str -> expression
      val new_: ?loc:loc -> ?attrs:attrs -> lid -> expression
      val setinstvar: ?loc:loc -> ?attrs:attrs -> str -> expression -> expression
      val override: ?loc:loc -> ?attrs:attrs -> (str * expression) list
                    -> expression
      val letmodule: ?loc:loc -> ?attrs:attrs -> str -> module_expr -> expression
                     -> expression
      val letexception:
        ?loc:loc -> ?attrs:attrs -> extension_constructor -> expression
        -> expression
      val assert_: ?loc:loc -> ?attrs:attrs -> expression -> expression
      val lazy_: ?loc:loc -> ?attrs:attrs -> expression -> expression
      val poly: ?loc:loc -> ?attrs:attrs -> expression -> core_type option
                -> expression
      val object_: ?loc:loc -> ?attrs:attrs -> class_structure -> expression
      val newtype: ?loc:loc -> ?attrs:attrs -> str -> expression -> expression
      val pack: ?loc:loc -> ?attrs:attrs -> module_expr -> expression
      val open_: ?loc:loc -> ?attrs:attrs -> override_flag -> lid -> expression
                 -> expression
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> expression
      val unreachable: ?loc:loc -> ?attrs:attrs -> unit -> expression

      val case: pattern -> ?guard:expression -> expression -> case
    end

  (** Value declarations *)
  module Val:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs ->
        ?prim:string list -> str -> core_type -> value_description
    end

  (** Type declarations *)
  module Type:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text ->
        ?params:(core_type * variance) list ->
        ?cstrs:(core_type * core_type * loc) list ->
        ?kind:type_kind -> ?priv:private_flag -> ?manifest:core_type -> str ->
        type_declaration

      val constructor: ?loc:loc -> ?attrs:attrs -> ?info:info ->
        ?args:constructor_arguments -> ?res:core_type -> str ->
        constructor_declaration
      val field: ?loc:loc -> ?attrs:attrs -> ?info:info ->
        ?mut:mutable_flag -> str -> core_type -> label_declaration
    end

  (** Type extensions *)
  module Te:
    sig
      val mk: ?attrs:attrs -> ?docs:docs ->
        ?params:(core_type * variance) list -> ?priv:private_flag ->
        lid -> extension_constructor list -> type_extension

      val constructor: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?info:info ->
        str -> extension_constructor_kind -> extension_constructor

      val decl: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?info:info ->
        ?args:constructor_arguments -> ?res:core_type -> str ->
        extension_constructor
      val rebind: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?info:info ->
        str -> lid -> extension_constructor
    end

  (** {2 Module language} *)

  (** Module type expressions *)
  module Mty:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> module_type_desc -> module_type
      val attr: module_type -> attribute -> module_type

      val ident: ?loc:loc -> ?attrs:attrs -> lid -> module_type
      val alias: ?loc:loc -> ?attrs:attrs -> lid -> module_type
      val signature: ?loc:loc -> ?attrs:attrs -> signature -> module_type
      val functor_: ?loc:loc -> ?attrs:attrs ->
        str -> module_type option -> module_type -> module_type
      val with_: ?loc:loc -> ?attrs:attrs -> module_type ->
        with_constraint list -> module_type
      val typeof_: ?loc:loc -> ?attrs:attrs -> module_expr -> module_type
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> module_type
    end

  (** Module expressions *)
  module Mod:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> module_expr_desc -> module_expr
      val attr: module_expr -> attribute -> module_expr

      val ident: ?loc:loc -> ?attrs:attrs -> lid -> module_expr
      val structure: ?loc:loc -> ?attrs:attrs -> structure -> module_expr
      val functor_: ?loc:loc -> ?attrs:attrs ->
        str -> module_type option -> module_expr -> module_expr
      val apply: ?loc:loc -> ?attrs:attrs -> module_expr -> module_expr ->
        module_expr
      val constraint_: ?loc:loc -> ?attrs:attrs -> module_expr -> module_type ->
        module_expr
      val unpack: ?loc:loc -> ?attrs:attrs -> expression -> module_expr
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> module_expr
    end

  (** Signature items *)
  module Sig:
    sig
      val mk: ?loc:loc -> signature_item_desc -> signature_item

      val value: ?loc:loc -> value_description -> signature_item
      val type_: ?loc:loc -> rec_flag -> type_declaration list -> signature_item
      val type_extension: ?loc:loc -> type_extension -> signature_item
      val exception_: ?loc:loc -> extension_constructor -> signature_item
      val module_: ?loc:loc -> module_declaration -> signature_item
      val rec_module: ?loc:loc -> module_declaration list -> signature_item
      val modtype: ?loc:loc -> module_type_declaration -> signature_item
      val open_: ?loc:loc -> open_description -> signature_item
      val include_: ?loc:loc -> include_description -> signature_item
      val class_: ?loc:loc -> class_description list -> signature_item
      val class_type: ?loc:loc -> class_type_declaration list -> signature_item
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> signature_item
      val attribute: ?loc:loc -> attribute -> signature_item
      val text: text -> signature_item list
    end

  (** Structure items *)
  module Str:
    sig
      val mk: ?loc:loc -> structure_item_desc -> structure_item

      val eval: ?loc:loc -> ?attrs:attributes -> expression -> structure_item
      val value: ?loc:loc -> rec_flag -> value_binding list -> structure_item
      val primitive: ?loc:loc -> value_description -> structure_item
      val type_: ?loc:loc -> rec_flag -> type_declaration list -> structure_item
      val type_extension: ?loc:loc -> type_extension -> structure_item
      val exception_: ?loc:loc -> extension_constructor -> structure_item
      val module_: ?loc:loc -> module_binding -> structure_item
      val rec_module: ?loc:loc -> module_binding list -> structure_item
      val modtype: ?loc:loc -> module_type_declaration -> structure_item
      val open_: ?loc:loc -> open_description -> structure_item
      val class_: ?loc:loc -> class_declaration list -> structure_item
      val class_type: ?loc:loc -> class_type_declaration list -> structure_item
      val include_: ?loc:loc -> include_declaration -> structure_item
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> structure_item
      val attribute: ?loc:loc -> attribute -> structure_item
      val text: text -> structure_item list
    end

  (** Module declarations *)
  module Md:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text ->
        str -> module_type -> module_declaration
    end

  (** Module type declarations *)
  module Mtd:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text ->
        ?typ:module_type -> str -> module_type_declaration
    end

  (** Module bindings *)
  module Mb:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text ->
        str -> module_expr -> module_binding
    end

  (** Opens *)
  module Opn:
    sig
      val mk: ?loc: loc -> ?attrs:attrs -> ?docs:docs ->
        ?override:override_flag -> lid -> open_description
    end

  (** Includes *)
  module Incl:
    sig
      val mk: ?loc: loc -> ?attrs:attrs -> ?docs:docs -> 'a -> 'a include_infos
    end

  (** Value bindings *)
  module Vb:
    sig
      val mk: ?loc: loc -> ?attrs:attrs -> ?docs:docs -> ?text:text ->
        pattern -> expression -> value_binding
    end


  (** {2 Class language} *)

  (** Class type expressions *)
  module Cty:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> class_type_desc -> class_type
      val attr: class_type -> attribute -> class_type

      val constr: ?loc:loc -> ?attrs:attrs -> lid -> core_type list -> class_type
      val signature: ?loc:loc -> ?attrs:attrs -> class_signature -> class_type
      val arrow: ?loc:loc -> ?attrs:attrs -> arg_label -> core_type ->
        class_type -> class_type
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> class_type
    end

  (** Class type fields *)
  module Ctf:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs ->
        class_type_field_desc -> class_type_field
      val attr: class_type_field -> attribute -> class_type_field

      val inherit_: ?loc:loc -> ?attrs:attrs -> class_type -> class_type_field
      val val_: ?loc:loc -> ?attrs:attrs -> str -> mutable_flag ->
        virtual_flag -> core_type -> class_type_field
      val method_: ?loc:loc -> ?attrs:attrs -> str -> private_flag ->
        virtual_flag -> core_type -> class_type_field
      val constraint_: ?loc:loc -> ?attrs:attrs -> core_type -> core_type ->
        class_type_field
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> class_type_field
      val attribute: ?loc:loc -> attribute -> class_type_field
      val text: text -> class_type_field list
    end

  (** Class expressions *)
  module Cl:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> class_expr_desc -> class_expr
      val attr: class_expr -> attribute -> class_expr

      val constr: ?loc:loc -> ?attrs:attrs -> lid -> core_type list -> class_expr
      val structure: ?loc:loc -> ?attrs:attrs -> class_structure -> class_expr
      val fun_: ?loc:loc -> ?attrs:attrs -> arg_label -> expression option ->
        pattern -> class_expr -> class_expr
      val apply: ?loc:loc -> ?attrs:attrs -> class_expr ->
        (arg_label * expression) list -> class_expr
      val let_: ?loc:loc -> ?attrs:attrs -> rec_flag -> value_binding list ->
        class_expr -> class_expr
      val constraint_: ?loc:loc -> ?attrs:attrs -> class_expr -> class_type ->
        class_expr
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> class_expr
    end

  (** Class fields *)
  module Cf:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> class_field_desc ->
        class_field
      val attr: class_field -> attribute -> class_field

      val inherit_: ?loc:loc -> ?attrs:attrs -> override_flag -> class_expr ->
        str option -> class_field
      val val_: ?loc:loc -> ?attrs:attrs -> str -> mutable_flag ->
        class_field_kind -> class_field
      val method_: ?loc:loc -> ?attrs:attrs -> str -> private_flag ->
        class_field_kind -> class_field
      val constraint_: ?loc:loc -> ?attrs:attrs -> core_type -> core_type ->
        class_field
      val initializer_: ?loc:loc -> ?attrs:attrs -> expression -> class_field
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> class_field
      val attribute: ?loc:loc -> attribute -> class_field
      val text: text -> class_field list

      val virtual_: core_type -> class_field_kind
      val concrete: override_flag -> expression -> class_field_kind

    end

  (** Classes *)
  module Ci:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text ->
        ?virt:virtual_flag -> ?params:(core_type * variance) list ->
        str -> 'a -> 'a class_infos
    end

  (** Class signatures *)
  module Csig:
    sig
      val mk: core_type -> class_type_field list -> class_signature
    end

  (** Class structures *)
  module Cstr:
    sig
      val mk: pattern -> class_field list -> class_structure
    end

end = struct
  (** Helpers to produce Parsetree fragments *)

  open Asttypes
  open Parsetree
  open Docstrings

  type lid = Longident.t loc
  type str = string loc
  type loc = Location.t
  type attrs = attribute list

  let default_loc = ref Location.none

  let with_default_loc l f =
    let old = !default_loc in
    default_loc := l;
    try let r = f () in default_loc := old; r
    with exn -> default_loc := old; raise exn

  module Const = struct
    let integer ?suffix i = Pconst_integer (i, suffix)
    let int ?suffix i = integer ?suffix (string_of_int i)
    let int32 ?(suffix='l') i = integer ~suffix (Int32.to_string i)
    let int64 ?(suffix='L') i = integer ~suffix (Int64.to_string i)
    let nativeint ?(suffix='n') i = integer ~suffix (Nativeint.to_string i)
    let float ?suffix f = Pconst_float (f, suffix)
    let char c = Pconst_char c
    let string ?quotation_delimiter s = Pconst_string (s, quotation_delimiter)
  end

  module Typ = struct
    let mk ?(loc = !default_loc) ?(attrs = []) d =
      {ptyp_desc = d; ptyp_loc = loc; ptyp_attributes = attrs}
    let attr d a = {d with ptyp_attributes = d.ptyp_attributes @ [a]}

    let any ?loc ?attrs () = mk ?loc ?attrs Ptyp_any
    let var ?loc ?attrs a = mk ?loc ?attrs (Ptyp_var a)
    let arrow ?loc ?attrs a b c = mk ?loc ?attrs (Ptyp_arrow (a, b, c))
    let tuple ?loc ?attrs a = mk ?loc ?attrs (Ptyp_tuple a)
    let constr ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_constr (a, b))
    let object_ ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_object (a, b))
    let class_ ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_class (a, b))
    let alias ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_alias (a, b))
    let variant ?loc ?attrs a b c = mk ?loc ?attrs (Ptyp_variant (a, b, c))
    let poly ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_poly (a, b))
    let package ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_package (a, b))
    let extension ?loc ?attrs a = mk ?loc ?attrs (Ptyp_extension a)

    let force_poly t =
      match t.ptyp_desc with
      | Ptyp_poly _ -> t
      | _ -> poly ~loc:t.ptyp_loc [] t (* -> ghost? *)

    let varify_constructors var_names t =
      let check_variable vl loc v =
        if List.mem v vl then
          raise Syntaxerr.(Error(Variable_in_scope(loc,v))) in
      let var_names = List.map (fun v -> v.txt) var_names in
      let rec loop t =
        let desc =
          match t.ptyp_desc with
          | Ptyp_any -> Ptyp_any
          | Ptyp_var x ->
              check_variable var_names t.ptyp_loc x;
              Ptyp_var x
          | Ptyp_arrow (label,core_type,core_type') ->
              Ptyp_arrow(label, loop core_type, loop core_type')
          | Ptyp_tuple lst -> Ptyp_tuple (List.map loop lst)
          | Ptyp_constr( { txt = Longident.Lident s; _ }, [])
            when List.mem s var_names ->
              Ptyp_var s
          | Ptyp_constr(longident, lst) ->
              Ptyp_constr(longident, List.map loop lst)
          | Ptyp_object (lst, o) ->
              Ptyp_object
                (List.map (fun (s, attrs, t) -> (s, attrs, loop t)) lst, o)
          | Ptyp_class (longident, lst) ->
              Ptyp_class (longident, List.map loop lst)
          | Ptyp_alias(core_type, string) ->
              check_variable var_names t.ptyp_loc string;
              Ptyp_alias(loop core_type, string)
          | Ptyp_variant(row_field_list, flag, lbl_lst_option) ->
              Ptyp_variant(List.map loop_row_field row_field_list,
                           flag, lbl_lst_option)
          | Ptyp_poly(string_lst, core_type) ->
            List.iter (fun v ->
              check_variable var_names t.ptyp_loc v.txt) string_lst;
              Ptyp_poly(string_lst, loop core_type)
          | Ptyp_package(longident,lst) ->
              Ptyp_package(longident,List.map (fun (n,typ) -> (n,loop typ) ) lst)
          | Ptyp_extension (s, arg) ->
              Ptyp_extension (s, arg)
        in
        {t with ptyp_desc = desc}
      and loop_row_field  =
        function
          | Rtag(label,attrs,flag,lst) ->
              Rtag(label,attrs,flag,List.map loop lst)
          | Rinherit t ->
              Rinherit (loop t)
      in
      loop t

  end

  module Pat = struct
    let mk ?(loc = !default_loc) ?(attrs = []) d =
      {ppat_desc = d; ppat_loc = loc; ppat_attributes = attrs}
    let attr d a = {d with ppat_attributes = d.ppat_attributes @ [a]}

    let any ?loc ?attrs () = mk ?loc ?attrs Ppat_any
    let var ?loc ?attrs a = mk ?loc ?attrs (Ppat_var a)
    let alias ?loc ?attrs a b = mk ?loc ?attrs (Ppat_alias (a, b))
    let constant ?loc ?attrs a = mk ?loc ?attrs (Ppat_constant a)
    let interval ?loc ?attrs a b = mk ?loc ?attrs (Ppat_interval (a, b))
    let tuple ?loc ?attrs a = mk ?loc ?attrs (Ppat_tuple a)
    let construct ?loc ?attrs a b = mk ?loc ?attrs (Ppat_construct (a, b))
    let variant ?loc ?attrs a b = mk ?loc ?attrs (Ppat_variant (a, b))
    let record ?loc ?attrs a b = mk ?loc ?attrs (Ppat_record (a, b))
    let array ?loc ?attrs a = mk ?loc ?attrs (Ppat_array a)
    let or_ ?loc ?attrs a b = mk ?loc ?attrs (Ppat_or (a, b))
    let constraint_ ?loc ?attrs a b = mk ?loc ?attrs (Ppat_constraint (a, b))
    let type_ ?loc ?attrs a = mk ?loc ?attrs (Ppat_type a)
    let lazy_ ?loc ?attrs a = mk ?loc ?attrs (Ppat_lazy a)
    let unpack ?loc ?attrs a = mk ?loc ?attrs (Ppat_unpack a)
    let open_ ?loc ?attrs a b = mk ?loc ?attrs (Ppat_open (a, b))
    let exception_ ?loc ?attrs a = mk ?loc ?attrs (Ppat_exception a)
    let extension ?loc ?attrs a = mk ?loc ?attrs (Ppat_extension a)
  end

  module Exp = struct
    let mk ?(loc = !default_loc) ?(attrs = []) d =
      {pexp_desc = d; pexp_loc = loc; pexp_attributes = attrs}
    let attr d a = {d with pexp_attributes = d.pexp_attributes @ [a]}

    let ident ?loc ?attrs a = mk ?loc ?attrs (Pexp_ident a)
    let constant ?loc ?attrs a = mk ?loc ?attrs (Pexp_constant a)
    let let_ ?loc ?attrs a b c = mk ?loc ?attrs (Pexp_let (a, b, c))
    let fun_ ?loc ?attrs a b c d = mk ?loc ?attrs (Pexp_fun (a, b, c, d))
    let function_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_function a)
    let apply ?loc ?attrs a b = mk ?loc ?attrs (Pexp_apply (a, b))
    let match_ ?loc ?attrs a b = mk ?loc ?attrs (Pexp_match (a, b))
    let try_ ?loc ?attrs a b = mk ?loc ?attrs (Pexp_try (a, b))
    let tuple ?loc ?attrs a = mk ?loc ?attrs (Pexp_tuple a)
    let construct ?loc ?attrs a b = mk ?loc ?attrs (Pexp_construct (a, b))
    let variant ?loc ?attrs a b = mk ?loc ?attrs (Pexp_variant (a, b))
    let record ?loc ?attrs a b = mk ?loc ?attrs (Pexp_record (a, b))
    let field ?loc ?attrs a b = mk ?loc ?attrs (Pexp_field (a, b))
    let setfield ?loc ?attrs a b c = mk ?loc ?attrs (Pexp_setfield (a, b, c))
    let array ?loc ?attrs a = mk ?loc ?attrs (Pexp_array a)
    let ifthenelse ?loc ?attrs a b c = mk ?loc ?attrs (Pexp_ifthenelse (a, b, c))
    let sequence ?loc ?attrs a b = mk ?loc ?attrs (Pexp_sequence (a, b))
    let while_ ?loc ?attrs a b = mk ?loc ?attrs (Pexp_while (a, b))
    let for_ ?loc ?attrs a b c d e = mk ?loc ?attrs (Pexp_for (a, b, c, d, e))
    let constraint_ ?loc ?attrs a b = mk ?loc ?attrs (Pexp_constraint (a, b))
    let coerce ?loc ?attrs a b c = mk ?loc ?attrs (Pexp_coerce (a, b, c))
    let send ?loc ?attrs a b = mk ?loc ?attrs (Pexp_send (a, b))
    let new_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_new a)
    let setinstvar ?loc ?attrs a b = mk ?loc ?attrs (Pexp_setinstvar (a, b))
    let override ?loc ?attrs a = mk ?loc ?attrs (Pexp_override a)
    let letmodule ?loc ?attrs a b c= mk ?loc ?attrs (Pexp_letmodule (a, b, c))
    let letexception ?loc ?attrs a b = mk ?loc ?attrs (Pexp_letexception (a, b))
    let assert_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_assert a)
    let lazy_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_lazy a)
    let poly ?loc ?attrs a b = mk ?loc ?attrs (Pexp_poly (a, b))
    let object_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_object a)
    let newtype ?loc ?attrs a b = mk ?loc ?attrs (Pexp_newtype (a, b))
    let pack ?loc ?attrs a = mk ?loc ?attrs (Pexp_pack a)
    let open_ ?loc ?attrs a b c = mk ?loc ?attrs (Pexp_open (a, b, c))
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pexp_extension a)
    let unreachable ?loc ?attrs () = mk ?loc ?attrs Pexp_unreachable

    let case lhs ?guard rhs =
      {
       pc_lhs = lhs;
       pc_guard = guard;
       pc_rhs = rhs;
      }
  end

  module Mty = struct
    let mk ?(loc = !default_loc) ?(attrs = []) d =
      {pmty_desc = d; pmty_loc = loc; pmty_attributes = attrs}
    let attr d a = {d with pmty_attributes = d.pmty_attributes @ [a]}

    let ident ?loc ?attrs a = mk ?loc ?attrs (Pmty_ident a)
    let alias ?loc ?attrs a = mk ?loc ?attrs (Pmty_alias a)
    let signature ?loc ?attrs a = mk ?loc ?attrs (Pmty_signature a)
    let functor_ ?loc ?attrs a b c = mk ?loc ?attrs (Pmty_functor (a, b, c))
    let with_ ?loc ?attrs a b = mk ?loc ?attrs (Pmty_with (a, b))
    let typeof_ ?loc ?attrs a = mk ?loc ?attrs (Pmty_typeof a)
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pmty_extension a)
  end

  module Mod = struct
  let mk ?(loc = !default_loc) ?(attrs = []) d =
    {pmod_desc = d; pmod_loc = loc; pmod_attributes = attrs}
    let attr d a = {d with pmod_attributes = d.pmod_attributes @ [a]}

    let ident ?loc ?attrs x = mk ?loc ?attrs (Pmod_ident x)
    let structure ?loc ?attrs x = mk ?loc ?attrs (Pmod_structure x)
    let functor_ ?loc ?attrs arg arg_ty body =
      mk ?loc ?attrs (Pmod_functor (arg, arg_ty, body))
    let apply ?loc ?attrs m1 m2 = mk ?loc ?attrs (Pmod_apply (m1, m2))
    let constraint_ ?loc ?attrs m mty = mk ?loc ?attrs (Pmod_constraint (m, mty))
    let unpack ?loc ?attrs e = mk ?loc ?attrs (Pmod_unpack e)
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pmod_extension a)
  end

  module Sig = struct
    let mk ?(loc = !default_loc) d = {psig_desc = d; psig_loc = loc}

    let value ?loc a = mk ?loc (Psig_value a)
    let type_ ?loc rec_flag a = mk ?loc (Psig_type (rec_flag, a))
    let type_extension ?loc a = mk ?loc (Psig_typext a)
    let exception_ ?loc a = mk ?loc (Psig_exception a)
    let module_ ?loc a = mk ?loc (Psig_module a)
    let rec_module ?loc a = mk ?loc (Psig_recmodule a)
    let modtype ?loc a = mk ?loc (Psig_modtype a)
    let open_ ?loc a = mk ?loc (Psig_open a)
    let include_ ?loc a = mk ?loc (Psig_include a)
    let class_ ?loc a = mk ?loc (Psig_class a)
    let class_type ?loc a = mk ?loc (Psig_class_type a)
    let extension ?loc ?(attrs = []) a = mk ?loc (Psig_extension (a, attrs))
    let attribute ?loc a = mk ?loc (Psig_attribute a)
    let text txt =
      let f_txt = List.filter (fun ds -> docstring_body ds <> "") txt in
      List.map
        (fun ds -> attribute ~loc:(docstring_loc ds) (text_attr ds))
        f_txt
  end

  module Str = struct
    let mk ?(loc = !default_loc) d = {pstr_desc = d; pstr_loc = loc}

    let eval ?loc ?(attrs = []) a = mk ?loc (Pstr_eval (a, attrs))
    let value ?loc a b = mk ?loc (Pstr_value (a, b))
    let primitive ?loc a = mk ?loc (Pstr_primitive a)
    let type_ ?loc rec_flag a = mk ?loc (Pstr_type (rec_flag, a))
    let type_extension ?loc a = mk ?loc (Pstr_typext a)
    let exception_ ?loc a = mk ?loc (Pstr_exception a)
    let module_ ?loc a = mk ?loc (Pstr_module a)
    let rec_module ?loc a = mk ?loc (Pstr_recmodule a)
    let modtype ?loc a = mk ?loc (Pstr_modtype a)
    let open_ ?loc a = mk ?loc (Pstr_open a)
    let class_ ?loc a = mk ?loc (Pstr_class a)
    let class_type ?loc a = mk ?loc (Pstr_class_type a)
    let include_ ?loc a = mk ?loc (Pstr_include a)
    let extension ?loc ?(attrs = []) a = mk ?loc (Pstr_extension (a, attrs))
    let attribute ?loc a = mk ?loc (Pstr_attribute a)
    let text txt =
      let f_txt = List.filter (fun ds -> docstring_body ds <> "") txt in
      List.map
        (fun ds -> attribute ~loc:(docstring_loc ds) (text_attr ds))
        f_txt
  end

  module Cl = struct
    let mk ?(loc = !default_loc) ?(attrs = []) d =
      {
       pcl_desc = d;
       pcl_loc = loc;
       pcl_attributes = attrs;
      }
    let attr d a = {d with pcl_attributes = d.pcl_attributes @ [a]}

    let constr ?loc ?attrs a b = mk ?loc ?attrs (Pcl_constr (a, b))
    let structure ?loc ?attrs a = mk ?loc ?attrs (Pcl_structure a)
    let fun_ ?loc ?attrs a b c d = mk ?loc ?attrs (Pcl_fun (a, b, c, d))
    let apply ?loc ?attrs a b = mk ?loc ?attrs (Pcl_apply (a, b))
    let let_ ?loc ?attrs a b c = mk ?loc ?attrs (Pcl_let (a, b, c))
    let constraint_ ?loc ?attrs a b = mk ?loc ?attrs (Pcl_constraint (a, b))
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pcl_extension a)
  end

  module Cty = struct
    let mk ?(loc = !default_loc) ?(attrs = []) d =
      {
       pcty_desc = d;
       pcty_loc = loc;
       pcty_attributes = attrs;
      }
    let attr d a = {d with pcty_attributes = d.pcty_attributes @ [a]}

    let constr ?loc ?attrs a b = mk ?loc ?attrs (Pcty_constr (a, b))
    let signature ?loc ?attrs a = mk ?loc ?attrs (Pcty_signature a)
    let arrow ?loc ?attrs a b c = mk ?loc ?attrs (Pcty_arrow (a, b, c))
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pcty_extension a)
  end

  module Ctf = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
             ?(docs = empty_docs) d =
      {
       pctf_desc = d;
       pctf_loc = loc;
       pctf_attributes = add_docs_attrs docs attrs;
      }

    let inherit_ ?loc ?attrs a = mk ?loc ?attrs (Pctf_inherit a)
    let val_ ?loc ?attrs a b c d = mk ?loc ?attrs (Pctf_val (a, b, c, d))
    let method_ ?loc ?attrs a b c d = mk ?loc ?attrs (Pctf_method (a, b, c, d))
    let constraint_ ?loc ?attrs a b = mk ?loc ?attrs (Pctf_constraint (a, b))
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pctf_extension a)
    let attribute ?loc a = mk ?loc (Pctf_attribute a)
    let text txt =
     let f_txt = List.filter (fun ds -> docstring_body ds <> "") txt in
       List.map
        (fun ds -> attribute ~loc:(docstring_loc ds) (text_attr ds))
        f_txt

    let attr d a = {d with pctf_attributes = d.pctf_attributes @ [a]}

  end

  module Cf = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) d =
      {
       pcf_desc = d;
       pcf_loc = loc;
       pcf_attributes = add_docs_attrs docs attrs;
      }

    let inherit_ ?loc ?attrs a b c = mk ?loc ?attrs (Pcf_inherit (a, b, c))
    let val_ ?loc ?attrs a b c = mk ?loc ?attrs (Pcf_val (a, b, c))
    let method_ ?loc ?attrs a b c = mk ?loc ?attrs (Pcf_method (a, b, c))
    let constraint_ ?loc ?attrs a b = mk ?loc ?attrs (Pcf_constraint (a, b))
    let initializer_ ?loc ?attrs a = mk ?loc ?attrs (Pcf_initializer a)
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pcf_extension a)
    let attribute ?loc a = mk ?loc (Pcf_attribute a)
    let text txt =
      let f_txt = List.filter (fun ds -> docstring_body ds <> "") txt in
      List.map
        (fun ds -> attribute ~loc:(docstring_loc ds) (text_attr ds))
        f_txt

    let virtual_ ct = Cfk_virtual ct
    let concrete o e = Cfk_concrete (o, e)

    let attr d a = {d with pcf_attributes = d.pcf_attributes @ [a]}

  end

  module Val = struct
    let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs)
          ?(prim = []) name typ =
      {
       pval_name = name;
       pval_type = typ;
       pval_attributes = add_docs_attrs docs attrs;
       pval_loc = loc;
       pval_prim = prim;
      }
  end

  module Md = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(text = []) name typ =
      {
       pmd_name = name;
       pmd_type = typ;
       pmd_attributes =
         add_text_attrs text (add_docs_attrs docs attrs);
       pmd_loc = loc;
      }
  end

  module Mtd = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(text = []) ?typ name =
      {
       pmtd_name = name;
       pmtd_type = typ;
       pmtd_attributes =
         add_text_attrs text (add_docs_attrs docs attrs);
       pmtd_loc = loc;
      }
  end

  module Mb = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(text = []) name expr =
      {
       pmb_name = name;
       pmb_expr = expr;
       pmb_attributes =
         add_text_attrs text (add_docs_attrs docs attrs);
       pmb_loc = loc;
      }
  end

  module Opn = struct
    let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs)
          ?(override = Fresh) lid =
      {
       popen_lid = lid;
       popen_override = override;
       popen_loc = loc;
       popen_attributes = add_docs_attrs docs attrs;
      }
  end

  module Incl = struct
    let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs) mexpr =
      {
       pincl_mod = mexpr;
       pincl_loc = loc;
       pincl_attributes = add_docs_attrs docs attrs;
      }

  end

  module Vb = struct
    let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs)
          ?(text = []) pat expr =
      {
       pvb_pat = pat;
       pvb_expr = expr;
       pvb_attributes =
         add_text_attrs text (add_docs_attrs docs attrs);
       pvb_loc = loc;
      }
  end

  module Ci = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(text = [])
          ?(virt = Concrete) ?(params = []) name expr =
      {
       pci_virt = virt;
       pci_params = params;
       pci_name = name;
       pci_expr = expr;
       pci_attributes =
         add_text_attrs text (add_docs_attrs docs attrs);
       pci_loc = loc;
      }
  end

  module Type = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(text = [])
        ?(params = [])
        ?(cstrs = [])
        ?(kind = Ptype_abstract)
        ?(priv = Public)
        ?manifest
        name =
      {
       ptype_name = name;
       ptype_params = params;
       ptype_cstrs = cstrs;
       ptype_kind = kind;
       ptype_private = priv;
       ptype_manifest = manifest;
       ptype_attributes =
         add_text_attrs text (add_docs_attrs docs attrs);
       ptype_loc = loc;
      }

    let constructor ?(loc = !default_loc) ?(attrs = []) ?(info = empty_info)
          ?(args = Pcstr_tuple []) ?res name =
      {
       pcd_name = name;
       pcd_args = args;
       pcd_res = res;
       pcd_loc = loc;
       pcd_attributes = add_info_attrs info attrs;
       }

    let field ?(loc = !default_loc) ?(attrs = []) ?(info = empty_info)
          ?(mut = Immutable) name typ =
      {
       pld_name = name;
       pld_mutable = mut;
       pld_type = typ;
       pld_loc = loc;
       pld_attributes = add_info_attrs info attrs;
      }

  end

  (** Type extensions *)
  module Te = struct
    let mk ?(attrs = []) ?(docs = empty_docs)
          ?(params = []) ?(priv = Public) path constructors =
      {
       ptyext_path = path;
       ptyext_params = params;
       ptyext_constructors = constructors;
       ptyext_private = priv;
       ptyext_attributes = add_docs_attrs docs attrs;
      }

    let constructor ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(info = empty_info) name kind =
      {
       pext_name = name;
       pext_kind = kind;
       pext_loc = loc;
       pext_attributes = add_docs_attrs docs (add_info_attrs info attrs);
      }

    let decl ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs)
               ?(info = empty_info) ?(args = Pcstr_tuple []) ?res name =
      {
       pext_name = name;
       pext_kind = Pext_decl(args, res);
       pext_loc = loc;
       pext_attributes = add_docs_attrs docs (add_info_attrs info attrs);
      }

    let rebind ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(info = empty_info) name lid =
      {
       pext_name = name;
       pext_kind = Pext_rebind lid;
       pext_loc = loc;
       pext_attributes = add_docs_attrs docs (add_info_attrs info attrs);
      }

  end

  module Csig = struct
    let mk self fields =
      {
       pcsig_self = self;
       pcsig_fields = fields;
      }
  end

  module Cstr = struct
    let mk self fields =
      {
       pcstr_self = self;
       pcstr_fields = fields;
      }
  end

end

module Ast_mapper : sig
  (** The interface of a -ppx rewriter

    A -ppx rewriter is a program that accepts a serialized abstract syntax
    tree and outputs another, possibly modified, abstract syntax tree.
    This module encapsulates the interface between the compiler and
    the -ppx rewriters, handling such details as the serialization format,
    forwarding of command-line flags, and storing state.

    {!mapper} allows to implement AST rewriting using open recursion.
    A typical mapper would be based on {!default_mapper}, a deep
    identity mapper, and will fall back on it for handling the syntax it
    does not modify. For example:

    {[
  open Asttypes
  open Parsetree
  open Ast_mapper

  let test_mapper argv =
    { default_mapper with
      expr = fun mapper expr ->
        match expr with
        | { pexp_desc = Pexp_extension ({ txt = "test" }, PStr [])} ->
          Ast_helper.Exp.constant (Const_int 42)
        | other -> default_mapper.expr mapper other; }

  let () =
    register "ppx_test" test_mapper]}

    This -ppx rewriter, which replaces [[%test]] in expressions with
    the constant [42], can be compiled using
    [ocamlc -o ppx_test -I +compiler-libs ocamlcommon.cma ppx_test.ml].

    *)

  open Parsetree

  (** {2 A generic Parsetree mapper} *)

  type mapper (*IF_CURRENT = Ast_mapper.mapper*) = {
    attribute: mapper -> attribute -> attribute;
    attributes: mapper -> attribute list -> attribute list;
    case: mapper -> case -> case;
    cases: mapper -> case list -> case list;
    class_declaration: mapper -> class_declaration -> class_declaration;
    class_description: mapper -> class_description -> class_description;
    class_expr: mapper -> class_expr -> class_expr;
    class_field: mapper -> class_field -> class_field;
    class_signature: mapper -> class_signature -> class_signature;
    class_structure: mapper -> class_structure -> class_structure;
    class_type: mapper -> class_type -> class_type;
    class_type_declaration: mapper -> class_type_declaration
                            -> class_type_declaration;
    class_type_field: mapper -> class_type_field -> class_type_field;
    constructor_declaration: mapper -> constructor_declaration
                             -> constructor_declaration;
    expr: mapper -> expression -> expression;
    extension: mapper -> extension -> extension;
    extension_constructor: mapper -> extension_constructor
                           -> extension_constructor;
    include_declaration: mapper -> include_declaration -> include_declaration;
    include_description: mapper -> include_description -> include_description;
    label_declaration: mapper -> label_declaration -> label_declaration;
    location: mapper -> Location.t -> Location.t;
    module_binding: mapper -> module_binding -> module_binding;
    module_declaration: mapper -> module_declaration -> module_declaration;
    module_expr: mapper -> module_expr -> module_expr;
    module_type: mapper -> module_type -> module_type;
    module_type_declaration: mapper -> module_type_declaration
                             -> module_type_declaration;
    open_description: mapper -> open_description -> open_description;
    pat: mapper -> pattern -> pattern;
    payload: mapper -> payload -> payload;
    signature: mapper -> signature -> signature;
    signature_item: mapper -> signature_item -> signature_item;
    structure: mapper -> structure -> structure;
    structure_item: mapper -> structure_item -> structure_item;
    typ: mapper -> core_type -> core_type;
    type_declaration: mapper -> type_declaration -> type_declaration;
    type_extension: mapper -> type_extension -> type_extension;
    type_kind: mapper -> type_kind -> type_kind;
    value_binding: mapper -> value_binding -> value_binding;
    value_description: mapper -> value_description -> value_description;
    with_constraint: mapper -> with_constraint -> with_constraint;
  }
  (** A mapper record implements one "method" per syntactic category,
      using an open recursion style: each method takes as its first
      argument the mapper to be applied to children in the syntax
      tree. *)

  val default_mapper: mapper
  (** A default mapper, which implements a "deep identity" mapping. *)

  (** {2 Convenience functions to write mappers} *)

  val map_opt: ('a -> 'b) -> 'a option -> 'b option

  val extension_of_error: Location.error -> extension
  (** Encode an error into an 'ocaml.error' extension node which can be
      inserted in a generated Parsetree.  The compiler will be
      responsible for reporting the error. *)

  val attribute_of_warning: Location.t -> string -> attribute
  (** Encode a warning message into an 'ocaml.ppwarning' attribute which can be
      inserted in a generated Parsetree.  The compiler will be
      responsible for reporting the warning. *)

end = struct
  (* A generic Parsetree mapping class *)

  (*
  [@@@ocaml.warning "+9"]
    (* Ensure that record patterns don't miss any field. *)
  *)


  open Parsetree
  open Ast_helper
  open Location

  type mapper (*IF_CURRENT = Ast_mapper.mapper*) = {
    attribute: mapper -> attribute -> attribute;
    attributes: mapper -> attribute list -> attribute list;
    case: mapper -> case -> case;
    cases: mapper -> case list -> case list;
    class_declaration: mapper -> class_declaration -> class_declaration;
    class_description: mapper -> class_description -> class_description;
    class_expr: mapper -> class_expr -> class_expr;
    class_field: mapper -> class_field -> class_field;
    class_signature: mapper -> class_signature -> class_signature;
    class_structure: mapper -> class_structure -> class_structure;
    class_type: mapper -> class_type -> class_type;
    class_type_declaration: mapper -> class_type_declaration
                            -> class_type_declaration;
    class_type_field: mapper -> class_type_field -> class_type_field;
    constructor_declaration: mapper -> constructor_declaration
                             -> constructor_declaration;
    expr: mapper -> expression -> expression;
    extension: mapper -> extension -> extension;
    extension_constructor: mapper -> extension_constructor
                           -> extension_constructor;
    include_declaration: mapper -> include_declaration -> include_declaration;
    include_description: mapper -> include_description -> include_description;
    label_declaration: mapper -> label_declaration -> label_declaration;
    location: mapper -> Location.t -> Location.t;
    module_binding: mapper -> module_binding -> module_binding;
    module_declaration: mapper -> module_declaration -> module_declaration;
    module_expr: mapper -> module_expr -> module_expr;
    module_type: mapper -> module_type -> module_type;
    module_type_declaration: mapper -> module_type_declaration
                             -> module_type_declaration;
    open_description: mapper -> open_description -> open_description;
    pat: mapper -> pattern -> pattern;
    payload: mapper -> payload -> payload;
    signature: mapper -> signature -> signature;
    signature_item: mapper -> signature_item -> signature_item;
    structure: mapper -> structure -> structure;
    structure_item: mapper -> structure_item -> structure_item;
    typ: mapper -> core_type -> core_type;
    type_declaration: mapper -> type_declaration -> type_declaration;
    type_extension: mapper -> type_extension -> type_extension;
    type_kind: mapper -> type_kind -> type_kind;
    value_binding: mapper -> value_binding -> value_binding;
    value_description: mapper -> value_description -> value_description;
    with_constraint: mapper -> with_constraint -> with_constraint;
  }

  let map_fst f (x, y) = (f x, y)
  let map_snd f (x, y) = (x, f y)
  let map_tuple f1 f2 (x, y) = (f1 x, f2 y)
  let map_tuple3 f1 f2 f3 (x, y, z) = (f1 x, f2 y, f3 z)
  let map_opt f = function None -> None | Some x -> Some (f x)

  let map_loc sub {loc; txt} = {loc = sub.location sub loc; txt}

  module T = struct
    (* Type expressions for the core language *)

    let row_field sub = function
      | Rtag (l, attrs, b, tl) ->
          Rtag (l, sub.attributes sub attrs, b, List.map (sub.typ sub) tl)
      | Rinherit t -> Rinherit (sub.typ sub t)

    let map sub {ptyp_desc = desc; ptyp_loc = loc; ptyp_attributes = attrs} =
      let open Typ in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Ptyp_any -> any ~loc ~attrs ()
      | Ptyp_var s -> var ~loc ~attrs s
      | Ptyp_arrow (lab, t1, t2) ->
          arrow ~loc ~attrs lab (sub.typ sub t1) (sub.typ sub t2)
      | Ptyp_tuple tyl -> tuple ~loc ~attrs (List.map (sub.typ sub) tyl)
      | Ptyp_constr (lid, tl) ->
          constr ~loc ~attrs (map_loc sub lid) (List.map (sub.typ sub) tl)
      | Ptyp_object (l, o) ->
          let f (s, a, t) =
            (map_loc sub s, sub.attributes sub a, sub.typ sub t) in
          object_ ~loc ~attrs (List.map f l) o
      | Ptyp_class (lid, tl) ->
          class_ ~loc ~attrs (map_loc sub lid) (List.map (sub.typ sub) tl)
      | Ptyp_alias (t, s) -> alias ~loc ~attrs (sub.typ sub t) s
      | Ptyp_variant (rl, b, ll) ->
          variant ~loc ~attrs (List.map (row_field sub) rl) b ll
      | Ptyp_poly (sl, t) -> poly ~loc ~attrs
                               (List.map (map_loc sub) sl) (sub.typ sub t)
      | Ptyp_package (lid, l) ->
          package ~loc ~attrs (map_loc sub lid)
            (List.map (map_tuple (map_loc sub) (sub.typ sub)) l)
      | Ptyp_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_type_declaration sub
        {ptype_name; ptype_params; ptype_cstrs;
         ptype_kind;
         ptype_private;
         ptype_manifest;
         ptype_attributes;
         ptype_loc} =
      Type.mk (map_loc sub ptype_name)
        ~params:(List.map (map_fst (sub.typ sub)) ptype_params)
        ~priv:ptype_private
        ~cstrs:(List.map
                  (map_tuple3 (sub.typ sub) (sub.typ sub) (sub.location sub))
                  ptype_cstrs)
        ~kind:(sub.type_kind sub ptype_kind)
        ?manifest:(map_opt (sub.typ sub) ptype_manifest)
        ~loc:(sub.location sub ptype_loc)
        ~attrs:(sub.attributes sub ptype_attributes)

    let map_type_kind sub = function
      | Ptype_abstract -> Ptype_abstract
      | Ptype_variant l ->
          Ptype_variant (List.map (sub.constructor_declaration sub) l)
      | Ptype_record l -> Ptype_record (List.map (sub.label_declaration sub) l)
      | Ptype_open -> Ptype_open

    let map_constructor_arguments sub = function
      | Pcstr_tuple l -> Pcstr_tuple (List.map (sub.typ sub) l)
      | Pcstr_record l ->
          Pcstr_record (List.map (sub.label_declaration sub) l)

    let map_type_extension sub
        {ptyext_path; ptyext_params;
         ptyext_constructors;
         ptyext_private;
         ptyext_attributes} =
      Te.mk
        (map_loc sub ptyext_path)
        (List.map (sub.extension_constructor sub) ptyext_constructors)
        ~params:(List.map (map_fst (sub.typ sub)) ptyext_params)
        ~priv:ptyext_private
        ~attrs:(sub.attributes sub ptyext_attributes)

    let map_extension_constructor_kind sub = function
        Pext_decl(ctl, cto) ->
          Pext_decl(map_constructor_arguments sub ctl, map_opt (sub.typ sub) cto)
      | Pext_rebind li ->
          Pext_rebind (map_loc sub li)

    let map_extension_constructor sub
        {pext_name;
         pext_kind;
         pext_loc;
         pext_attributes} =
      Te.constructor
        (map_loc sub pext_name)
        (map_extension_constructor_kind sub pext_kind)
        ~loc:(sub.location sub pext_loc)
        ~attrs:(sub.attributes sub pext_attributes)

  end

  module CT = struct
    (* Type expressions for the class language *)

    let map sub {pcty_loc = loc; pcty_desc = desc; pcty_attributes = attrs} =
      let open Cty in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pcty_constr (lid, tys) ->
          constr ~loc ~attrs (map_loc sub lid) (List.map (sub.typ sub) tys)
      | Pcty_signature x -> signature ~loc ~attrs (sub.class_signature sub x)
      | Pcty_arrow (lab, t, ct) ->
          arrow ~loc ~attrs lab (sub.typ sub t) (sub.class_type sub ct)
      | Pcty_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_field sub {pctf_desc = desc; pctf_loc = loc; pctf_attributes = attrs}
      =
      let open Ctf in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pctf_inherit ct -> inherit_ ~loc ~attrs (sub.class_type sub ct)
      | Pctf_val (s, m, v, t) ->
          val_ ~loc ~attrs (map_loc sub s) m v (sub.typ sub t)
      | Pctf_method (s, p, v, t) ->
          method_ ~loc ~attrs (map_loc sub s) p v (sub.typ sub t)
      | Pctf_constraint (t1, t2) ->
          constraint_ ~loc ~attrs (sub.typ sub t1) (sub.typ sub t2)
      | Pctf_attribute x -> attribute ~loc (sub.attribute sub x)
      | Pctf_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_signature sub {pcsig_self; pcsig_fields} =
      Csig.mk
        (sub.typ sub pcsig_self)
        (List.map (sub.class_type_field sub) pcsig_fields)
  end

  module MT = struct
    (* Type expressions for the module language *)

    let map sub {pmty_desc = desc; pmty_loc = loc; pmty_attributes = attrs} =
      let open Mty in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pmty_ident s -> ident ~loc ~attrs (map_loc sub s)
      | Pmty_alias s -> alias ~loc ~attrs (map_loc sub s)
      | Pmty_signature sg -> signature ~loc ~attrs (sub.signature sub sg)
      | Pmty_functor (s, mt1, mt2) ->
          functor_ ~loc ~attrs (map_loc sub s)
            (Misc.may_map (sub.module_type sub) mt1)
            (sub.module_type sub mt2)
      | Pmty_with (mt, l) ->
          with_ ~loc ~attrs (sub.module_type sub mt)
            (List.map (sub.with_constraint sub) l)
      | Pmty_typeof me -> typeof_ ~loc ~attrs (sub.module_expr sub me)
      | Pmty_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_with_constraint sub = function
      | Pwith_type (lid, d) ->
          Pwith_type (map_loc sub lid, sub.type_declaration sub d)
      | Pwith_module (lid, lid2) ->
          Pwith_module (map_loc sub lid, map_loc sub lid2)
      | Pwith_typesubst d -> Pwith_typesubst (sub.type_declaration sub d)
      | Pwith_modsubst (s, lid) ->
          Pwith_modsubst (map_loc sub s, map_loc sub lid)

    let map_signature_item sub {psig_desc = desc; psig_loc = loc} =
      let open Sig in
      let loc = sub.location sub loc in
      match desc with
      | Psig_value vd -> value ~loc (sub.value_description sub vd)
      | Psig_type (rf, l) -> type_ ~loc rf (List.map (sub.type_declaration sub) l)
      | Psig_typext te -> type_extension ~loc (sub.type_extension sub te)
      | Psig_exception ed -> exception_ ~loc (sub.extension_constructor sub ed)
      | Psig_module x -> module_ ~loc (sub.module_declaration sub x)
      | Psig_recmodule l ->
          rec_module ~loc (List.map (sub.module_declaration sub) l)
      | Psig_modtype x -> modtype ~loc (sub.module_type_declaration sub x)
      | Psig_open x -> open_ ~loc (sub.open_description sub x)
      | Psig_include x -> include_ ~loc (sub.include_description sub x)
      | Psig_class l -> class_ ~loc (List.map (sub.class_description sub) l)
      | Psig_class_type l ->
          class_type ~loc (List.map (sub.class_type_declaration sub) l)
      | Psig_extension (x, attrs) ->
          extension ~loc (sub.extension sub x) ~attrs:(sub.attributes sub attrs)
      | Psig_attribute x -> attribute ~loc (sub.attribute sub x)
  end


  module M = struct
    (* Value expressions for the module language *)

    let map sub {pmod_loc = loc; pmod_desc = desc; pmod_attributes = attrs} =
      let open Mod in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pmod_ident x -> ident ~loc ~attrs (map_loc sub x)
      | Pmod_structure str -> structure ~loc ~attrs (sub.structure sub str)
      | Pmod_functor (arg, arg_ty, body) ->
          functor_ ~loc ~attrs (map_loc sub arg)
            (Misc.may_map (sub.module_type sub) arg_ty)
            (sub.module_expr sub body)
      | Pmod_apply (m1, m2) ->
          apply ~loc ~attrs (sub.module_expr sub m1) (sub.module_expr sub m2)
      | Pmod_constraint (m, mty) ->
          constraint_ ~loc ~attrs (sub.module_expr sub m)
                      (sub.module_type sub mty)
      | Pmod_unpack e -> unpack ~loc ~attrs (sub.expr sub e)
      | Pmod_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_structure_item sub {pstr_loc = loc; pstr_desc = desc} =
      let open Str in
      let loc = sub.location sub loc in
      match desc with
      | Pstr_eval (x, attrs) ->
          eval ~loc ~attrs:(sub.attributes sub attrs) (sub.expr sub x)
      | Pstr_value (r, vbs) -> value ~loc r (List.map (sub.value_binding sub) vbs)
      | Pstr_primitive vd -> primitive ~loc (sub.value_description sub vd)
      | Pstr_type (rf, l) -> type_ ~loc rf (List.map (sub.type_declaration sub) l)
      | Pstr_typext te -> type_extension ~loc (sub.type_extension sub te)
      | Pstr_exception ed -> exception_ ~loc (sub.extension_constructor sub ed)
      | Pstr_module x -> module_ ~loc (sub.module_binding sub x)
      | Pstr_recmodule l -> rec_module ~loc (List.map (sub.module_binding sub) l)
      | Pstr_modtype x -> modtype ~loc (sub.module_type_declaration sub x)
      | Pstr_open x -> open_ ~loc (sub.open_description sub x)
      | Pstr_class l -> class_ ~loc (List.map (sub.class_declaration sub) l)
      | Pstr_class_type l ->
          class_type ~loc (List.map (sub.class_type_declaration sub) l)
      | Pstr_include x -> include_ ~loc (sub.include_declaration sub x)
      | Pstr_extension (x, attrs) ->
          extension ~loc (sub.extension sub x) ~attrs:(sub.attributes sub attrs)
      | Pstr_attribute x -> attribute ~loc (sub.attribute sub x)
  end

  module E = struct
    (* Value expressions for the core language *)

    let map sub {pexp_loc = loc; pexp_desc = desc; pexp_attributes = attrs} =
      let open Exp in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pexp_ident x -> ident ~loc ~attrs (map_loc sub x)
      | Pexp_constant x -> constant ~loc ~attrs x
      | Pexp_let (r, vbs, e) ->
          let_ ~loc ~attrs r (List.map (sub.value_binding sub) vbs)
            (sub.expr sub e)
      | Pexp_fun (lab, def, p, e) ->
          fun_ ~loc ~attrs lab (map_opt (sub.expr sub) def) (sub.pat sub p)
            (sub.expr sub e)
      | Pexp_function pel -> function_ ~loc ~attrs (sub.cases sub pel)
      | Pexp_apply (e, l) ->
          apply ~loc ~attrs (sub.expr sub e) (List.map (map_snd (sub.expr sub)) l)
      | Pexp_match (e, pel) ->
          match_ ~loc ~attrs (sub.expr sub e) (sub.cases sub pel)
      | Pexp_try (e, pel) -> try_ ~loc ~attrs (sub.expr sub e) (sub.cases sub pel)
      | Pexp_tuple el -> tuple ~loc ~attrs (List.map (sub.expr sub) el)
      | Pexp_construct (lid, arg) ->
          construct ~loc ~attrs (map_loc sub lid) (map_opt (sub.expr sub) arg)
      | Pexp_variant (lab, eo) ->
          variant ~loc ~attrs lab (map_opt (sub.expr sub) eo)
      | Pexp_record (l, eo) ->
          record ~loc ~attrs (List.map (map_tuple (map_loc sub) (sub.expr sub)) l)
            (map_opt (sub.expr sub) eo)
      | Pexp_field (e, lid) ->
          field ~loc ~attrs (sub.expr sub e) (map_loc sub lid)
      | Pexp_setfield (e1, lid, e2) ->
          setfield ~loc ~attrs (sub.expr sub e1) (map_loc sub lid)
            (sub.expr sub e2)
      | Pexp_array el -> array ~loc ~attrs (List.map (sub.expr sub) el)
      | Pexp_ifthenelse (e1, e2, e3) ->
          ifthenelse ~loc ~attrs (sub.expr sub e1) (sub.expr sub e2)
            (map_opt (sub.expr sub) e3)
      | Pexp_sequence (e1, e2) ->
          sequence ~loc ~attrs (sub.expr sub e1) (sub.expr sub e2)
      | Pexp_while (e1, e2) ->
          while_ ~loc ~attrs (sub.expr sub e1) (sub.expr sub e2)
      | Pexp_for (p, e1, e2, d, e3) ->
          for_ ~loc ~attrs (sub.pat sub p) (sub.expr sub e1) (sub.expr sub e2) d
            (sub.expr sub e3)
      | Pexp_coerce (e, t1, t2) ->
          coerce ~loc ~attrs (sub.expr sub e) (map_opt (sub.typ sub) t1)
            (sub.typ sub t2)
      | Pexp_constraint (e, t) ->
          constraint_ ~loc ~attrs (sub.expr sub e) (sub.typ sub t)
      | Pexp_send (e, s) ->
          send ~loc ~attrs (sub.expr sub e) (map_loc sub s)
      | Pexp_new lid -> new_ ~loc ~attrs (map_loc sub lid)
      | Pexp_setinstvar (s, e) ->
          setinstvar ~loc ~attrs (map_loc sub s) (sub.expr sub e)
      | Pexp_override sel ->
          override ~loc ~attrs
            (List.map (map_tuple (map_loc sub) (sub.expr sub)) sel)
      | Pexp_letmodule (s, me, e) ->
          letmodule ~loc ~attrs (map_loc sub s) (sub.module_expr sub me)
            (sub.expr sub e)
      | Pexp_letexception (cd, e) ->
          letexception ~loc ~attrs
            (sub.extension_constructor sub cd)
            (sub.expr sub e)
      | Pexp_assert e -> assert_ ~loc ~attrs (sub.expr sub e)
      | Pexp_lazy e -> lazy_ ~loc ~attrs (sub.expr sub e)
      | Pexp_poly (e, t) ->
          poly ~loc ~attrs (sub.expr sub e) (map_opt (sub.typ sub) t)
      | Pexp_object cls -> object_ ~loc ~attrs (sub.class_structure sub cls)
      | Pexp_newtype (s, e) ->
          newtype ~loc ~attrs (map_loc sub s) (sub.expr sub e)
      | Pexp_pack me -> pack ~loc ~attrs (sub.module_expr sub me)
      | Pexp_open (ovf, lid, e) ->
          open_ ~loc ~attrs ovf (map_loc sub lid) (sub.expr sub e)
      | Pexp_extension x -> extension ~loc ~attrs (sub.extension sub x)
      | Pexp_unreachable -> unreachable ~loc ~attrs ()
  end

  module P = struct
    (* Patterns *)

    let map sub {ppat_desc = desc; ppat_loc = loc; ppat_attributes = attrs} =
      let open Pat in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Ppat_any -> any ~loc ~attrs ()
      | Ppat_var s -> var ~loc ~attrs (map_loc sub s)
      | Ppat_alias (p, s) -> alias ~loc ~attrs (sub.pat sub p) (map_loc sub s)
      | Ppat_constant c -> constant ~loc ~attrs c
      | Ppat_interval (c1, c2) -> interval ~loc ~attrs c1 c2
      | Ppat_tuple pl -> tuple ~loc ~attrs (List.map (sub.pat sub) pl)
      | Ppat_construct (l, p) ->
          construct ~loc ~attrs (map_loc sub l) (map_opt (sub.pat sub) p)
      | Ppat_variant (l, p) -> variant ~loc ~attrs l (map_opt (sub.pat sub) p)
      | Ppat_record (lpl, cf) ->
          record ~loc ~attrs
                 (List.map (map_tuple (map_loc sub) (sub.pat sub)) lpl) cf
      | Ppat_array pl -> array ~loc ~attrs (List.map (sub.pat sub) pl)
      | Ppat_or (p1, p2) -> or_ ~loc ~attrs (sub.pat sub p1) (sub.pat sub p2)
      | Ppat_constraint (p, t) ->
          constraint_ ~loc ~attrs (sub.pat sub p) (sub.typ sub t)
      | Ppat_type s -> type_ ~loc ~attrs (map_loc sub s)
      | Ppat_lazy p -> lazy_ ~loc ~attrs (sub.pat sub p)
      | Ppat_unpack s -> unpack ~loc ~attrs (map_loc sub s)
      | Ppat_open (lid,p) -> open_ ~loc ~attrs (map_loc sub lid) (sub.pat sub p)
      | Ppat_exception p -> exception_ ~loc ~attrs (sub.pat sub p)
      | Ppat_extension x -> extension ~loc ~attrs (sub.extension sub x)
  end

  module CE = struct
    (* Value expressions for the class language *)

    let map sub {pcl_loc = loc; pcl_desc = desc; pcl_attributes = attrs} =
      let open Cl in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pcl_constr (lid, tys) ->
          constr ~loc ~attrs (map_loc sub lid) (List.map (sub.typ sub) tys)
      | Pcl_structure s ->
          structure ~loc ~attrs (sub.class_structure sub s)
      | Pcl_fun (lab, e, p, ce) ->
          fun_ ~loc ~attrs lab
            (map_opt (sub.expr sub) e)
            (sub.pat sub p)
            (sub.class_expr sub ce)
      | Pcl_apply (ce, l) ->
          apply ~loc ~attrs (sub.class_expr sub ce)
            (List.map (map_snd (sub.expr sub)) l)
      | Pcl_let (r, vbs, ce) ->
          let_ ~loc ~attrs r (List.map (sub.value_binding sub) vbs)
            (sub.class_expr sub ce)
      | Pcl_constraint (ce, ct) ->
          constraint_ ~loc ~attrs (sub.class_expr sub ce) (sub.class_type sub ct)
      | Pcl_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_kind sub = function
      | Cfk_concrete (o, e) -> Cfk_concrete (o, sub.expr sub e)
      | Cfk_virtual t -> Cfk_virtual (sub.typ sub t)

    let map_field sub {pcf_desc = desc; pcf_loc = loc; pcf_attributes = attrs} =
      let open Cf in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pcf_inherit (o, ce, s) ->
          inherit_ ~loc ~attrs o (sub.class_expr sub ce)
            (map_opt (map_loc sub) s)
      | Pcf_val (s, m, k) -> val_ ~loc ~attrs (map_loc sub s) m (map_kind sub k)
      | Pcf_method (s, p, k) ->
          method_ ~loc ~attrs (map_loc sub s) p (map_kind sub k)
      | Pcf_constraint (t1, t2) ->
          constraint_ ~loc ~attrs (sub.typ sub t1) (sub.typ sub t2)
      | Pcf_initializer e -> initializer_ ~loc ~attrs (sub.expr sub e)
      | Pcf_attribute x -> attribute ~loc (sub.attribute sub x)
      | Pcf_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_structure sub {pcstr_self; pcstr_fields} =
      {
        pcstr_self = sub.pat sub pcstr_self;
        pcstr_fields = List.map (sub.class_field sub) pcstr_fields;
      }

    let class_infos sub f {pci_virt; pci_params = pl; pci_name; pci_expr;
                           pci_loc; pci_attributes} =
      Ci.mk
       ~virt:pci_virt
       ~params:(List.map (map_fst (sub.typ sub)) pl)
        (map_loc sub pci_name)
        (f pci_expr)
        ~loc:(sub.location sub pci_loc)
        ~attrs:(sub.attributes sub pci_attributes)
  end

  (* Now, a generic AST mapper, to be extended to cover all kinds and
     cases of the OCaml grammar.  The default behavior of the mapper is
     the identity. *)

  let default_mapper =
    {
      structure = (fun this l -> List.map (this.structure_item this) l);
      structure_item = M.map_structure_item;
      module_expr = M.map;
      signature = (fun this l -> List.map (this.signature_item this) l);
      signature_item = MT.map_signature_item;
      module_type = MT.map;
      with_constraint = MT.map_with_constraint;
      class_declaration =
        (fun this -> CE.class_infos this (this.class_expr this));
      class_expr = CE.map;
      class_field = CE.map_field;
      class_structure = CE.map_structure;
      class_type = CT.map;
      class_type_field = CT.map_field;
      class_signature = CT.map_signature;
      class_type_declaration =
        (fun this -> CE.class_infos this (this.class_type this));
      class_description =
        (fun this -> CE.class_infos this (this.class_type this));
      type_declaration = T.map_type_declaration;
      type_kind = T.map_type_kind;
      typ = T.map;
      type_extension = T.map_type_extension;
      extension_constructor = T.map_extension_constructor;
      value_description =
        (fun this {pval_name; pval_type; pval_prim; pval_loc;
                   pval_attributes} ->
          Val.mk
            (map_loc this pval_name)
            (this.typ this pval_type)
            ~attrs:(this.attributes this pval_attributes)
            ~loc:(this.location this pval_loc)
            ~prim:pval_prim
        );

      pat = P.map;
      expr = E.map;

      module_declaration =
        (fun this {pmd_name; pmd_type; pmd_attributes; pmd_loc} ->
           Md.mk
             (map_loc this pmd_name)
             (this.module_type this pmd_type)
             ~attrs:(this.attributes this pmd_attributes)
             ~loc:(this.location this pmd_loc)
        );

      module_type_declaration =
        (fun this {pmtd_name; pmtd_type; pmtd_attributes; pmtd_loc} ->
           Mtd.mk
             (map_loc this pmtd_name)
             ?typ:(map_opt (this.module_type this) pmtd_type)
             ~attrs:(this.attributes this pmtd_attributes)
             ~loc:(this.location this pmtd_loc)
        );

      module_binding =
        (fun this {pmb_name; pmb_expr; pmb_attributes; pmb_loc} ->
           Mb.mk (map_loc this pmb_name) (this.module_expr this pmb_expr)
             ~attrs:(this.attributes this pmb_attributes)
             ~loc:(this.location this pmb_loc)
        );


      open_description =
        (fun this {popen_lid; popen_override; popen_attributes; popen_loc} ->
           Opn.mk (map_loc this popen_lid)
             ~override:popen_override
             ~loc:(this.location this popen_loc)
             ~attrs:(this.attributes this popen_attributes)
        );


      include_description =
        (fun this {pincl_mod; pincl_attributes; pincl_loc} ->
           Incl.mk (this.module_type this pincl_mod)
             ~loc:(this.location this pincl_loc)
             ~attrs:(this.attributes this pincl_attributes)
        );

      include_declaration =
        (fun this {pincl_mod; pincl_attributes; pincl_loc} ->
           Incl.mk (this.module_expr this pincl_mod)
             ~loc:(this.location this pincl_loc)
             ~attrs:(this.attributes this pincl_attributes)
        );


      value_binding =
        (fun this {pvb_pat; pvb_expr; pvb_attributes; pvb_loc} ->
           Vb.mk
             (this.pat this pvb_pat)
             (this.expr this pvb_expr)
             ~loc:(this.location this pvb_loc)
             ~attrs:(this.attributes this pvb_attributes)
        );


      constructor_declaration =
        (fun this {pcd_name; pcd_args; pcd_res; pcd_loc; pcd_attributes} ->
          Type.constructor
            (map_loc this pcd_name)
            ~args:(T.map_constructor_arguments this pcd_args)
            ?res:(map_opt (this.typ this) pcd_res)
            ~loc:(this.location this pcd_loc)
            ~attrs:(this.attributes this pcd_attributes)
        );

      label_declaration =
        (fun this {pld_name; pld_type; pld_loc; pld_mutable; pld_attributes} ->
           Type.field
             (map_loc this pld_name)
             (this.typ this pld_type)
             ~mut:pld_mutable
             ~loc:(this.location this pld_loc)
             ~attrs:(this.attributes this pld_attributes)
        );

      cases = (fun this l -> List.map (this.case this) l);
      case =
        (fun this {pc_lhs; pc_guard; pc_rhs} ->
           {
             pc_lhs = this.pat this pc_lhs;
             pc_guard = map_opt (this.expr this) pc_guard;
             pc_rhs = this.expr this pc_rhs;
           }
        );



      location = (fun _this l -> l);

      extension = (fun this (s, e) -> (map_loc this s, this.payload this e));
      attribute = (fun this (s, e) -> (map_loc this s, this.payload this e));
      attributes = (fun this l -> List.map (this.attribute this) l);
      payload =
        (fun this -> function
           | PStr x -> PStr (this.structure this x)
           | PSig x -> PSig (this.signature this x)
           | PTyp x -> PTyp (this.typ this x)
           | PPat (x, g) -> PPat (this.pat this x, map_opt (this.expr this) g)
        );
    }

  let rec extension_of_error {loc; msg; if_highlight; sub} =
    { loc; txt = "ocaml.error" },
    PStr ([Str.eval (Exp.constant (Pconst_string (msg, None)));
           Str.eval (Exp.constant (Pconst_string (if_highlight, None)))] @
          (List.map (fun ext -> Str.extension (extension_of_error ext)) sub))

  let attribute_of_warning loc s =
    { loc; txt = "ocaml.ppwarning" },
    PStr ([Str.eval ~loc (Exp.constant (Pconst_string (s, None)))])

end

module Outcometree = struct
  (* Module [Outcometree]: results displayed by the toplevel *)

  (* These types represent messages that the toplevel displays as normal
     results or errors. The real displaying is customisable using the hooks:
        [Toploop.print_out_value]
        [Toploop.print_out_type]
        [Toploop.print_out_sig_item]
        [Toploop.print_out_phrase] *)

  type out_ident (*IF_CURRENT = Outcometree.out_ident *) =
    | Oide_apply of out_ident * out_ident
    | Oide_dot of out_ident * string
    | Oide_ident of string

  type out_attribute (*IF_CURRENT = Outcometree.out_attribute *) =
    { oattr_name: string }

  type out_value (*IF_CURRENT = Outcometree.out_value *) =
    | Oval_array of out_value list
    | Oval_char of char
    | Oval_constr of out_ident * out_value list
    | Oval_ellipsis
    | Oval_float of float
    | Oval_int of int
    | Oval_int32 of int32
    | Oval_int64 of int64
    | Oval_nativeint of nativeint
    | Oval_list of out_value list
    | Oval_printer of (Format.formatter -> unit)
    | Oval_record of (out_ident * out_value) list
    | Oval_string of string
    | Oval_stuff of string
    | Oval_tuple of out_value list
    | Oval_variant of string * out_value option

  type out_type (*IF_CURRENT = Outcometree.out_type *) =
    | Otyp_abstract
    | Otyp_open
    | Otyp_alias of out_type * string
    | Otyp_arrow of string * out_type * out_type
    | Otyp_class of bool * out_ident * out_type list
    | Otyp_constr of out_ident * out_type list
    | Otyp_manifest of out_type * out_type
    | Otyp_object of (string * out_type) list * bool option
    | Otyp_record of (string * bool * out_type) list
    | Otyp_stuff of string
    | Otyp_sum of (string * out_type list * out_type option) list
    | Otyp_tuple of out_type list
    | Otyp_var of bool * string
    | Otyp_variant of
        bool * out_variant * bool * (string list) option
    | Otyp_poly of string list * out_type
    | Otyp_module of string * string list * out_type list
    | Otyp_attribute of out_type * out_attribute

  and out_variant (*IF_CURRENT = Outcometree.out_variant *) =
    | Ovar_fields of (string * bool * out_type list) list
    | Ovar_typ of out_type

  type out_class_type (*IF_CURRENT = Outcometree.out_class_type *) =
    | Octy_constr of out_ident * out_type list
    | Octy_arrow of string * out_type * out_class_type
    | Octy_signature of out_type option * out_class_sig_item list
  and out_class_sig_item (*IF_CURRENT = Outcometree.out_class_sig_item *) =
    | Ocsg_constraint of out_type * out_type
    | Ocsg_method of string * bool * bool * out_type
    | Ocsg_value of string * bool * bool * out_type

  type out_module_type (*IF_CURRENT = Outcometree.out_module_type *) =
    | Omty_abstract
    | Omty_functor of string * out_module_type option * out_module_type
    | Omty_ident of out_ident
    | Omty_signature of out_sig_item list
    | Omty_alias of out_ident
  and out_sig_item (*IF_CURRENT = Outcometree.out_sig_item *) =
    | Osig_class of
        bool * string * (string * (bool * bool)) list * out_class_type *
          out_rec_status
    | Osig_class_type of
        bool * string * (string * (bool * bool)) list * out_class_type *
          out_rec_status
    | Osig_typext of out_extension_constructor * out_ext_status
    | Osig_modtype of string * out_module_type
    | Osig_module of string * out_module_type * out_rec_status
    | Osig_type of out_type_decl * out_rec_status
    | Osig_value of out_val_decl
    | Osig_ellipsis
  and out_type_decl (*IF_CURRENT = Outcometree.out_type_decl *) =
    { otype_name: string;
      otype_params: (string * (bool * bool)) list;
      otype_type: out_type;
      otype_private: Asttypes.private_flag;
      otype_immediate: bool;
      otype_unboxed: bool;
      otype_cstrs: (out_type * out_type) list }
  and out_extension_constructor (*IF_CURRENT = Outcometree.out_extension_constructor *) =
    { oext_name: string;
      oext_type_name: string;
      oext_type_params: string list;
      oext_args: out_type list;
      oext_ret_type: out_type option;
      oext_private: Asttypes.private_flag }
  and out_type_extension (*IF_CURRENT = Outcometree.out_type_extension *) =
    { otyext_name: string;
      otyext_params: string list;
      otyext_constructors: (string * out_type list * out_type option) list;
      otyext_private: Asttypes.private_flag }
  and out_val_decl (*IF_CURRENT = Outcometree.out_val_decl *) =
    { oval_name: string;
      oval_type: out_type;
      oval_prims: string list;
      oval_attributes: out_attribute list }
  and out_rec_status (*IF_CURRENT = Outcometree.out_rec_status *) =
    | Orec_not
    | Orec_first
    | Orec_next
  and out_ext_status (*IF_CURRENT = Outcometree.out_ext_status *) =
    | Oext_first
    | Oext_next
    | Oext_exception

  type out_phrase (*IF_CURRENT = Outcometree.out_phrase *) =
    | Ophr_eval of out_value * out_type
    | Ophr_signature of (out_sig_item * out_value option) list
    | Ophr_exception of (exn * out_value)

end

module Config = struct
  let ast_impl_magic_number = "Caml1999M020"
  let ast_intf_magic_number = "Caml1999N018"
end

let map_signature mapper = mapper.Ast_mapper.signature mapper
let map_structure mapper = mapper.Ast_mapper.structure mapper

let shallow_identity =
  let id _ x = x in
  {
    Ast_mapper.
    structure               = id;
    structure_item          = id;
    module_expr             = id;
    signature               = id;
    signature_item          = id;
    module_type             = id;
    with_constraint         = id;
    class_declaration       = id;
    class_expr              = id;
    class_field             = id;
    class_structure         = id;
    class_type              = id;
    class_type_field        = id;
    class_signature         = id;
    class_type_declaration  = id;
    class_description       = id;
    type_declaration        = id;
    type_kind               = id;
    typ                     = id;
    type_extension          = id;
    extension_constructor   = id;
    value_description       = id;
    pat                     = id;
    expr                    = id;
    module_declaration      = id;
    module_type_declaration = id;
    module_binding          = id;
    open_description        = id;
    include_description     = id;
    include_declaration     = id;
    value_binding           = id;
    constructor_declaration = id;
    label_declaration       = id;
    cases                   = id;
    case                    = id;
    location                = id;
    extension               = id;
    attribute               = id;
    attributes              = id;
    payload                 = id;
  }

let failing_mapper =
  let fail _ _ =
    invalid_arg "failing_mapper: this mapper function should never get called"
  in
  {
    Ast_mapper.
    structure               = fail;
    structure_item          = fail;
    module_expr             = fail;
    signature               = fail;
    signature_item          = fail;
    module_type             = fail;
    with_constraint         = fail;
    class_declaration       = fail;
    class_expr              = fail;
    class_field             = fail;
    class_structure         = fail;
    class_type              = fail;
    class_type_field        = fail;
    class_signature         = fail;
    class_type_declaration  = fail;
    class_description       = fail;
    type_declaration        = fail;
    type_kind               = fail;
    typ                     = fail;
    type_extension          = fail;
    extension_constructor   = fail;
    value_description       = fail;
    pat                     = fail;
    expr                    = fail;
    module_declaration      = fail;
    module_type_declaration = fail;
    module_binding          = fail;
    open_description        = fail;
    include_description     = fail;
    include_declaration     = fail;
    value_binding           = fail;
    constructor_declaration = fail;
    label_declaration       = fail;
    cases                   = fail;
    case                    = fail;
    location                = fail;
    extension               = fail;
    attribute               = fail;
    attributes              = fail;
    payload                 = fail;
  }

let make_top_mapper ~signature ~structure =
  {failing_mapper with Ast_mapper.
                    signature = (fun _ x -> signature x);
                    structure = (fun _ x -> structure x) }

end
module Ast_406
= struct
#1 "ast_406.ml"
# 1 "src/ast_406.ml"
(**************************************************************************)
(*                                                                        *)
(*                         OCaml Migrate Parsetree                        *)
(*                                                                        *)
(*                             Frédéric Bour                              *)
(*            Jérémie Dimino and Leo White, Jane Street Europe            *)
(*            Xavier Leroy, projet Cristal, INRIA Rocquencourt            *)
(*                         Alain Frisch, LexiFi                           *)
(*       Daniel de Rauglaudre, projet Cristal, INRIA Rocquencourt         *)
(*                                                                        *)
(*   Copyright 2017 Institut National de Recherche en Informatique et     *)
(*     en Automatique (INRIA).                                            *)
(*                                                                        *)
(*   All rights reserved.  This file is distributed under the terms of    *)
(*   the GNU Lesser General Public License version 2.1, with the          *)
(*   special exception on linking described in the file LICENSE.          *)
(*                                                                        *)
(**************************************************************************)

(* Ast ported on Mon Oct  2 11:25:57 CEST 2017
   OCaml trunk was:
     commit 65940a2c6be43c42f75c6c6b255974f7e6de03ca (HEAD -> 4.06, origin/4.06)
     Author: Christophe Raffalli <christophe@raffalli.eu>
     Date:   Sun Oct 1 18:27:07 2017 +0200

         fixed position of last optional last semicolumn in sequence (#1387)
*)

module Location = Location
module Longident = Longident

module Asttypes = struct
  (** Auxiliary AST types used by parsetree and typedtree. *)

  type constant              = Asttypes.constant    =
      Const_int of int
    | Const_char of char
    | Const_string of string * string option
    | Const_float of string
    | Const_int32 of int32
    | Const_int64 of int64
    | Const_nativeint of nativeint

  type rec_flag              = Asttypes.rec_flag    = Nonrecursive | Recursive

  type direction_flag              = Asttypes.direction_flag    = Upto | Downto

  (* Order matters, used in polymorphic comparison *)
  type private_flag              = Asttypes.private_flag    = Private | Public

  type mutable_flag              = Asttypes.mutable_flag    = Immutable | Mutable

  type virtual_flag              = Asttypes.virtual_flag    = Virtual | Concrete

  type override_flag              = Asttypes.override_flag    = Override | Fresh

  type closed_flag              = Asttypes.closed_flag    = Closed | Open

  type label = string

  type arg_label              = Asttypes.arg_label    =
      Nolabel
    | Labelled of string (*  label:T -> ... *)
    | Optional of string (* ?label:T -> ... *)

  type 'a loc = 'a Location.loc = {
    txt : 'a;
    loc : Location.t;
  }


  type variance              = Asttypes.variance    =
    | Covariant
    | Contravariant
    | Invariant
end

module Parsetree = struct
  (** Abstract syntax tree produced by parsing *)

  open Asttypes

  type constant              = Parsetree.constant    =
      Pconst_integer of string * char option
    (* 3 3l 3L 3n

       Suffixes [g-z][G-Z] are accepted by the parser.
       Suffixes except 'l', 'L' and 'n' are rejected by the typechecker
    *)
    | Pconst_char of char
    (* 'c' *)
    | Pconst_string of string * string option
    (* "constant"
       {delim|other constant|delim}
    *)
    | Pconst_float of string * char option
    (* 3.4 2e5 1.4e-4

       Suffixes [g-z][G-Z] are accepted by the parser.
       Suffixes are rejected by the typechecker.
    *)

  (** {2 Extension points} *)

  type attribute = string loc * payload
         (* [@id ARG]
            [@@id ARG]

            Metadata containers passed around within the AST.
            The compiler ignores unknown attributes.
         *)

  and extension = string loc * payload
        (* [%id ARG]
           [%%id ARG]

           Sub-language placeholder -- rejected by the typechecker.
        *)

  and attributes = attribute list

  and payload              = Parsetree.payload    =
    | PStr of structure
    | PSig of signature (* : SIG *)
    | PTyp of core_type  (* : T *)
    | PPat of pattern * expression option  (* ? P  or  ? P when E *)

  (** {2 Core language} *)

  (* Type expressions *)

  and core_type              = Parsetree.core_type    =
      {
       ptyp_desc: core_type_desc;
       ptyp_loc: Location.t;
       ptyp_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and core_type_desc              = Parsetree.core_type_desc    =
    | Ptyp_any
          (*  _ *)
    | Ptyp_var of string
          (* 'a *)
    | Ptyp_arrow of arg_label * core_type * core_type
          (* T1 -> T2       Simple
             ~l:T1 -> T2    Labelled
             ?l:T1 -> T2    Optional
           *)
    | Ptyp_tuple of core_type list
          (* T1 * ... * Tn

             Invariant: n >= 2
          *)
    | Ptyp_constr of Longident.t loc * core_type list
          (* tconstr
             T tconstr
             (T1, ..., Tn) tconstr
           *)
    | Ptyp_object of object_field list * closed_flag
          (* < l1:T1; ...; ln:Tn >     (flag = Closed)
             < l1:T1; ...; ln:Tn; .. > (flag = Open)
           *)
    | Ptyp_class of Longident.t loc * core_type list
          (* #tconstr
             T #tconstr
             (T1, ..., Tn) #tconstr
           *)
    | Ptyp_alias of core_type * string
          (* T as 'a *)
    | Ptyp_variant of row_field list * closed_flag * label list option
          (* [ `A|`B ]         (flag = Closed; labels = None)
             [> `A|`B ]        (flag = Open;   labels = None)
             [< `A|`B ]        (flag = Closed; labels = Some [])
             [< `A|`B > `X `Y ](flag = Closed; labels = Some ["X";"Y"])
           *)
    | Ptyp_poly of string loc list * core_type
          (* 'a1 ... 'an. T

             Can only appear in the following context:

             - As the core_type of a Ppat_constraint node corresponding
               to a constraint on a let-binding: let x : 'a1 ... 'an. T
               = e ...

             - Under Cfk_virtual for methods (not values).

             - As the core_type of a Pctf_method node.

             - As the core_type of a Pexp_poly node.

             - As the pld_type field of a label_declaration.

             - As a core_type of a Ptyp_object node.
           *)

    | Ptyp_package of package_type
          (* (module S) *)
    | Ptyp_extension of extension
          (* [%id] *)

  and package_type = Longident.t loc * (Longident.t loc * core_type) list
        (*
          (module S)
          (module S with type t1 = T1 and ... and tn = Tn)
         *)

  and row_field              = Parsetree.row_field    =
    | Rtag of label loc * attributes * bool * core_type list
          (* [`A]                   ( true,  [] )
             [`A of T]              ( false, [T] )
             [`A of T1 & .. & Tn]   ( false, [T1;...Tn] )
             [`A of & T1 & .. & Tn] ( true,  [T1;...Tn] )

            - The 2nd field is true if the tag contains a
              constant (empty) constructor.
            - '&' occurs when several types are used for the same constructor
              (see 4.2 in the manual)

            - TODO: switch to a record representation, and keep location
          *)
    | Rinherit of core_type
          (* [ T ] *)

  and object_field              = Parsetree.object_field    =
    | Otag of label loc * attributes * core_type
    | Oinherit of core_type

  (* Patterns *)

  and pattern              = Parsetree.pattern    =
      {
       ppat_desc: pattern_desc;
       ppat_loc: Location.t;
       ppat_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and pattern_desc              = Parsetree.pattern_desc    =
    | Ppat_any
          (* _ *)
    | Ppat_var of string loc
          (* x *)
    | Ppat_alias of pattern * string loc
          (* P as 'a *)
    | Ppat_constant of constant
          (* 1, 'a', "true", 1.0, 1l, 1L, 1n *)
    | Ppat_interval of constant * constant
          (* 'a'..'z'

             Other forms of interval are recognized by the parser
             but rejected by the type-checker. *)
    | Ppat_tuple of pattern list
          (* (P1, ..., Pn)

             Invariant: n >= 2
          *)
    | Ppat_construct of Longident.t loc * pattern option
          (* C                None
             C P              Some P
             C (P1, ..., Pn)  Some (Ppat_tuple [P1; ...; Pn])
           *)
    | Ppat_variant of label * pattern option
          (* `A             (None)
             `A P           (Some P)
           *)
    | Ppat_record of (Longident.t loc * pattern) list * closed_flag
          (* { l1=P1; ...; ln=Pn }     (flag = Closed)
             { l1=P1; ...; ln=Pn; _}   (flag = Open)

             Invariant: n > 0
           *)
    | Ppat_array of pattern list
          (* [| P1; ...; Pn |] *)
    | Ppat_or of pattern * pattern
          (* P1 | P2 *)
    | Ppat_constraint of pattern * core_type
          (* (P : T) *)
    | Ppat_type of Longident.t loc
          (* #tconst *)
    | Ppat_lazy of pattern
          (* lazy P *)
    | Ppat_unpack of string loc
          (* (module P)
             Note: (module P : S) is represented as
             Ppat_constraint(Ppat_unpack, Ptyp_package)
           *)
    | Ppat_exception of pattern
          (* exception P *)
    | Ppat_extension of extension
          (* [%id] *)
    | Ppat_open of Longident.t loc * pattern
          (* M.(P) *)

  (* Value expressions *)

  and expression              = Parsetree.expression    =
      {
       pexp_desc: expression_desc;
       pexp_loc: Location.t;
       pexp_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and expression_desc              = Parsetree.expression_desc    =
    | Pexp_ident of Longident.t loc
          (* x
             M.x
           *)
    | Pexp_constant of constant
          (* 1, 'a', "true", 1.0, 1l, 1L, 1n *)
    | Pexp_let of rec_flag * value_binding list * expression
          (* let P1 = E1 and ... and Pn = EN in E       (flag = Nonrecursive)
             let rec P1 = E1 and ... and Pn = EN in E   (flag = Recursive)
           *)
    | Pexp_function of case list
          (* function P1 -> E1 | ... | Pn -> En *)
    | Pexp_fun of arg_label * expression option * pattern * expression
          (* fun P -> E1                          (Simple, None)
             fun ~l:P -> E1                       (Labelled l, None)
             fun ?l:P -> E1                       (Optional l, None)
             fun ?l:(P = E0) -> E1                (Optional l, Some E0)

             Notes:
             - If E0 is provided, only Optional is allowed.
             - "fun P1 P2 .. Pn -> E1" is represented as nested Pexp_fun.
             - "let f P = E" is represented using Pexp_fun.
           *)
    | Pexp_apply of expression * (arg_label * expression) list
          (* E0 ~l1:E1 ... ~ln:En
             li can be empty (non labeled argument) or start with '?'
             (optional argument).

             Invariant: n > 0
           *)
    | Pexp_match of expression * case list
          (* match E0 with P1 -> E1 | ... | Pn -> En *)
    | Pexp_try of expression * case list
          (* try E0 with P1 -> E1 | ... | Pn -> En *)
    | Pexp_tuple of expression list
          (* (E1, ..., En)

             Invariant: n >= 2
          *)
    | Pexp_construct of Longident.t loc * expression option
          (* C                None
             C E              Some E
             C (E1, ..., En)  Some (Pexp_tuple[E1;...;En])
          *)
    | Pexp_variant of label * expression option
          (* `A             (None)
             `A E           (Some E)
           *)
    | Pexp_record of (Longident.t loc * expression) list * expression option
          (* { l1=P1; ...; ln=Pn }     (None)
             { E0 with l1=P1; ...; ln=Pn }   (Some E0)

             Invariant: n > 0
           *)
    | Pexp_field of expression * Longident.t loc
          (* E.l *)
    | Pexp_setfield of expression * Longident.t loc * expression
          (* E1.l <- E2 *)
    | Pexp_array of expression list
          (* [| E1; ...; En |] *)
    | Pexp_ifthenelse of expression * expression * expression option
          (* if E1 then E2 else E3 *)
    | Pexp_sequence of expression * expression
          (* E1; E2 *)
    | Pexp_while of expression * expression
          (* while E1 do E2 done *)
    | Pexp_for of
        pattern *  expression * expression * direction_flag * expression
          (* for i = E1 to E2 do E3 done      (flag = Upto)
             for i = E1 downto E2 do E3 done  (flag = Downto)
           *)
    | Pexp_constraint of expression * core_type
          (* (E : T) *)
    | Pexp_coerce of expression * core_type option * core_type
          (* (E :> T)        (None, T)
             (E : T0 :> T)   (Some T0, T)
           *)
    | Pexp_send of expression * label loc
          (*  E # m *)
    | Pexp_new of Longident.t loc
          (* new M.c *)
    | Pexp_setinstvar of label loc * expression
          (* x <- 2 *)
    | Pexp_override of (label loc * expression) list
          (* {< x1 = E1; ...; Xn = En >} *)
    | Pexp_letmodule of string loc * module_expr * expression
          (* let module M = ME in E *)
    | Pexp_letexception of extension_constructor * expression
          (* let exception C in E *)
    | Pexp_assert of expression
          (* assert E
             Note: "assert false" is treated in a special way by the
             type-checker. *)
    | Pexp_lazy of expression
          (* lazy E *)
    | Pexp_poly of expression * core_type option
          (* Used for method bodies.

             Can only be used as the expression under Cfk_concrete
             for methods (not values). *)
    | Pexp_object of class_structure
          (* object ... end *)
    | Pexp_newtype of string loc * expression
          (* fun (type t) -> E *)
    | Pexp_pack of module_expr
          (* (module ME)

             (module ME : S) is represented as
             Pexp_constraint(Pexp_pack, Ptyp_package S) *)
    | Pexp_open of override_flag * Longident.t loc * expression
          (* M.(E)
             let open M in E
             let! open M in E *)
    | Pexp_extension of extension
          (* [%id] *)
    | Pexp_unreachable
          (* . *)

  and case              = Parsetree.case    =   (* (P -> E) or (P when E0 -> E) *)
      {
       pc_lhs: pattern;
       pc_guard: expression option;
       pc_rhs: expression;
      }

  (* Value descriptions *)

  and value_description              = Parsetree.value_description    =
      {
       pval_name: string loc;
       pval_type: core_type;
       pval_prim: string list;
       pval_attributes: attributes;  (* ... [@@id1] [@@id2] *)
       pval_loc: Location.t;
      }

  (*
    val x: T                            (prim = [])
    external x: T = "s1" ... "sn"       (prim = ["s1";..."sn"])
  *)

  (* Type declarations *)

  and type_declaration              = Parsetree.type_declaration    =
      {
       ptype_name: string loc;
       ptype_params: (core_type * variance) list;
             (* ('a1,...'an) t; None represents  _*)
       ptype_cstrs: (core_type * core_type * Location.t) list;
             (* ... constraint T1=T1'  ... constraint Tn=Tn' *)
       ptype_kind: type_kind;
       ptype_private: private_flag;   (* = private ... *)
       ptype_manifest: core_type option;  (* = T *)
       ptype_attributes: attributes;   (* ... [@@id1] [@@id2] *)
       ptype_loc: Location.t;
      }

  (*
    type t                     (abstract, no manifest)
    type t = T0                (abstract, manifest=T0)
    type t = C of T | ...      (variant,  no manifest)
    type t = T0 = C of T | ... (variant,  manifest=T0)
    type t = {l: T; ...}       (record,   no manifest)
    type t = T0 = {l : T; ...} (record,   manifest=T0)
    type t = ..                (open,     no manifest)
  *)

  and type_kind              = Parsetree.type_kind    =
    | Ptype_abstract
    | Ptype_variant of constructor_declaration list
          (* Invariant: non-empty list *)
    | Ptype_record of label_declaration list
          (* Invariant: non-empty list *)
    | Ptype_open

  and label_declaration              = Parsetree.label_declaration    =
      {
       pld_name: string loc;
       pld_mutable: mutable_flag;
       pld_type: core_type;
       pld_loc: Location.t;
       pld_attributes: attributes; (* l : T [@id1] [@id2] *)
      }

  (*  { ...; l: T; ... }            (mutable=Immutable)
      { ...; mutable l: T; ... }    (mutable=Mutable)

      Note: T can be a Ptyp_poly.
  *)

  and constructor_declaration              = Parsetree.constructor_declaration    =
      {
       pcd_name: string loc;
       pcd_args: constructor_arguments;
       pcd_res: core_type option;
       pcd_loc: Location.t;
       pcd_attributes: attributes; (* C of ... [@id1] [@id2] *)
      }

  and constructor_arguments              = Parsetree.constructor_arguments    =
    | Pcstr_tuple of core_type list
    | Pcstr_record of label_declaration list

  (*
    | C of T1 * ... * Tn     (res = None,    args = Pcstr_tuple [])
    | C: T0                  (res = Some T0, args = [])
    | C: T1 * ... * Tn -> T0 (res = Some T0, args = Pcstr_tuple)
    | C of {...}             (res = None,    args = Pcstr_record)
    | C: {...} -> T0         (res = Some T0, args = Pcstr_record)
    | C of {...} as t        (res = None,    args = Pcstr_record)
  *)

  and type_extension              = Parsetree.type_extension    =
      {
       ptyext_path: Longident.t loc;
       ptyext_params: (core_type * variance) list;
       ptyext_constructors: extension_constructor list;
       ptyext_private: private_flag;
       ptyext_attributes: attributes;   (* ... [@@id1] [@@id2] *)
      }
  (*
    type t += ...
  *)

  and extension_constructor              = Parsetree.extension_constructor    =
      {
       pext_name: string loc;
       pext_kind : extension_constructor_kind;
       pext_loc : Location.t;
       pext_attributes: attributes; (* C of ... [@id1] [@id2] *)
      }

  and extension_constructor_kind              = Parsetree.extension_constructor_kind    =
      Pext_decl of constructor_arguments * core_type option
        (*
           | C of T1 * ... * Tn     ([T1; ...; Tn], None)
           | C: T0                  ([], Some T0)
           | C: T1 * ... * Tn -> T0 ([T1; ...; Tn], Some T0)
         *)
    | Pext_rebind of Longident.t loc
        (*
           | C = D
         *)

  (** {2 Class language} *)

  (* Type expressions for the class language *)

  and class_type              = Parsetree.class_type    =
      {
       pcty_desc: class_type_desc;
       pcty_loc: Location.t;
       pcty_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and class_type_desc              = Parsetree.class_type_desc    =
    | Pcty_constr of Longident.t loc * core_type list
          (* c
             ['a1, ..., 'an] c *)
    | Pcty_signature of class_signature
          (* object ... end *)
    | Pcty_arrow of arg_label * core_type * class_type
          (* T -> CT       Simple
             ~l:T -> CT    Labelled l
             ?l:T -> CT    Optional l
           *)
    | Pcty_extension of extension
          (* [%id] *)
    | Pcty_open of override_flag * Longident.t loc * class_type
          (* let open M in CT *)


  and class_signature              = Parsetree.class_signature    =
      {
       pcsig_self: core_type;
       pcsig_fields: class_type_field list;
      }
  (* object('selfpat) ... end
     object ... end             (self = Ptyp_any)
   *)

  and class_type_field              = Parsetree.class_type_field    =
      {
       pctf_desc: class_type_field_desc;
       pctf_loc: Location.t;
       pctf_attributes: attributes; (* ... [@@id1] [@@id2] *)
      }

  and class_type_field_desc              = Parsetree.class_type_field_desc    =
    | Pctf_inherit of class_type
          (* inherit CT *)
    | Pctf_val of (label loc * mutable_flag * virtual_flag * core_type)
          (* val x: T *)
    | Pctf_method  of (label loc * private_flag * virtual_flag * core_type)
          (* method x: T

             Note: T can be a Ptyp_poly.
           *)
    | Pctf_constraint  of (core_type * core_type)
          (* constraint T1 = T2 *)
    | Pctf_attribute of attribute
          (* [@@@id] *)
    | Pctf_extension of extension
          (* [%%id] *)

  and 'a class_infos              = 'a Parsetree.class_infos    =
      {
       pci_virt: virtual_flag;
       pci_params: (core_type * variance) list;
       pci_name: string loc;
       pci_expr: 'a;
       pci_loc: Location.t;
       pci_attributes: attributes;  (* ... [@@id1] [@@id2] *)
      }
  (* class c = ...
     class ['a1,...,'an] c = ...
     class virtual c = ...

     Also used for "class type" declaration.
  *)

  and class_description = class_type class_infos

  and class_type_declaration = class_type class_infos

  (* Value expressions for the class language *)

  and class_expr              = Parsetree.class_expr    =
      {
       pcl_desc: class_expr_desc;
       pcl_loc: Location.t;
       pcl_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and class_expr_desc              = Parsetree.class_expr_desc    =
    | Pcl_constr of Longident.t loc * core_type list
          (* c
             ['a1, ..., 'an] c *)
    | Pcl_structure of class_structure
          (* object ... end *)
    | Pcl_fun of arg_label * expression option * pattern * class_expr
          (* fun P -> CE                          (Simple, None)
             fun ~l:P -> CE                       (Labelled l, None)
             fun ?l:P -> CE                       (Optional l, None)
             fun ?l:(P = E0) -> CE                (Optional l, Some E0)
           *)
    | Pcl_apply of class_expr * (arg_label * expression) list
          (* CE ~l1:E1 ... ~ln:En
             li can be empty (non labeled argument) or start with '?'
             (optional argument).

             Invariant: n > 0
           *)
    | Pcl_let of rec_flag * value_binding list * class_expr
          (* let P1 = E1 and ... and Pn = EN in CE      (flag = Nonrecursive)
             let rec P1 = E1 and ... and Pn = EN in CE  (flag = Recursive)
           *)
    | Pcl_constraint of class_expr * class_type
          (* (CE : CT) *)
    | Pcl_extension of extension
    (* [%id] *)
    | Pcl_open of override_flag * Longident.t loc * class_expr
    (* let open M in CE *)


  and class_structure              = Parsetree.class_structure    =
      {
       pcstr_self: pattern;
       pcstr_fields: class_field list;
      }
  (* object(selfpat) ... end
     object ... end           (self = Ppat_any)
   *)

  and class_field              = Parsetree.class_field    =
      {
       pcf_desc: class_field_desc;
       pcf_loc: Location.t;
       pcf_attributes: attributes; (* ... [@@id1] [@@id2] *)
      }

  and class_field_desc              = Parsetree.class_field_desc    =
    | Pcf_inherit of override_flag * class_expr * string loc option
          (* inherit CE
             inherit CE as x
             inherit! CE
             inherit! CE as x
           *)
    | Pcf_val of (label loc * mutable_flag * class_field_kind)
          (* val x = E
             val virtual x: T
           *)
    | Pcf_method of (label loc * private_flag * class_field_kind)
          (* method x = E            (E can be a Pexp_poly)
             method virtual x: T     (T can be a Ptyp_poly)
           *)
    | Pcf_constraint of (core_type * core_type)
          (* constraint T1 = T2 *)
    | Pcf_initializer of expression
          (* initializer E *)
    | Pcf_attribute of attribute
          (* [@@@id] *)
    | Pcf_extension of extension
          (* [%%id] *)

  and class_field_kind              = Parsetree.class_field_kind    =
    | Cfk_virtual of core_type
    | Cfk_concrete of override_flag * expression

  and class_declaration = class_expr class_infos

  (** {2 Module language} *)

  (* Type expressions for the module language *)

  and module_type              = Parsetree.module_type    =
      {
       pmty_desc: module_type_desc;
       pmty_loc: Location.t;
       pmty_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and module_type_desc              = Parsetree.module_type_desc    =
    | Pmty_ident of Longident.t loc
          (* S *)
    | Pmty_signature of signature
          (* sig ... end *)
    | Pmty_functor of string loc * module_type option * module_type
          (* functor(X : MT1) -> MT2 *)
    | Pmty_with of module_type * with_constraint list
          (* MT with ... *)
    | Pmty_typeof of module_expr
          (* module type of ME *)
    | Pmty_extension of extension
          (* [%id] *)
    | Pmty_alias of Longident.t loc
          (* (module M) *)

  and signature = signature_item list

  and signature_item              = Parsetree.signature_item    =
      {
       psig_desc: signature_item_desc;
       psig_loc: Location.t;
      }

  and signature_item_desc              = Parsetree.signature_item_desc    =
    | Psig_value of value_description
          (*
            val x: T
            external x: T = "s1" ... "sn"
           *)
    | Psig_type of rec_flag * type_declaration list
          (* type t1 = ... and ... and tn = ... *)
    | Psig_typext of type_extension
          (* type t1 += ... *)
    | Psig_exception of extension_constructor
          (* exception C of T *)
    | Psig_module of module_declaration
          (* module X : MT *)
    | Psig_recmodule of module_declaration list
          (* module rec X1 : MT1 and ... and Xn : MTn *)
    | Psig_modtype of module_type_declaration
          (* module type S = MT
             module type S *)
    | Psig_open of open_description
          (* open X *)
    | Psig_include of include_description
          (* include MT *)
    | Psig_class of class_description list
          (* class c1 : ... and ... and cn : ... *)
    | Psig_class_type of class_type_declaration list
          (* class type ct1 = ... and ... and ctn = ... *)
    | Psig_attribute of attribute
          (* [@@@id] *)
    | Psig_extension of extension * attributes
          (* [%%id] *)

  and module_declaration              = Parsetree.module_declaration    =
      {
       pmd_name: string loc;
       pmd_type: module_type;
       pmd_attributes: attributes; (* ... [@@id1] [@@id2] *)
       pmd_loc: Location.t;
      }
  (* S : MT *)

  and module_type_declaration              = Parsetree.module_type_declaration    =
      {
       pmtd_name: string loc;
       pmtd_type: module_type option;
       pmtd_attributes: attributes; (* ... [@@id1] [@@id2] *)
       pmtd_loc: Location.t;
      }
  (* S = MT
     S       (abstract module type declaration, pmtd_type = None)
  *)

  and open_description              = Parsetree.open_description    =
      {
       popen_lid: Longident.t loc;
       popen_override: override_flag;
       popen_loc: Location.t;
       popen_attributes: attributes;
      }
  (* open! X - popen_override = Override (silences the 'used identifier
                                shadowing' warning)
     open  X - popen_override = Fresh
   *)

  and 'a include_infos              = 'a Parsetree.include_infos    =
      {
       pincl_mod: 'a;
       pincl_loc: Location.t;
       pincl_attributes: attributes;
      }

  and include_description = module_type include_infos
  (* include MT *)

  and include_declaration = module_expr include_infos
  (* include ME *)

  and with_constraint              = Parsetree.with_constraint    =
    | Pwith_type of Longident.t loc * type_declaration
          (* with type X.t = ...

             Note: the last component of the longident must match
             the name of the type_declaration. *)
    | Pwith_module of Longident.t loc * Longident.t loc
          (* with module X.Y = Z *)
    | Pwith_typesubst of Longident.t loc * type_declaration
          (* with type X.t := ..., same format as [Pwith_type] *)
    | Pwith_modsubst of Longident.t loc * Longident.t loc
          (* with module X.Y := Z *)

  (* Value expressions for the module language *)

  and module_expr              = Parsetree.module_expr    =
      {
       pmod_desc: module_expr_desc;
       pmod_loc: Location.t;
       pmod_attributes: attributes; (* ... [@id1] [@id2] *)
      }

  and module_expr_desc              = Parsetree.module_expr_desc    =
    | Pmod_ident of Longident.t loc
          (* X *)
    | Pmod_structure of structure
          (* struct ... end *)
    | Pmod_functor of string loc * module_type option * module_expr
          (* functor(X : MT1) -> ME *)
    | Pmod_apply of module_expr * module_expr
          (* ME1(ME2) *)
    | Pmod_constraint of module_expr * module_type
          (* (ME : MT) *)
    | Pmod_unpack of expression
          (* (val E) *)
    | Pmod_extension of extension
          (* [%id] *)

  and structure = structure_item list

  and structure_item              = Parsetree.structure_item    =
      {
       pstr_desc: structure_item_desc;
       pstr_loc: Location.t;
      }

  and structure_item_desc              = Parsetree.structure_item_desc    =
    | Pstr_eval of expression * attributes
          (* E *)
    | Pstr_value of rec_flag * value_binding list
          (* let P1 = E1 and ... and Pn = EN       (flag = Nonrecursive)
             let rec P1 = E1 and ... and Pn = EN   (flag = Recursive)
           *)
    | Pstr_primitive of value_description
          (*  val x: T
              external x: T = "s1" ... "sn" *)
    | Pstr_type of rec_flag * type_declaration list
          (* type t1 = ... and ... and tn = ... *)
    | Pstr_typext of type_extension
          (* type t1 += ... *)
    | Pstr_exception of extension_constructor
          (* exception C of T
             exception C = M.X *)
    | Pstr_module of module_binding
          (* module X = ME *)
    | Pstr_recmodule of module_binding list
          (* module rec X1 = ME1 and ... and Xn = MEn *)
    | Pstr_modtype of module_type_declaration
          (* module type S = MT *)
    | Pstr_open of open_description
          (* open X *)
    | Pstr_class of class_declaration list
          (* class c1 = ... and ... and cn = ... *)
    | Pstr_class_type of class_type_declaration list
          (* class type ct1 = ... and ... and ctn = ... *)
    | Pstr_include of include_declaration
          (* include ME *)
    | Pstr_attribute of attribute
          (* [@@@id] *)
    | Pstr_extension of extension * attributes
          (* [%%id] *)

  and value_binding              = Parsetree.value_binding    =
    {
      pvb_pat: pattern;
      pvb_expr: expression;
      pvb_attributes: attributes;
      pvb_loc: Location.t;
    }

  and module_binding              = Parsetree.module_binding    =
      {
       pmb_name: string loc;
       pmb_expr: module_expr;
       pmb_attributes: attributes;
       pmb_loc: Location.t;
      }
  (* X = ME *)

  (** {2 Toplevel} *)

  (* Toplevel phrases *)

  type toplevel_phrase              = Parsetree.toplevel_phrase    =
    | Ptop_def of structure
    | Ptop_dir of string * directive_argument
       (* #use, #load ... *)

  and directive_argument              = Parsetree.directive_argument    =
    | Pdir_none
    | Pdir_string of string
    | Pdir_int of string * char option
    | Pdir_ident of Longident.t
    | Pdir_bool of bool

end

module Docstrings : sig
  (** {3 Docstrings} *)

  (** Documentation comments *)
  type docstring

  (** Create a docstring *)
  val docstring : string -> Location.t -> docstring

  (** Get the text of a docstring *)
  val docstring_body : docstring -> string

  (** Get the location of a docstring *)
  val docstring_loc : docstring -> Location.t

  (** {3 Items}

      The {!docs} type represents documentation attached to an item. *)

  type docs =
    { docs_pre: docstring option;
      docs_post: docstring option; }

  val empty_docs : docs

  val docs_attr : docstring -> Parsetree.attribute

  (** Convert item documentation to attributes and add them to an
      attribute list *)
  val add_docs_attrs : docs -> Parsetree.attributes -> Parsetree.attributes

  (** {3 Fields and constructors}

      The {!info} type represents documentation attached to a field or
      constructor. *)

  type info = docstring option

  val empty_info : info

  val info_attr : docstring -> Parsetree.attribute

  (** Convert field info to attributes and add them to an
      attribute list *)
  val add_info_attrs : info -> Parsetree.attributes -> Parsetree.attributes

  (** {3 Unattached comments}

      The {!text} type represents documentation which is not attached to
      anything. *)

  type text = docstring list

  val empty_text : text

  val text_attr : docstring -> Parsetree.attribute

  (** Convert text to attributes and add them to an attribute list *)
  val add_text_attrs : text -> Parsetree.attributes -> Parsetree.attributes

end = struct
  open Location

  (* Docstrings *)

  type docstring =
    { ds_body: string;
      ds_loc: Location.t;
    }

  (* Docstring constructors and destructors *)

  let docstring body loc =
    let ds =
      { ds_body = body;
        ds_loc = loc;
      }
    in
    ds

  let docstring_body ds = ds.ds_body

  let docstring_loc ds = ds.ds_loc

  (* Docstrings attached to items *)

  type docs =
    { docs_pre: docstring option;
      docs_post: docstring option; }

  let empty_docs = { docs_pre = None; docs_post = None }

  let doc_loc = {txt = "ocaml.doc"; loc = Location.none}

  let docs_attr ds =
    let open Parsetree in
    let exp =
      { pexp_desc = Pexp_constant (Pconst_string(ds.ds_body, None));
        pexp_loc = ds.ds_loc;
        pexp_attributes = []; }
    in
    let item =
      { pstr_desc = Pstr_eval (exp, []); pstr_loc = exp.pexp_loc }
    in
      (doc_loc, PStr [item])

  let add_docs_attrs docs attrs =
    let attrs =
      match docs.docs_pre with
      | None | Some { ds_body=""; _ } -> attrs
      | Some ds -> docs_attr ds :: attrs
    in
    let attrs =
      match docs.docs_post with
      | None | Some { ds_body=""; _ } -> attrs
      | Some ds -> attrs @ [docs_attr ds]
    in
    attrs

  (* Docstrings attached to constructors or fields *)

  type info = docstring option

  let empty_info = None

  let info_attr = docs_attr

  let add_info_attrs info attrs =
    match info with
    | None | Some {ds_body=""; _} -> attrs
    | Some ds -> attrs @ [info_attr ds]

  (* Docstrings not attached to a specific item *)

  type text = docstring list

  let empty_text = []

  let text_loc = {txt = "ocaml.text"; loc = Location.none}

  let text_attr ds =
    let open Parsetree in
    let exp =
      { pexp_desc = Pexp_constant (Pconst_string(ds.ds_body, None));
        pexp_loc = ds.ds_loc;
        pexp_attributes = []; }
    in
    let item =
      { pstr_desc = Pstr_eval (exp, []); pstr_loc = exp.pexp_loc }
    in
      (text_loc, PStr [item])

  let add_text_attrs dsl attrs =
    let fdsl = List.filter (function {ds_body=""; _} -> false| _ ->true) dsl in
    (List.map text_attr fdsl) @ attrs

end

module Ast_helper : sig

  (** Helpers to produce Parsetree fragments *)

  open Asttypes
  open Docstrings
  open Parsetree

  type lid = Longident.t loc
  type str = string loc
  type loc = Location.t
  type attrs = attribute list

  (** {2 Default locations} *)

  val default_loc: loc ref
      (** Default value for all optional location arguments. *)

  val with_default_loc: loc -> (unit -> 'a) -> 'a
      (** Set the [default_loc] within the scope of the execution
          of the provided function. *)

  (** {2 Constants} *)

  module Const : sig
    val char : char -> constant
    val string : ?quotation_delimiter:string -> string -> constant
    val integer : ?suffix:char -> string -> constant
    val int : ?suffix:char -> int -> constant
    val int32 : ?suffix:char -> int32 -> constant
    val int64 : ?suffix:char -> int64 -> constant
    val nativeint : ?suffix:char -> nativeint -> constant
    val float : ?suffix:char -> string -> constant
  end

  (** {2 Core language} *)

  (** Type expressions *)
  module Typ :
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> core_type_desc -> core_type
      val attr: core_type -> attribute -> core_type

      val any: ?loc:loc -> ?attrs:attrs -> unit -> core_type
      val var: ?loc:loc -> ?attrs:attrs -> string -> core_type
      val arrow: ?loc:loc -> ?attrs:attrs -> arg_label -> core_type -> core_type
                 -> core_type
      val tuple: ?loc:loc -> ?attrs:attrs -> core_type list -> core_type
      val constr: ?loc:loc -> ?attrs:attrs -> lid -> core_type list -> core_type
      val object_: ?loc:loc -> ?attrs:attrs -> object_field list
                     -> closed_flag -> core_type
      val class_: ?loc:loc -> ?attrs:attrs -> lid -> core_type list -> core_type
      val alias: ?loc:loc -> ?attrs:attrs -> core_type -> string -> core_type
      val variant: ?loc:loc -> ?attrs:attrs -> row_field list -> closed_flag
                   -> label list option -> core_type
      val poly: ?loc:loc -> ?attrs:attrs -> str list -> core_type -> core_type
      val package: ?loc:loc -> ?attrs:attrs -> lid -> (lid * core_type) list
                   -> core_type
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> core_type

      val force_poly: core_type -> core_type

      val varify_constructors: str list -> core_type -> core_type
      (** [varify_constructors newtypes te] is type expression [te], of which
          any of nullary type constructor [tc] is replaced by type variable of
          the same name, if [tc]'s name appears in [newtypes].
          Raise [Syntaxerr.Variable_in_scope] if any type variable inside [te]
          appears in [newtypes].
          @since 4.05
       *)
    end

  (** Patterns *)
  module Pat:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> pattern_desc -> pattern
      val attr:pattern -> attribute -> pattern

      val any: ?loc:loc -> ?attrs:attrs -> unit -> pattern
      val var: ?loc:loc -> ?attrs:attrs -> str -> pattern
      val alias: ?loc:loc -> ?attrs:attrs -> pattern -> str -> pattern
      val constant: ?loc:loc -> ?attrs:attrs -> constant -> pattern
      val interval: ?loc:loc -> ?attrs:attrs -> constant -> constant -> pattern
      val tuple: ?loc:loc -> ?attrs:attrs -> pattern list -> pattern
      val construct: ?loc:loc -> ?attrs:attrs -> lid -> pattern option -> pattern
      val variant: ?loc:loc -> ?attrs:attrs -> label -> pattern option -> pattern
      val record: ?loc:loc -> ?attrs:attrs -> (lid * pattern) list -> closed_flag
                  -> pattern
      val array: ?loc:loc -> ?attrs:attrs -> pattern list -> pattern
      val or_: ?loc:loc -> ?attrs:attrs -> pattern -> pattern -> pattern
      val constraint_: ?loc:loc -> ?attrs:attrs -> pattern -> core_type -> pattern
      val type_: ?loc:loc -> ?attrs:attrs -> lid -> pattern
      val lazy_: ?loc:loc -> ?attrs:attrs -> pattern -> pattern
      val unpack: ?loc:loc -> ?attrs:attrs -> str -> pattern
      val open_: ?loc:loc -> ?attrs:attrs  -> lid -> pattern -> pattern
      val exception_: ?loc:loc -> ?attrs:attrs -> pattern -> pattern
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> pattern
    end

  (** Expressions *)
  module Exp:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> expression_desc -> expression
      val attr: expression -> attribute -> expression

      val ident: ?loc:loc -> ?attrs:attrs -> lid -> expression
      val constant: ?loc:loc -> ?attrs:attrs -> constant -> expression
      val let_: ?loc:loc -> ?attrs:attrs -> rec_flag -> value_binding list
                -> expression -> expression
      val fun_: ?loc:loc -> ?attrs:attrs -> arg_label -> expression option
                -> pattern -> expression -> expression
      val function_: ?loc:loc -> ?attrs:attrs -> case list -> expression
      val apply: ?loc:loc -> ?attrs:attrs -> expression
                 -> (arg_label * expression) list -> expression
      val match_: ?loc:loc -> ?attrs:attrs -> expression -> case list
                  -> expression
      val try_: ?loc:loc -> ?attrs:attrs -> expression -> case list -> expression
      val tuple: ?loc:loc -> ?attrs:attrs -> expression list -> expression
      val construct: ?loc:loc -> ?attrs:attrs -> lid -> expression option
                     -> expression
      val variant: ?loc:loc -> ?attrs:attrs -> label -> expression option
                   -> expression
      val record: ?loc:loc -> ?attrs:attrs -> (lid * expression) list
                  -> expression option -> expression
      val field: ?loc:loc -> ?attrs:attrs -> expression -> lid -> expression
      val setfield: ?loc:loc -> ?attrs:attrs -> expression -> lid -> expression
                    -> expression
      val array: ?loc:loc -> ?attrs:attrs -> expression list -> expression
      val ifthenelse: ?loc:loc -> ?attrs:attrs -> expression -> expression
                      -> expression option -> expression
      val sequence: ?loc:loc -> ?attrs:attrs -> expression -> expression
                    -> expression
      val while_: ?loc:loc -> ?attrs:attrs -> expression -> expression
                  -> expression
      val for_: ?loc:loc -> ?attrs:attrs -> pattern -> expression -> expression
                -> direction_flag -> expression -> expression
      val coerce: ?loc:loc -> ?attrs:attrs -> expression -> core_type option
                  -> core_type -> expression
      val constraint_: ?loc:loc -> ?attrs:attrs -> expression -> core_type
                       -> expression
      val send: ?loc:loc -> ?attrs:attrs -> expression -> str -> expression
      val new_: ?loc:loc -> ?attrs:attrs -> lid -> expression
      val setinstvar: ?loc:loc -> ?attrs:attrs -> str -> expression -> expression
      val override: ?loc:loc -> ?attrs:attrs -> (str * expression) list
                    -> expression
      val letmodule: ?loc:loc -> ?attrs:attrs -> str -> module_expr -> expression
                     -> expression
      val letexception:
        ?loc:loc -> ?attrs:attrs -> extension_constructor -> expression
        -> expression
      val assert_: ?loc:loc -> ?attrs:attrs -> expression -> expression
      val lazy_: ?loc:loc -> ?attrs:attrs -> expression -> expression
      val poly: ?loc:loc -> ?attrs:attrs -> expression -> core_type option
                -> expression
      val object_: ?loc:loc -> ?attrs:attrs -> class_structure -> expression
      val newtype: ?loc:loc -> ?attrs:attrs -> str -> expression -> expression
      val pack: ?loc:loc -> ?attrs:attrs -> module_expr -> expression
      val open_: ?loc:loc -> ?attrs:attrs -> override_flag -> lid -> expression
                 -> expression
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> expression
      val unreachable: ?loc:loc -> ?attrs:attrs -> unit -> expression

      val case: pattern -> ?guard:expression -> expression -> case
    end

  (** Value declarations *)
  module Val:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs ->
        ?prim:string list -> str -> core_type -> value_description
    end

  (** Type declarations *)
  module Type:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text ->
        ?params:(core_type * variance) list ->
        ?cstrs:(core_type * core_type * loc) list ->
        ?kind:type_kind -> ?priv:private_flag -> ?manifest:core_type -> str ->
        type_declaration

      val constructor: ?loc:loc -> ?attrs:attrs -> ?info:info ->
        ?args:constructor_arguments -> ?res:core_type -> str ->
        constructor_declaration
      val field: ?loc:loc -> ?attrs:attrs -> ?info:info ->
        ?mut:mutable_flag -> str -> core_type -> label_declaration
    end

  (** Type extensions *)
  module Te:
    sig
      val mk: ?attrs:attrs -> ?docs:docs ->
        ?params:(core_type * variance) list -> ?priv:private_flag ->
        lid -> extension_constructor list -> type_extension

      val constructor: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?info:info ->
        str -> extension_constructor_kind -> extension_constructor

      val decl: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?info:info ->
        ?args:constructor_arguments -> ?res:core_type -> str ->
        extension_constructor
      val rebind: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?info:info ->
        str -> lid -> extension_constructor
    end

  (** {2 Module language} *)

  (** Module type expressions *)
  module Mty:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> module_type_desc -> module_type
      val attr: module_type -> attribute -> module_type

      val ident: ?loc:loc -> ?attrs:attrs -> lid -> module_type
      val alias: ?loc:loc -> ?attrs:attrs -> lid -> module_type
      val signature: ?loc:loc -> ?attrs:attrs -> signature -> module_type
      val functor_: ?loc:loc -> ?attrs:attrs ->
        str -> module_type option -> module_type -> module_type
      val with_: ?loc:loc -> ?attrs:attrs -> module_type ->
        with_constraint list -> module_type
      val typeof_: ?loc:loc -> ?attrs:attrs -> module_expr -> module_type
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> module_type
    end

  (** Module expressions *)
  module Mod:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> module_expr_desc -> module_expr
      val attr: module_expr -> attribute -> module_expr

      val ident: ?loc:loc -> ?attrs:attrs -> lid -> module_expr
      val structure: ?loc:loc -> ?attrs:attrs -> structure -> module_expr
      val functor_: ?loc:loc -> ?attrs:attrs ->
        str -> module_type option -> module_expr -> module_expr
      val apply: ?loc:loc -> ?attrs:attrs -> module_expr -> module_expr ->
        module_expr
      val constraint_: ?loc:loc -> ?attrs:attrs -> module_expr -> module_type ->
        module_expr
      val unpack: ?loc:loc -> ?attrs:attrs -> expression -> module_expr
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> module_expr
    end

  (** Signature items *)
  module Sig:
    sig
      val mk: ?loc:loc -> signature_item_desc -> signature_item

      val value: ?loc:loc -> value_description -> signature_item
      val type_: ?loc:loc -> rec_flag -> type_declaration list -> signature_item
      val type_extension: ?loc:loc -> type_extension -> signature_item
      val exception_: ?loc:loc -> extension_constructor -> signature_item
      val module_: ?loc:loc -> module_declaration -> signature_item
      val rec_module: ?loc:loc -> module_declaration list -> signature_item
      val modtype: ?loc:loc -> module_type_declaration -> signature_item
      val open_: ?loc:loc -> open_description -> signature_item
      val include_: ?loc:loc -> include_description -> signature_item
      val class_: ?loc:loc -> class_description list -> signature_item
      val class_type: ?loc:loc -> class_type_declaration list -> signature_item
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> signature_item
      val attribute: ?loc:loc -> attribute -> signature_item
      val text: text -> signature_item list
    end

  (** Structure items *)
  module Str:
    sig
      val mk: ?loc:loc -> structure_item_desc -> structure_item

      val eval: ?loc:loc -> ?attrs:attributes -> expression -> structure_item
      val value: ?loc:loc -> rec_flag -> value_binding list -> structure_item
      val primitive: ?loc:loc -> value_description -> structure_item
      val type_: ?loc:loc -> rec_flag -> type_declaration list -> structure_item
      val type_extension: ?loc:loc -> type_extension -> structure_item
      val exception_: ?loc:loc -> extension_constructor -> structure_item
      val module_: ?loc:loc -> module_binding -> structure_item
      val rec_module: ?loc:loc -> module_binding list -> structure_item
      val modtype: ?loc:loc -> module_type_declaration -> structure_item
      val open_: ?loc:loc -> open_description -> structure_item
      val class_: ?loc:loc -> class_declaration list -> structure_item
      val class_type: ?loc:loc -> class_type_declaration list -> structure_item
      val include_: ?loc:loc -> include_declaration -> structure_item
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> structure_item
      val attribute: ?loc:loc -> attribute -> structure_item
      val text: text -> structure_item list
    end

  (** Module declarations *)
  module Md:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text ->
        str -> module_type -> module_declaration
    end

  (** Module type declarations *)
  module Mtd:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text ->
        ?typ:module_type -> str -> module_type_declaration
    end

  (** Module bindings *)
  module Mb:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text ->
        str -> module_expr -> module_binding
    end

  (** Opens *)
  module Opn:
    sig
      val mk: ?loc: loc -> ?attrs:attrs -> ?docs:docs ->
        ?override:override_flag -> lid -> open_description
    end

  (** Includes *)
  module Incl:
    sig
      val mk: ?loc: loc -> ?attrs:attrs -> ?docs:docs -> 'a -> 'a include_infos
    end

  (** Value bindings *)
  module Vb:
    sig
      val mk: ?loc: loc -> ?attrs:attrs -> ?docs:docs -> ?text:text ->
        pattern -> expression -> value_binding
    end


  (** {2 Class language} *)

  (** Class type expressions *)
  module Cty:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> class_type_desc -> class_type
      val attr: class_type -> attribute -> class_type

      val constr: ?loc:loc -> ?attrs:attrs -> lid -> core_type list -> class_type
      val signature: ?loc:loc -> ?attrs:attrs -> class_signature -> class_type
      val arrow: ?loc:loc -> ?attrs:attrs -> arg_label -> core_type ->
        class_type -> class_type
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> class_type
      val open_: ?loc:loc -> ?attrs:attrs -> override_flag -> lid -> class_type
                 -> class_type
    end

  (** Class type fields *)
  module Ctf:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs ->
        class_type_field_desc -> class_type_field
      val attr: class_type_field -> attribute -> class_type_field

      val inherit_: ?loc:loc -> ?attrs:attrs -> class_type -> class_type_field
      val val_: ?loc:loc -> ?attrs:attrs -> str -> mutable_flag ->
        virtual_flag -> core_type -> class_type_field
      val method_: ?loc:loc -> ?attrs:attrs -> str -> private_flag ->
        virtual_flag -> core_type -> class_type_field
      val constraint_: ?loc:loc -> ?attrs:attrs -> core_type -> core_type ->
        class_type_field
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> class_type_field
      val attribute: ?loc:loc -> attribute -> class_type_field
      val text: text -> class_type_field list
    end

  (** Class expressions *)
  module Cl:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> class_expr_desc -> class_expr
      val attr: class_expr -> attribute -> class_expr

      val constr: ?loc:loc -> ?attrs:attrs -> lid -> core_type list -> class_expr
      val structure: ?loc:loc -> ?attrs:attrs -> class_structure -> class_expr
      val fun_: ?loc:loc -> ?attrs:attrs -> arg_label -> expression option ->
        pattern -> class_expr -> class_expr
      val apply: ?loc:loc -> ?attrs:attrs -> class_expr ->
        (arg_label * expression) list -> class_expr
      val let_: ?loc:loc -> ?attrs:attrs -> rec_flag -> value_binding list ->
        class_expr -> class_expr
      val constraint_: ?loc:loc -> ?attrs:attrs -> class_expr -> class_type ->
        class_expr
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> class_expr
      val open_: ?loc:loc -> ?attrs:attrs -> override_flag -> lid -> class_expr
                 -> class_expr
    end

  (** Class fields *)
  module Cf:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> class_field_desc ->
        class_field
      val attr: class_field -> attribute -> class_field

      val inherit_: ?loc:loc -> ?attrs:attrs -> override_flag -> class_expr ->
        str option -> class_field
      val val_: ?loc:loc -> ?attrs:attrs -> str -> mutable_flag ->
        class_field_kind -> class_field
      val method_: ?loc:loc -> ?attrs:attrs -> str -> private_flag ->
        class_field_kind -> class_field
      val constraint_: ?loc:loc -> ?attrs:attrs -> core_type -> core_type ->
        class_field
      val initializer_: ?loc:loc -> ?attrs:attrs -> expression -> class_field
      val extension: ?loc:loc -> ?attrs:attrs -> extension -> class_field
      val attribute: ?loc:loc -> attribute -> class_field
      val text: text -> class_field list

      val virtual_: core_type -> class_field_kind
      val concrete: override_flag -> expression -> class_field_kind

    end

  (** Classes *)
  module Ci:
    sig
      val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text ->
        ?virt:virtual_flag -> ?params:(core_type * variance) list ->
        str -> 'a -> 'a class_infos
    end

  (** Class signatures *)
  module Csig:
    sig
      val mk: core_type -> class_type_field list -> class_signature
    end

  (** Class structures *)
  module Cstr:
    sig
      val mk: pattern -> class_field list -> class_structure
    end

end = struct
  (** Helpers to produce Parsetree fragments *)

  open Asttypes
  open Parsetree
  open Docstrings

  type lid = Longident.t loc
  type str = string loc
  type loc = Location.t
  type attrs = attribute list

  let default_loc = ref Location.none

  let with_default_loc l f =
    let old = !default_loc in
    default_loc := l;
    try let r = f () in default_loc := old; r
    with exn -> default_loc := old; raise exn

  module Const = struct
    let integer ?suffix i = Pconst_integer (i, suffix)
    let int ?suffix i = integer ?suffix (string_of_int i)
    let int32 ?(suffix='l') i = integer ~suffix (Int32.to_string i)
    let int64 ?(suffix='L') i = integer ~suffix (Int64.to_string i)
    let nativeint ?(suffix='n') i = integer ~suffix (Nativeint.to_string i)
    let float ?suffix f = Pconst_float (f, suffix)
    let char c = Pconst_char c
    let string ?quotation_delimiter s = Pconst_string (s, quotation_delimiter)
  end

  module Typ = struct
    let mk ?(loc = !default_loc) ?(attrs = []) d =
      {ptyp_desc = d; ptyp_loc = loc; ptyp_attributes = attrs}
    let attr d a = {d with ptyp_attributes = d.ptyp_attributes @ [a]}

    let any ?loc ?attrs () = mk ?loc ?attrs Ptyp_any
    let var ?loc ?attrs a = mk ?loc ?attrs (Ptyp_var a)
    let arrow ?loc ?attrs a b c = mk ?loc ?attrs (Ptyp_arrow (a, b, c))
    let tuple ?loc ?attrs a = mk ?loc ?attrs (Ptyp_tuple a)
    let constr ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_constr (a, b))
    let object_ ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_object (a, b))
    let class_ ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_class (a, b))
    let alias ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_alias (a, b))
    let variant ?loc ?attrs a b c = mk ?loc ?attrs (Ptyp_variant (a, b, c))
    let poly ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_poly (a, b))
    let package ?loc ?attrs a b = mk ?loc ?attrs (Ptyp_package (a, b))
    let extension ?loc ?attrs a = mk ?loc ?attrs (Ptyp_extension a)

    let force_poly t =
      match t.ptyp_desc with
      | Ptyp_poly _ -> t
      | _ -> poly ~loc:t.ptyp_loc [] t (* -> ghost? *)

    let varify_constructors var_names t =
      let check_variable vl loc v =
        if List.mem v vl then
          raise Syntaxerr.(Error(Variable_in_scope(loc,v))) in
      let var_names = List.map (fun v -> v.txt) var_names in
      let rec loop t =
        let desc =
          match t.ptyp_desc with
          | Ptyp_any -> Ptyp_any
          | Ptyp_var x ->
              check_variable var_names t.ptyp_loc x;
              Ptyp_var x
          | Ptyp_arrow (label,core_type,core_type') ->
              Ptyp_arrow(label, loop core_type, loop core_type')
          | Ptyp_tuple lst -> Ptyp_tuple (List.map loop lst)
          | Ptyp_constr( { txt = Longident.Lident s; _ }, [])
            when List.mem s var_names ->
              Ptyp_var s
          | Ptyp_constr(longident, lst) ->
              Ptyp_constr(longident, List.map loop lst)
          | Ptyp_object (lst, o) ->
              Ptyp_object (List.map loop_object_field lst, o)
          | Ptyp_class (longident, lst) ->
              Ptyp_class (longident, List.map loop lst)
          | Ptyp_alias(core_type, string) ->
              check_variable var_names t.ptyp_loc string;
              Ptyp_alias(loop core_type, string)
          | Ptyp_variant(row_field_list, flag, lbl_lst_option) ->
              Ptyp_variant(List.map loop_row_field row_field_list,
                           flag, lbl_lst_option)
          | Ptyp_poly(string_lst, core_type) ->
            List.iter (fun v ->
              check_variable var_names t.ptyp_loc v.txt) string_lst;
              Ptyp_poly(string_lst, loop core_type)
          | Ptyp_package(longident,lst) ->
              Ptyp_package(longident,List.map (fun (n,typ) -> (n,loop typ) ) lst)
          | Ptyp_extension (s, arg) ->
              Ptyp_extension (s, arg)
        in
        {t with ptyp_desc = desc}
      and loop_row_field  =
        function
          | Rtag(label,attrs,flag,lst) ->
              Rtag(label,attrs,flag,List.map loop lst)
          | Rinherit t ->
              Rinherit (loop t)
      and loop_object_field =
        function
          | Otag(label, attrs, t) ->
              Otag(label, attrs, loop t)
          | Oinherit t ->
              Oinherit (loop t)
      in
      loop t

  end

  module Pat = struct
    let mk ?(loc = !default_loc) ?(attrs = []) d =
      {ppat_desc = d; ppat_loc = loc; ppat_attributes = attrs}
    let attr d a = {d with ppat_attributes = d.ppat_attributes @ [a]}

    let any ?loc ?attrs () = mk ?loc ?attrs Ppat_any
    let var ?loc ?attrs a = mk ?loc ?attrs (Ppat_var a)
    let alias ?loc ?attrs a b = mk ?loc ?attrs (Ppat_alias (a, b))
    let constant ?loc ?attrs a = mk ?loc ?attrs (Ppat_constant a)
    let interval ?loc ?attrs a b = mk ?loc ?attrs (Ppat_interval (a, b))
    let tuple ?loc ?attrs a = mk ?loc ?attrs (Ppat_tuple a)
    let construct ?loc ?attrs a b = mk ?loc ?attrs (Ppat_construct (a, b))
    let variant ?loc ?attrs a b = mk ?loc ?attrs (Ppat_variant (a, b))
    let record ?loc ?attrs a b = mk ?loc ?attrs (Ppat_record (a, b))
    let array ?loc ?attrs a = mk ?loc ?attrs (Ppat_array a)
    let or_ ?loc ?attrs a b = mk ?loc ?attrs (Ppat_or (a, b))
    let constraint_ ?loc ?attrs a b = mk ?loc ?attrs (Ppat_constraint (a, b))
    let type_ ?loc ?attrs a = mk ?loc ?attrs (Ppat_type a)
    let lazy_ ?loc ?attrs a = mk ?loc ?attrs (Ppat_lazy a)
    let unpack ?loc ?attrs a = mk ?loc ?attrs (Ppat_unpack a)
    let open_ ?loc ?attrs a b = mk ?loc ?attrs (Ppat_open (a, b))
    let exception_ ?loc ?attrs a = mk ?loc ?attrs (Ppat_exception a)
    let extension ?loc ?attrs a = mk ?loc ?attrs (Ppat_extension a)
  end

  module Exp = struct
    let mk ?(loc = !default_loc) ?(attrs = []) d =
      {pexp_desc = d; pexp_loc = loc; pexp_attributes = attrs}
    let attr d a = {d with pexp_attributes = d.pexp_attributes @ [a]}

    let ident ?loc ?attrs a = mk ?loc ?attrs (Pexp_ident a)
    let constant ?loc ?attrs a = mk ?loc ?attrs (Pexp_constant a)
    let let_ ?loc ?attrs a b c = mk ?loc ?attrs (Pexp_let (a, b, c))
    let fun_ ?loc ?attrs a b c d = mk ?loc ?attrs (Pexp_fun (a, b, c, d))
    let function_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_function a)
    let apply ?loc ?attrs a b = mk ?loc ?attrs (Pexp_apply (a, b))
    let match_ ?loc ?attrs a b = mk ?loc ?attrs (Pexp_match (a, b))
    let try_ ?loc ?attrs a b = mk ?loc ?attrs (Pexp_try (a, b))
    let tuple ?loc ?attrs a = mk ?loc ?attrs (Pexp_tuple a)
    let construct ?loc ?attrs a b = mk ?loc ?attrs (Pexp_construct (a, b))
    let variant ?loc ?attrs a b = mk ?loc ?attrs (Pexp_variant (a, b))
    let record ?loc ?attrs a b = mk ?loc ?attrs (Pexp_record (a, b))
    let field ?loc ?attrs a b = mk ?loc ?attrs (Pexp_field (a, b))
    let setfield ?loc ?attrs a b c = mk ?loc ?attrs (Pexp_setfield (a, b, c))
    let array ?loc ?attrs a = mk ?loc ?attrs (Pexp_array a)
    let ifthenelse ?loc ?attrs a b c = mk ?loc ?attrs (Pexp_ifthenelse (a, b, c))
    let sequence ?loc ?attrs a b = mk ?loc ?attrs (Pexp_sequence (a, b))
    let while_ ?loc ?attrs a b = mk ?loc ?attrs (Pexp_while (a, b))
    let for_ ?loc ?attrs a b c d e = mk ?loc ?attrs (Pexp_for (a, b, c, d, e))
    let constraint_ ?loc ?attrs a b = mk ?loc ?attrs (Pexp_constraint (a, b))
    let coerce ?loc ?attrs a b c = mk ?loc ?attrs (Pexp_coerce (a, b, c))
    let send ?loc ?attrs a b = mk ?loc ?attrs (Pexp_send (a, b))
    let new_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_new a)
    let setinstvar ?loc ?attrs a b = mk ?loc ?attrs (Pexp_setinstvar (a, b))
    let override ?loc ?attrs a = mk ?loc ?attrs (Pexp_override a)
    let letmodule ?loc ?attrs a b c= mk ?loc ?attrs (Pexp_letmodule (a, b, c))
    let letexception ?loc ?attrs a b = mk ?loc ?attrs (Pexp_letexception (a, b))
    let assert_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_assert a)
    let lazy_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_lazy a)
    let poly ?loc ?attrs a b = mk ?loc ?attrs (Pexp_poly (a, b))
    let object_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_object a)
    let newtype ?loc ?attrs a b = mk ?loc ?attrs (Pexp_newtype (a, b))
    let pack ?loc ?attrs a = mk ?loc ?attrs (Pexp_pack a)
    let open_ ?loc ?attrs a b c = mk ?loc ?attrs (Pexp_open (a, b, c))
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pexp_extension a)
    let unreachable ?loc ?attrs () = mk ?loc ?attrs Pexp_unreachable

    let case lhs ?guard rhs =
      {
       pc_lhs = lhs;
       pc_guard = guard;
       pc_rhs = rhs;
      }
  end

  module Mty = struct
    let mk ?(loc = !default_loc) ?(attrs = []) d =
      {pmty_desc = d; pmty_loc = loc; pmty_attributes = attrs}
    let attr d a = {d with pmty_attributes = d.pmty_attributes @ [a]}

    let ident ?loc ?attrs a = mk ?loc ?attrs (Pmty_ident a)
    let alias ?loc ?attrs a = mk ?loc ?attrs (Pmty_alias a)
    let signature ?loc ?attrs a = mk ?loc ?attrs (Pmty_signature a)
    let functor_ ?loc ?attrs a b c = mk ?loc ?attrs (Pmty_functor (a, b, c))
    let with_ ?loc ?attrs a b = mk ?loc ?attrs (Pmty_with (a, b))
    let typeof_ ?loc ?attrs a = mk ?loc ?attrs (Pmty_typeof a)
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pmty_extension a)
  end

  module Mod = struct
  let mk ?(loc = !default_loc) ?(attrs = []) d =
    {pmod_desc = d; pmod_loc = loc; pmod_attributes = attrs}
    let attr d a = {d with pmod_attributes = d.pmod_attributes @ [a]}

    let ident ?loc ?attrs x = mk ?loc ?attrs (Pmod_ident x)
    let structure ?loc ?attrs x = mk ?loc ?attrs (Pmod_structure x)
    let functor_ ?loc ?attrs arg arg_ty body =
      mk ?loc ?attrs (Pmod_functor (arg, arg_ty, body))
    let apply ?loc ?attrs m1 m2 = mk ?loc ?attrs (Pmod_apply (m1, m2))
    let constraint_ ?loc ?attrs m mty = mk ?loc ?attrs (Pmod_constraint (m, mty))
    let unpack ?loc ?attrs e = mk ?loc ?attrs (Pmod_unpack e)
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pmod_extension a)
  end

  module Sig = struct
    let mk ?(loc = !default_loc) d = {psig_desc = d; psig_loc = loc}

    let value ?loc a = mk ?loc (Psig_value a)
    let type_ ?loc rec_flag a = mk ?loc (Psig_type (rec_flag, a))
    let type_extension ?loc a = mk ?loc (Psig_typext a)
    let exception_ ?loc a = mk ?loc (Psig_exception a)
    let module_ ?loc a = mk ?loc (Psig_module a)
    let rec_module ?loc a = mk ?loc (Psig_recmodule a)
    let modtype ?loc a = mk ?loc (Psig_modtype a)
    let open_ ?loc a = mk ?loc (Psig_open a)
    let include_ ?loc a = mk ?loc (Psig_include a)
    let class_ ?loc a = mk ?loc (Psig_class a)
    let class_type ?loc a = mk ?loc (Psig_class_type a)
    let extension ?loc ?(attrs = []) a = mk ?loc (Psig_extension (a, attrs))
    let attribute ?loc a = mk ?loc (Psig_attribute a)
    let text txt =
      let f_txt = List.filter (fun ds -> docstring_body ds <> "") txt in
      List.map
        (fun ds -> attribute ~loc:(docstring_loc ds) (text_attr ds))
        f_txt
  end

  module Str = struct
    let mk ?(loc = !default_loc) d = {pstr_desc = d; pstr_loc = loc}

    let eval ?loc ?(attrs = []) a = mk ?loc (Pstr_eval (a, attrs))
    let value ?loc a b = mk ?loc (Pstr_value (a, b))
    let primitive ?loc a = mk ?loc (Pstr_primitive a)
    let type_ ?loc rec_flag a = mk ?loc (Pstr_type (rec_flag, a))
    let type_extension ?loc a = mk ?loc (Pstr_typext a)
    let exception_ ?loc a = mk ?loc (Pstr_exception a)
    let module_ ?loc a = mk ?loc (Pstr_module a)
    let rec_module ?loc a = mk ?loc (Pstr_recmodule a)
    let modtype ?loc a = mk ?loc (Pstr_modtype a)
    let open_ ?loc a = mk ?loc (Pstr_open a)
    let class_ ?loc a = mk ?loc (Pstr_class a)
    let class_type ?loc a = mk ?loc (Pstr_class_type a)
    let include_ ?loc a = mk ?loc (Pstr_include a)
    let extension ?loc ?(attrs = []) a = mk ?loc (Pstr_extension (a, attrs))
    let attribute ?loc a = mk ?loc (Pstr_attribute a)
    let text txt =
      let f_txt = List.filter (fun ds -> docstring_body ds <> "") txt in
      List.map
        (fun ds -> attribute ~loc:(docstring_loc ds) (text_attr ds))
        f_txt
  end

  module Cl = struct
    let mk ?(loc = !default_loc) ?(attrs = []) d =
      {
       pcl_desc = d;
       pcl_loc = loc;
       pcl_attributes = attrs;
      }
    let attr d a = {d with pcl_attributes = d.pcl_attributes @ [a]}

    let constr ?loc ?attrs a b = mk ?loc ?attrs (Pcl_constr (a, b))
    let structure ?loc ?attrs a = mk ?loc ?attrs (Pcl_structure a)
    let fun_ ?loc ?attrs a b c d = mk ?loc ?attrs (Pcl_fun (a, b, c, d))
    let apply ?loc ?attrs a b = mk ?loc ?attrs (Pcl_apply (a, b))
    let let_ ?loc ?attrs a b c = mk ?loc ?attrs (Pcl_let (a, b, c))
    let constraint_ ?loc ?attrs a b = mk ?loc ?attrs (Pcl_constraint (a, b))
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pcl_extension a)
    let open_ ?loc ?attrs a b c = mk ?loc ?attrs (Pcl_open (a, b, c))
  end

  module Cty = struct
    let mk ?(loc = !default_loc) ?(attrs = []) d =
      {
       pcty_desc = d;
       pcty_loc = loc;
       pcty_attributes = attrs;
      }
    let attr d a = {d with pcty_attributes = d.pcty_attributes @ [a]}

    let constr ?loc ?attrs a b = mk ?loc ?attrs (Pcty_constr (a, b))
    let signature ?loc ?attrs a = mk ?loc ?attrs (Pcty_signature a)
    let arrow ?loc ?attrs a b c = mk ?loc ?attrs (Pcty_arrow (a, b, c))
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pcty_extension a)
    let open_ ?loc ?attrs a b c = mk ?loc ?attrs (Pcty_open (a, b, c))
  end

  module Ctf = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
             ?(docs = empty_docs) d =
      {
       pctf_desc = d;
       pctf_loc = loc;
       pctf_attributes = add_docs_attrs docs attrs;
      }

    let inherit_ ?loc ?attrs a = mk ?loc ?attrs (Pctf_inherit a)
    let val_ ?loc ?attrs a b c d = mk ?loc ?attrs (Pctf_val (a, b, c, d))
    let method_ ?loc ?attrs a b c d = mk ?loc ?attrs (Pctf_method (a, b, c, d))
    let constraint_ ?loc ?attrs a b = mk ?loc ?attrs (Pctf_constraint (a, b))
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pctf_extension a)
    let attribute ?loc a = mk ?loc (Pctf_attribute a)
    let text txt =
     let f_txt = List.filter (fun ds -> docstring_body ds <> "") txt in
       List.map
        (fun ds -> attribute ~loc:(docstring_loc ds) (text_attr ds))
        f_txt

    let attr d a = {d with pctf_attributes = d.pctf_attributes @ [a]}

  end

  module Cf = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) d =
      {
       pcf_desc = d;
       pcf_loc = loc;
       pcf_attributes = add_docs_attrs docs attrs;
      }

    let inherit_ ?loc ?attrs a b c = mk ?loc ?attrs (Pcf_inherit (a, b, c))
    let val_ ?loc ?attrs a b c = mk ?loc ?attrs (Pcf_val (a, b, c))
    let method_ ?loc ?attrs a b c = mk ?loc ?attrs (Pcf_method (a, b, c))
    let constraint_ ?loc ?attrs a b = mk ?loc ?attrs (Pcf_constraint (a, b))
    let initializer_ ?loc ?attrs a = mk ?loc ?attrs (Pcf_initializer a)
    let extension ?loc ?attrs a = mk ?loc ?attrs (Pcf_extension a)
    let attribute ?loc a = mk ?loc (Pcf_attribute a)
    let text txt =
      let f_txt = List.filter (fun ds -> docstring_body ds <> "") txt in
      List.map
        (fun ds -> attribute ~loc:(docstring_loc ds) (text_attr ds))
        f_txt

    let virtual_ ct = Cfk_virtual ct
    let concrete o e = Cfk_concrete (o, e)

    let attr d a = {d with pcf_attributes = d.pcf_attributes @ [a]}

  end

  module Val = struct
    let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs)
          ?(prim = []) name typ =
      {
       pval_name = name;
       pval_type = typ;
       pval_attributes = add_docs_attrs docs attrs;
       pval_loc = loc;
       pval_prim = prim;
      }
  end

  module Md = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(text = []) name typ =
      {
       pmd_name = name;
       pmd_type = typ;
       pmd_attributes =
         add_text_attrs text (add_docs_attrs docs attrs);
       pmd_loc = loc;
      }
  end

  module Mtd = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(text = []) ?typ name =
      {
       pmtd_name = name;
       pmtd_type = typ;
       pmtd_attributes =
         add_text_attrs text (add_docs_attrs docs attrs);
       pmtd_loc = loc;
      }
  end

  module Mb = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(text = []) name expr =
      {
       pmb_name = name;
       pmb_expr = expr;
       pmb_attributes =
         add_text_attrs text (add_docs_attrs docs attrs);
       pmb_loc = loc;
      }
  end

  module Opn = struct
    let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs)
          ?(override = Fresh) lid =
      {
       popen_lid = lid;
       popen_override = override;
       popen_loc = loc;
       popen_attributes = add_docs_attrs docs attrs;
      }
  end

  module Incl = struct
    let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs) mexpr =
      {
       pincl_mod = mexpr;
       pincl_loc = loc;
       pincl_attributes = add_docs_attrs docs attrs;
      }

  end

  module Vb = struct
    let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs)
          ?(text = []) pat expr =
      {
       pvb_pat = pat;
       pvb_expr = expr;
       pvb_attributes =
         add_text_attrs text (add_docs_attrs docs attrs);
       pvb_loc = loc;
      }
  end

  module Ci = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(text = [])
          ?(virt = Concrete) ?(params = []) name expr =
      {
       pci_virt = virt;
       pci_params = params;
       pci_name = name;
       pci_expr = expr;
       pci_attributes =
         add_text_attrs text (add_docs_attrs docs attrs);
       pci_loc = loc;
      }
  end

  module Type = struct
    let mk ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(text = [])
        ?(params = [])
        ?(cstrs = [])
        ?(kind = Ptype_abstract)
        ?(priv = Public)
        ?manifest
        name =
      {
       ptype_name = name;
       ptype_params = params;
       ptype_cstrs = cstrs;
       ptype_kind = kind;
       ptype_private = priv;
       ptype_manifest = manifest;
       ptype_attributes =
         add_text_attrs text (add_docs_attrs docs attrs);
       ptype_loc = loc;
      }

    let constructor ?(loc = !default_loc) ?(attrs = []) ?(info = empty_info)
          ?(args = Pcstr_tuple []) ?res name =
      {
       pcd_name = name;
       pcd_args = args;
       pcd_res = res;
       pcd_loc = loc;
       pcd_attributes = add_info_attrs info attrs;
      }

    let field ?(loc = !default_loc) ?(attrs = []) ?(info = empty_info)
          ?(mut = Immutable) name typ =
      {
       pld_name = name;
       pld_mutable = mut;
       pld_type = typ;
       pld_loc = loc;
       pld_attributes = add_info_attrs info attrs;
      }

  end

  (** Type extensions *)
  module Te = struct
    let mk ?(attrs = []) ?(docs = empty_docs)
          ?(params = []) ?(priv = Public) path constructors =
      {
       ptyext_path = path;
       ptyext_params = params;
       ptyext_constructors = constructors;
       ptyext_private = priv;
       ptyext_attributes = add_docs_attrs docs attrs;
      }

    let constructor ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(info = empty_info) name kind =
      {
       pext_name = name;
       pext_kind = kind;
       pext_loc = loc;
       pext_attributes = add_docs_attrs docs (add_info_attrs info attrs);
      }

    let decl ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs)
               ?(info = empty_info) ?(args = Pcstr_tuple []) ?res name =
      {
       pext_name = name;
       pext_kind = Pext_decl(args, res);
       pext_loc = loc;
       pext_attributes = add_docs_attrs docs (add_info_attrs info attrs);
      }

    let rebind ?(loc = !default_loc) ?(attrs = [])
          ?(docs = empty_docs) ?(info = empty_info) name lid =
      {
       pext_name = name;
       pext_kind = Pext_rebind lid;
       pext_loc = loc;
       pext_attributes = add_docs_attrs docs (add_info_attrs info attrs);
      }

  end

  module Csig = struct
    let mk self fields =
      {
       pcsig_self = self;
       pcsig_fields = fields;
      }
  end

  module Cstr = struct
    let mk self fields =
      {
       pcstr_self = self;
       pcstr_fields = fields;
      }
  end

end

module Ast_mapper : sig
  (** The interface of a -ppx rewriter

    A -ppx rewriter is a program that accepts a serialized abstract syntax
    tree and outputs another, possibly modified, abstract syntax tree.
    This module encapsulates the interface between the compiler and
    the -ppx rewriters, handling such details as the serialization format,
    forwarding of command-line flags, and storing state.

    {!mapper} allows to implement AST rewriting using open recursion.
    A typical mapper would be based on {!default_mapper}, a deep
    identity mapper, and will fall back on it for handling the syntax it
    does not modify. For example:

    {[
  open Asttypes
  open Parsetree
  open Ast_mapper

  let test_mapper argv =
    { default_mapper with
      expr = fun mapper expr ->
        match expr with
        | { pexp_desc = Pexp_extension ({ txt = "test" }, PStr [])} ->
          Ast_helper.Exp.constant (Const_int 42)
        | other -> default_mapper.expr mapper other; }

  let () =
    register "ppx_test" test_mapper]}

    This -ppx rewriter, which replaces [[%test]] in expressions with
    the constant [42], can be compiled using
    [ocamlc -o ppx_test -I +compiler-libs ocamlcommon.cma ppx_test.ml].

    *)

  open Parsetree

  (** {2 A generic Parsetree mapper} *)

  type mapper              = Ast_mapper.mapper   = {
    attribute: mapper -> attribute -> attribute;
    attributes: mapper -> attribute list -> attribute list;
    case: mapper -> case -> case;
    cases: mapper -> case list -> case list;
    class_declaration: mapper -> class_declaration -> class_declaration;
    class_description: mapper -> class_description -> class_description;
    class_expr: mapper -> class_expr -> class_expr;
    class_field: mapper -> class_field -> class_field;
    class_signature: mapper -> class_signature -> class_signature;
    class_structure: mapper -> class_structure -> class_structure;
    class_type: mapper -> class_type -> class_type;
    class_type_declaration: mapper -> class_type_declaration
                            -> class_type_declaration;
    class_type_field: mapper -> class_type_field -> class_type_field;
    constructor_declaration: mapper -> constructor_declaration
                             -> constructor_declaration;
    expr: mapper -> expression -> expression;
    extension: mapper -> extension -> extension;
    extension_constructor: mapper -> extension_constructor
                           -> extension_constructor;
    include_declaration: mapper -> include_declaration -> include_declaration;
    include_description: mapper -> include_description -> include_description;
    label_declaration: mapper -> label_declaration -> label_declaration;
    location: mapper -> Location.t -> Location.t;
    module_binding: mapper -> module_binding -> module_binding;
    module_declaration: mapper -> module_declaration -> module_declaration;
    module_expr: mapper -> module_expr -> module_expr;
    module_type: mapper -> module_type -> module_type;
    module_type_declaration: mapper -> module_type_declaration
                             -> module_type_declaration;
    open_description: mapper -> open_description -> open_description;
    pat: mapper -> pattern -> pattern;
    payload: mapper -> payload -> payload;
    signature: mapper -> signature -> signature;
    signature_item: mapper -> signature_item -> signature_item;
    structure: mapper -> structure -> structure;
    structure_item: mapper -> structure_item -> structure_item;
    typ: mapper -> core_type -> core_type;
    type_declaration: mapper -> type_declaration -> type_declaration;
    type_extension: mapper -> type_extension -> type_extension;
    type_kind: mapper -> type_kind -> type_kind;
    value_binding: mapper -> value_binding -> value_binding;
    value_description: mapper -> value_description -> value_description;
    with_constraint: mapper -> with_constraint -> with_constraint;
  }
  (** A mapper record implements one "method" per syntactic category,
      using an open recursion style: each method takes as its first
      argument the mapper to be applied to children in the syntax
      tree. *)

  val default_mapper: mapper
  (** A default mapper, which implements a "deep identity" mapping. *)

  (** {2 Convenience functions to write mappers} *)

  val map_opt: ('a -> 'b) -> 'a option -> 'b option

  val extension_of_error: Location.error -> extension
  (** Encode an error into an 'ocaml.error' extension node which can be
      inserted in a generated Parsetree.  The compiler will be
      responsible for reporting the error. *)

  val attribute_of_warning: Location.t -> string -> attribute
  (** Encode a warning message into an 'ocaml.ppwarning' attribute which can be
      inserted in a generated Parsetree.  The compiler will be
      responsible for reporting the warning. *)

end = struct
  (* A generic Parsetree mapping class *)

  (*
  [@@@ocaml.warning "+9"]
    (* Ensure that record patterns don't miss any field. *)
  *)


  open Parsetree
  open Ast_helper
  open Location

  type mapper              = Ast_mapper.mapper   = {
    attribute: mapper -> attribute -> attribute;
    attributes: mapper -> attribute list -> attribute list;
    case: mapper -> case -> case;
    cases: mapper -> case list -> case list;
    class_declaration: mapper -> class_declaration -> class_declaration;
    class_description: mapper -> class_description -> class_description;
    class_expr: mapper -> class_expr -> class_expr;
    class_field: mapper -> class_field -> class_field;
    class_signature: mapper -> class_signature -> class_signature;
    class_structure: mapper -> class_structure -> class_structure;
    class_type: mapper -> class_type -> class_type;
    class_type_declaration: mapper -> class_type_declaration
                            -> class_type_declaration;
    class_type_field: mapper -> class_type_field -> class_type_field;
    constructor_declaration: mapper -> constructor_declaration
                             -> constructor_declaration;
    expr: mapper -> expression -> expression;
    extension: mapper -> extension -> extension;
    extension_constructor: mapper -> extension_constructor
                           -> extension_constructor;
    include_declaration: mapper -> include_declaration -> include_declaration;
    include_description: mapper -> include_description -> include_description;
    label_declaration: mapper -> label_declaration -> label_declaration;
    location: mapper -> Location.t -> Location.t;
    module_binding: mapper -> module_binding -> module_binding;
    module_declaration: mapper -> module_declaration -> module_declaration;
    module_expr: mapper -> module_expr -> module_expr;
    module_type: mapper -> module_type -> module_type;
    module_type_declaration: mapper -> module_type_declaration
                             -> module_type_declaration;
    open_description: mapper -> open_description -> open_description;
    pat: mapper -> pattern -> pattern;
    payload: mapper -> payload -> payload;
    signature: mapper -> signature -> signature;
    signature_item: mapper -> signature_item -> signature_item;
    structure: mapper -> structure -> structure;
    structure_item: mapper -> structure_item -> structure_item;
    typ: mapper -> core_type -> core_type;
    type_declaration: mapper -> type_declaration -> type_declaration;
    type_extension: mapper -> type_extension -> type_extension;
    type_kind: mapper -> type_kind -> type_kind;
    value_binding: mapper -> value_binding -> value_binding;
    value_description: mapper -> value_description -> value_description;
    with_constraint: mapper -> with_constraint -> with_constraint;
  }

  let map_fst f (x, y) = (f x, y)
  let map_snd f (x, y) = (x, f y)
  let map_tuple f1 f2 (x, y) = (f1 x, f2 y)
  let map_tuple3 f1 f2 f3 (x, y, z) = (f1 x, f2 y, f3 z)
  let map_opt f = function None -> None | Some x -> Some (f x)

  let map_loc sub {loc; txt} = {loc = sub.location sub loc; txt}

  module T = struct
    (* Type expressions for the core language *)

    let row_field sub = function
      | Rtag (l, attrs, b, tl) ->
          Rtag (map_loc sub l, sub.attributes sub attrs,
                b, List.map (sub.typ sub) tl)
      | Rinherit t -> Rinherit (sub.typ sub t)

    let object_field sub = function
      | Otag (l, attrs, t) ->
          Otag (map_loc sub l, sub.attributes sub attrs, sub.typ sub t)
      | Oinherit t -> Oinherit (sub.typ sub t)

    let map sub {ptyp_desc = desc; ptyp_loc = loc; ptyp_attributes = attrs} =
      let open Typ in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Ptyp_any -> any ~loc ~attrs ()
      | Ptyp_var s -> var ~loc ~attrs s
      | Ptyp_arrow (lab, t1, t2) ->
          arrow ~loc ~attrs lab (sub.typ sub t1) (sub.typ sub t2)
      | Ptyp_tuple tyl -> tuple ~loc ~attrs (List.map (sub.typ sub) tyl)
      | Ptyp_constr (lid, tl) ->
          constr ~loc ~attrs (map_loc sub lid) (List.map (sub.typ sub) tl)
      | Ptyp_object (l, o) ->
          object_ ~loc ~attrs (List.map (object_field sub) l) o
      | Ptyp_class (lid, tl) ->
          class_ ~loc ~attrs (map_loc sub lid) (List.map (sub.typ sub) tl)
      | Ptyp_alias (t, s) -> alias ~loc ~attrs (sub.typ sub t) s
      | Ptyp_variant (rl, b, ll) ->
          variant ~loc ~attrs (List.map (row_field sub) rl) b ll
      | Ptyp_poly (sl, t) -> poly ~loc ~attrs
                               (List.map (map_loc sub) sl) (sub.typ sub t)
      | Ptyp_package (lid, l) ->
          package ~loc ~attrs (map_loc sub lid)
            (List.map (map_tuple (map_loc sub) (sub.typ sub)) l)
      | Ptyp_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_type_declaration sub
        {ptype_name; ptype_params; ptype_cstrs;
         ptype_kind;
         ptype_private;
         ptype_manifest;
         ptype_attributes;
         ptype_loc} =
      Type.mk (map_loc sub ptype_name)
        ~params:(List.map (map_fst (sub.typ sub)) ptype_params)
        ~priv:ptype_private
        ~cstrs:(List.map
                  (map_tuple3 (sub.typ sub) (sub.typ sub) (sub.location sub))
                  ptype_cstrs)
        ~kind:(sub.type_kind sub ptype_kind)
        ?manifest:(map_opt (sub.typ sub) ptype_manifest)
        ~loc:(sub.location sub ptype_loc)
        ~attrs:(sub.attributes sub ptype_attributes)

    let map_type_kind sub = function
      | Ptype_abstract -> Ptype_abstract
      | Ptype_variant l ->
          Ptype_variant (List.map (sub.constructor_declaration sub) l)
      | Ptype_record l -> Ptype_record (List.map (sub.label_declaration sub) l)
      | Ptype_open -> Ptype_open

    let map_constructor_arguments sub = function
      | Pcstr_tuple l -> Pcstr_tuple (List.map (sub.typ sub) l)
      | Pcstr_record l ->
          Pcstr_record (List.map (sub.label_declaration sub) l)

    let map_type_extension sub
        {ptyext_path; ptyext_params;
         ptyext_constructors;
         ptyext_private;
         ptyext_attributes} =
      Te.mk
        (map_loc sub ptyext_path)
        (List.map (sub.extension_constructor sub) ptyext_constructors)
        ~params:(List.map (map_fst (sub.typ sub)) ptyext_params)
        ~priv:ptyext_private
        ~attrs:(sub.attributes sub ptyext_attributes)

    let map_extension_constructor_kind sub = function
        Pext_decl(ctl, cto) ->
          Pext_decl(map_constructor_arguments sub ctl, map_opt (sub.typ sub) cto)
      | Pext_rebind li ->
          Pext_rebind (map_loc sub li)

    let map_extension_constructor sub
        {pext_name;
         pext_kind;
         pext_loc;
         pext_attributes} =
      Te.constructor
        (map_loc sub pext_name)
        (map_extension_constructor_kind sub pext_kind)
        ~loc:(sub.location sub pext_loc)
        ~attrs:(sub.attributes sub pext_attributes)

  end

  module CT = struct
    (* Type expressions for the class language *)

    let map sub {pcty_loc = loc; pcty_desc = desc; pcty_attributes = attrs} =
      let open Cty in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pcty_constr (lid, tys) ->
          constr ~loc ~attrs (map_loc sub lid) (List.map (sub.typ sub) tys)
      | Pcty_signature x -> signature ~loc ~attrs (sub.class_signature sub x)
      | Pcty_arrow (lab, t, ct) ->
          arrow ~loc ~attrs lab (sub.typ sub t) (sub.class_type sub ct)
      | Pcty_extension x -> extension ~loc ~attrs (sub.extension sub x)
      | Pcty_open (ovf, lid, ct) ->
          open_ ~loc ~attrs ovf (map_loc sub lid) (sub.class_type sub ct)

    let map_field sub {pctf_desc = desc; pctf_loc = loc; pctf_attributes = attrs}
      =
      let open Ctf in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pctf_inherit ct -> inherit_ ~loc ~attrs (sub.class_type sub ct)
      | Pctf_val (s, m, v, t) ->
          val_ ~loc ~attrs (map_loc sub s) m v (sub.typ sub t)
      | Pctf_method (s, p, v, t) ->
          method_ ~loc ~attrs (map_loc sub s) p v (sub.typ sub t)
      | Pctf_constraint (t1, t2) ->
          constraint_ ~loc ~attrs (sub.typ sub t1) (sub.typ sub t2)
      | Pctf_attribute x -> attribute ~loc (sub.attribute sub x)
      | Pctf_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_signature sub {pcsig_self; pcsig_fields} =
      Csig.mk
        (sub.typ sub pcsig_self)
        (List.map (sub.class_type_field sub) pcsig_fields)
  end

  module MT = struct
    (* Type expressions for the module language *)

    let map sub {pmty_desc = desc; pmty_loc = loc; pmty_attributes = attrs} =
      let open Mty in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pmty_ident s -> ident ~loc ~attrs (map_loc sub s)
      | Pmty_alias s -> alias ~loc ~attrs (map_loc sub s)
      | Pmty_signature sg -> signature ~loc ~attrs (sub.signature sub sg)
      | Pmty_functor (s, mt1, mt2) ->
          functor_ ~loc ~attrs (map_loc sub s)
            (Misc.may_map (sub.module_type sub) mt1)
            (sub.module_type sub mt2)
      | Pmty_with (mt, l) ->
          with_ ~loc ~attrs (sub.module_type sub mt)
            (List.map (sub.with_constraint sub) l)
      | Pmty_typeof me -> typeof_ ~loc ~attrs (sub.module_expr sub me)
      | Pmty_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_with_constraint sub = function
      | Pwith_type (lid, d) ->
          Pwith_type (map_loc sub lid, sub.type_declaration sub d)
      | Pwith_module (lid, lid2) ->
          Pwith_module (map_loc sub lid, map_loc sub lid2)
      | Pwith_typesubst (lid, d) ->
          Pwith_typesubst (map_loc sub lid, sub.type_declaration sub d)
      | Pwith_modsubst (s, lid) ->
          Pwith_modsubst (map_loc sub s, map_loc sub lid)

    let map_signature_item sub {psig_desc = desc; psig_loc = loc} =
      let open Sig in
      let loc = sub.location sub loc in
      match desc with
      | Psig_value vd -> value ~loc (sub.value_description sub vd)
      | Psig_type (rf, l) -> type_ ~loc rf (List.map (sub.type_declaration sub) l)
      | Psig_typext te -> type_extension ~loc (sub.type_extension sub te)
      | Psig_exception ed -> exception_ ~loc (sub.extension_constructor sub ed)
      | Psig_module x -> module_ ~loc (sub.module_declaration sub x)
      | Psig_recmodule l ->
          rec_module ~loc (List.map (sub.module_declaration sub) l)
      | Psig_modtype x -> modtype ~loc (sub.module_type_declaration sub x)
      | Psig_open x -> open_ ~loc (sub.open_description sub x)
      | Psig_include x -> include_ ~loc (sub.include_description sub x)
      | Psig_class l -> class_ ~loc (List.map (sub.class_description sub) l)
      | Psig_class_type l ->
          class_type ~loc (List.map (sub.class_type_declaration sub) l)
      | Psig_extension (x, attrs) ->
          extension ~loc (sub.extension sub x) ~attrs:(sub.attributes sub attrs)
      | Psig_attribute x -> attribute ~loc (sub.attribute sub x)
  end


  module M = struct
    (* Value expressions for the module language *)

    let map sub {pmod_loc = loc; pmod_desc = desc; pmod_attributes = attrs} =
      let open Mod in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pmod_ident x -> ident ~loc ~attrs (map_loc sub x)
      | Pmod_structure str -> structure ~loc ~attrs (sub.structure sub str)
      | Pmod_functor (arg, arg_ty, body) ->
          functor_ ~loc ~attrs (map_loc sub arg)
            (Misc.may_map (sub.module_type sub) arg_ty)
            (sub.module_expr sub body)
      | Pmod_apply (m1, m2) ->
          apply ~loc ~attrs (sub.module_expr sub m1) (sub.module_expr sub m2)
      | Pmod_constraint (m, mty) ->
          constraint_ ~loc ~attrs (sub.module_expr sub m)
                      (sub.module_type sub mty)
      | Pmod_unpack e -> unpack ~loc ~attrs (sub.expr sub e)
      | Pmod_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_structure_item sub {pstr_loc = loc; pstr_desc = desc} =
      let open Str in
      let loc = sub.location sub loc in
      match desc with
      | Pstr_eval (x, attrs) ->
          eval ~loc ~attrs:(sub.attributes sub attrs) (sub.expr sub x)
      | Pstr_value (r, vbs) -> value ~loc r (List.map (sub.value_binding sub) vbs)
      | Pstr_primitive vd -> primitive ~loc (sub.value_description sub vd)
      | Pstr_type (rf, l) -> type_ ~loc rf (List.map (sub.type_declaration sub) l)
      | Pstr_typext te -> type_extension ~loc (sub.type_extension sub te)
      | Pstr_exception ed -> exception_ ~loc (sub.extension_constructor sub ed)
      | Pstr_module x -> module_ ~loc (sub.module_binding sub x)
      | Pstr_recmodule l -> rec_module ~loc (List.map (sub.module_binding sub) l)
      | Pstr_modtype x -> modtype ~loc (sub.module_type_declaration sub x)
      | Pstr_open x -> open_ ~loc (sub.open_description sub x)
      | Pstr_class l -> class_ ~loc (List.map (sub.class_declaration sub) l)
      | Pstr_class_type l ->
          class_type ~loc (List.map (sub.class_type_declaration sub) l)
      | Pstr_include x -> include_ ~loc (sub.include_declaration sub x)
      | Pstr_extension (x, attrs) ->
          extension ~loc (sub.extension sub x) ~attrs:(sub.attributes sub attrs)
      | Pstr_attribute x -> attribute ~loc (sub.attribute sub x)
  end

  module E = struct
    (* Value expressions for the core language *)

    let map sub {pexp_loc = loc; pexp_desc = desc; pexp_attributes = attrs} =
      let open Exp in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pexp_ident x -> ident ~loc ~attrs (map_loc sub x)
      | Pexp_constant x -> constant ~loc ~attrs x
      | Pexp_let (r, vbs, e) ->
          let_ ~loc ~attrs r (List.map (sub.value_binding sub) vbs)
            (sub.expr sub e)
      | Pexp_fun (lab, def, p, e) ->
          fun_ ~loc ~attrs lab (map_opt (sub.expr sub) def) (sub.pat sub p)
            (sub.expr sub e)
      | Pexp_function pel -> function_ ~loc ~attrs (sub.cases sub pel)
      | Pexp_apply (e, l) ->
          apply ~loc ~attrs (sub.expr sub e) (List.map (map_snd (sub.expr sub)) l)
      | Pexp_match (e, pel) ->
          match_ ~loc ~attrs (sub.expr sub e) (sub.cases sub pel)
      | Pexp_try (e, pel) -> try_ ~loc ~attrs (sub.expr sub e) (sub.cases sub pel)
      | Pexp_tuple el -> tuple ~loc ~attrs (List.map (sub.expr sub) el)
      | Pexp_construct (lid, arg) ->
          construct ~loc ~attrs (map_loc sub lid) (map_opt (sub.expr sub) arg)
      | Pexp_variant (lab, eo) ->
          variant ~loc ~attrs lab (map_opt (sub.expr sub) eo)
      | Pexp_record (l, eo) ->
          record ~loc ~attrs (List.map (map_tuple (map_loc sub) (sub.expr sub)) l)
            (map_opt (sub.expr sub) eo)
      | Pexp_field (e, lid) ->
          field ~loc ~attrs (sub.expr sub e) (map_loc sub lid)
      | Pexp_setfield (e1, lid, e2) ->
          setfield ~loc ~attrs (sub.expr sub e1) (map_loc sub lid)
            (sub.expr sub e2)
      | Pexp_array el -> array ~loc ~attrs (List.map (sub.expr sub) el)
      | Pexp_ifthenelse (e1, e2, e3) ->
          ifthenelse ~loc ~attrs (sub.expr sub e1) (sub.expr sub e2)
            (map_opt (sub.expr sub) e3)
      | Pexp_sequence (e1, e2) ->
          sequence ~loc ~attrs (sub.expr sub e1) (sub.expr sub e2)
      | Pexp_while (e1, e2) ->
          while_ ~loc ~attrs (sub.expr sub e1) (sub.expr sub e2)
      | Pexp_for (p, e1, e2, d, e3) ->
          for_ ~loc ~attrs (sub.pat sub p) (sub.expr sub e1) (sub.expr sub e2) d
            (sub.expr sub e3)
      | Pexp_coerce (e, t1, t2) ->
          coerce ~loc ~attrs (sub.expr sub e) (map_opt (sub.typ sub) t1)
            (sub.typ sub t2)
      | Pexp_constraint (e, t) ->
          constraint_ ~loc ~attrs (sub.expr sub e) (sub.typ sub t)
      | Pexp_send (e, s) ->
          send ~loc ~attrs (sub.expr sub e) (map_loc sub s)
      | Pexp_new lid -> new_ ~loc ~attrs (map_loc sub lid)
      | Pexp_setinstvar (s, e) ->
          setinstvar ~loc ~attrs (map_loc sub s) (sub.expr sub e)
      | Pexp_override sel ->
          override ~loc ~attrs
            (List.map (map_tuple (map_loc sub) (sub.expr sub)) sel)
      | Pexp_letmodule (s, me, e) ->
          letmodule ~loc ~attrs (map_loc sub s) (sub.module_expr sub me)
            (sub.expr sub e)
      | Pexp_letexception (cd, e) ->
          letexception ~loc ~attrs
            (sub.extension_constructor sub cd)
            (sub.expr sub e)
      | Pexp_assert e -> assert_ ~loc ~attrs (sub.expr sub e)
      | Pexp_lazy e -> lazy_ ~loc ~attrs (sub.expr sub e)
      | Pexp_poly (e, t) ->
          poly ~loc ~attrs (sub.expr sub e) (map_opt (sub.typ sub) t)
      | Pexp_object cls -> object_ ~loc ~attrs (sub.class_structure sub cls)
      | Pexp_newtype (s, e) ->
          newtype ~loc ~attrs (map_loc sub s) (sub.expr sub e)
      | Pexp_pack me -> pack ~loc ~attrs (sub.module_expr sub me)
      | Pexp_open (ovf, lid, e) ->
          open_ ~loc ~attrs ovf (map_loc sub lid) (sub.expr sub e)
      | Pexp_extension x -> extension ~loc ~attrs (sub.extension sub x)
      | Pexp_unreachable -> unreachable ~loc ~attrs ()
  end

  module P = struct
    (* Patterns *)

    let map sub {ppat_desc = desc; ppat_loc = loc; ppat_attributes = attrs} =
      let open Pat in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Ppat_any -> any ~loc ~attrs ()
      | Ppat_var s -> var ~loc ~attrs (map_loc sub s)
      | Ppat_alias (p, s) -> alias ~loc ~attrs (sub.pat sub p) (map_loc sub s)
      | Ppat_constant c -> constant ~loc ~attrs c
      | Ppat_interval (c1, c2) -> interval ~loc ~attrs c1 c2
      | Ppat_tuple pl -> tuple ~loc ~attrs (List.map (sub.pat sub) pl)
      | Ppat_construct (l, p) ->
          construct ~loc ~attrs (map_loc sub l) (map_opt (sub.pat sub) p)
      | Ppat_variant (l, p) -> variant ~loc ~attrs l (map_opt (sub.pat sub) p)
      | Ppat_record (lpl, cf) ->
          record ~loc ~attrs
                 (List.map (map_tuple (map_loc sub) (sub.pat sub)) lpl) cf
      | Ppat_array pl -> array ~loc ~attrs (List.map (sub.pat sub) pl)
      | Ppat_or (p1, p2) -> or_ ~loc ~attrs (sub.pat sub p1) (sub.pat sub p2)
      | Ppat_constraint (p, t) ->
          constraint_ ~loc ~attrs (sub.pat sub p) (sub.typ sub t)
      | Ppat_type s -> type_ ~loc ~attrs (map_loc sub s)
      | Ppat_lazy p -> lazy_ ~loc ~attrs (sub.pat sub p)
      | Ppat_unpack s -> unpack ~loc ~attrs (map_loc sub s)
      | Ppat_open (lid,p) -> open_ ~loc ~attrs (map_loc sub lid) (sub.pat sub p)
      | Ppat_exception p -> exception_ ~loc ~attrs (sub.pat sub p)
      | Ppat_extension x -> extension ~loc ~attrs (sub.extension sub x)
  end

  module CE = struct
    (* Value expressions for the class language *)

    let map sub {pcl_loc = loc; pcl_desc = desc; pcl_attributes = attrs} =
      let open Cl in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pcl_constr (lid, tys) ->
          constr ~loc ~attrs (map_loc sub lid) (List.map (sub.typ sub) tys)
      | Pcl_structure s ->
          structure ~loc ~attrs (sub.class_structure sub s)
      | Pcl_fun (lab, e, p, ce) ->
          fun_ ~loc ~attrs lab
            (map_opt (sub.expr sub) e)
            (sub.pat sub p)
            (sub.class_expr sub ce)
      | Pcl_apply (ce, l) ->
          apply ~loc ~attrs (sub.class_expr sub ce)
            (List.map (map_snd (sub.expr sub)) l)
      | Pcl_let (r, vbs, ce) ->
          let_ ~loc ~attrs r (List.map (sub.value_binding sub) vbs)
            (sub.class_expr sub ce)
      | Pcl_constraint (ce, ct) ->
          constraint_ ~loc ~attrs (sub.class_expr sub ce) (sub.class_type sub ct)
      | Pcl_extension x -> extension ~loc ~attrs (sub.extension sub x)
      | Pcl_open (ovf, lid, ce) ->
          open_ ~loc ~attrs ovf (map_loc sub lid) (sub.class_expr sub ce)

    let map_kind sub = function
      | Cfk_concrete (o, e) -> Cfk_concrete (o, sub.expr sub e)
      | Cfk_virtual t -> Cfk_virtual (sub.typ sub t)

    let map_field sub {pcf_desc = desc; pcf_loc = loc; pcf_attributes = attrs} =
      let open Cf in
      let loc = sub.location sub loc in
      let attrs = sub.attributes sub attrs in
      match desc with
      | Pcf_inherit (o, ce, s) ->
          inherit_ ~loc ~attrs o (sub.class_expr sub ce)
            (map_opt (map_loc sub) s)
      | Pcf_val (s, m, k) -> val_ ~loc ~attrs (map_loc sub s) m (map_kind sub k)
      | Pcf_method (s, p, k) ->
          method_ ~loc ~attrs (map_loc sub s) p (map_kind sub k)
      | Pcf_constraint (t1, t2) ->
          constraint_ ~loc ~attrs (sub.typ sub t1) (sub.typ sub t2)
      | Pcf_initializer e -> initializer_ ~loc ~attrs (sub.expr sub e)
      | Pcf_attribute x -> attribute ~loc (sub.attribute sub x)
      | Pcf_extension x -> extension ~loc ~attrs (sub.extension sub x)

    let map_structure sub {pcstr_self; pcstr_fields} =
      {
        pcstr_self = sub.pat sub pcstr_self;
        pcstr_fields = List.map (sub.class_field sub) pcstr_fields;
      }

    let class_infos sub f {pci_virt; pci_params = pl; pci_name; pci_expr;
                           pci_loc; pci_attributes} =
      Ci.mk
       ~virt:pci_virt
       ~params:(List.map (map_fst (sub.typ sub)) pl)
        (map_loc sub pci_name)
        (f pci_expr)
        ~loc:(sub.location sub pci_loc)
        ~attrs:(sub.attributes sub pci_attributes)
  end

  (* Now, a generic AST mapper, to be extended to cover all kinds and
     cases of the OCaml grammar.  The default behavior of the mapper is
     the identity. *)

  let default_mapper =
    {
      structure = (fun this l -> List.map (this.structure_item this) l);
      structure_item = M.map_structure_item;
      module_expr = M.map;
      signature = (fun this l -> List.map (this.signature_item this) l);
      signature_item = MT.map_signature_item;
      module_type = MT.map;
      with_constraint = MT.map_with_constraint;
      class_declaration =
        (fun this -> CE.class_infos this (this.class_expr this));
      class_expr = CE.map;
      class_field = CE.map_field;
      class_structure = CE.map_structure;
      class_type = CT.map;
      class_type_field = CT.map_field;
      class_signature = CT.map_signature;
      class_type_declaration =
        (fun this -> CE.class_infos this (this.class_type this));
      class_description =
        (fun this -> CE.class_infos this (this.class_type this));
      type_declaration = T.map_type_declaration;
      type_kind = T.map_type_kind;
      typ = T.map;
      type_extension = T.map_type_extension;
      extension_constructor = T.map_extension_constructor;
      value_description =
        (fun this {pval_name; pval_type; pval_prim; pval_loc;
                   pval_attributes} ->
          Val.mk
            (map_loc this pval_name)
            (this.typ this pval_type)
            ~attrs:(this.attributes this pval_attributes)
            ~loc:(this.location this pval_loc)
            ~prim:pval_prim
        );

      pat = P.map;
      expr = E.map;

      module_declaration =
        (fun this {pmd_name; pmd_type; pmd_attributes; pmd_loc} ->
           Md.mk
             (map_loc this pmd_name)
             (this.module_type this pmd_type)
             ~attrs:(this.attributes this pmd_attributes)
             ~loc:(this.location this pmd_loc)
        );

      module_type_declaration =
        (fun this {pmtd_name; pmtd_type; pmtd_attributes; pmtd_loc} ->
           Mtd.mk
             (map_loc this pmtd_name)
             ?typ:(map_opt (this.module_type this) pmtd_type)
             ~attrs:(this.attributes this pmtd_attributes)
             ~loc:(this.location this pmtd_loc)
        );

      module_binding =
        (fun this {pmb_name; pmb_expr; pmb_attributes; pmb_loc} ->
           Mb.mk (map_loc this pmb_name) (this.module_expr this pmb_expr)
             ~attrs:(this.attributes this pmb_attributes)
             ~loc:(this.location this pmb_loc)
        );


      open_description =
        (fun this {popen_lid; popen_override; popen_attributes; popen_loc} ->
           Opn.mk (map_loc this popen_lid)
             ~override:popen_override
             ~loc:(this.location this popen_loc)
             ~attrs:(this.attributes this popen_attributes)
        );


      include_description =
        (fun this {pincl_mod; pincl_attributes; pincl_loc} ->
           Incl.mk (this.module_type this pincl_mod)
             ~loc:(this.location this pincl_loc)
             ~attrs:(this.attributes this pincl_attributes)
        );

      include_declaration =
        (fun this {pincl_mod; pincl_attributes; pincl_loc} ->
           Incl.mk (this.module_expr this pincl_mod)
             ~loc:(this.location this pincl_loc)
             ~attrs:(this.attributes this pincl_attributes)
        );


      value_binding =
        (fun this {pvb_pat; pvb_expr; pvb_attributes; pvb_loc} ->
           Vb.mk
             (this.pat this pvb_pat)
             (this.expr this pvb_expr)
             ~loc:(this.location this pvb_loc)
             ~attrs:(this.attributes this pvb_attributes)
        );


      constructor_declaration =
        (fun this {pcd_name; pcd_args; pcd_res; pcd_loc; pcd_attributes} ->
          Type.constructor
            (map_loc this pcd_name)
            ~args:(T.map_constructor_arguments this pcd_args)
            ?res:(map_opt (this.typ this) pcd_res)
            ~loc:(this.location this pcd_loc)
            ~attrs:(this.attributes this pcd_attributes)
        );

      label_declaration =
        (fun this {pld_name; pld_type; pld_loc; pld_mutable; pld_attributes} ->
           Type.field
             (map_loc this pld_name)
             (this.typ this pld_type)
             ~mut:pld_mutable
             ~loc:(this.location this pld_loc)
             ~attrs:(this.attributes this pld_attributes)
        );

      cases = (fun this l -> List.map (this.case this) l);
      case =
        (fun this {pc_lhs; pc_guard; pc_rhs} ->
           {
             pc_lhs = this.pat this pc_lhs;
             pc_guard = map_opt (this.expr this) pc_guard;
             pc_rhs = this.expr this pc_rhs;
           }
        );



      location = (fun _this l -> l);

      extension = (fun this (s, e) -> (map_loc this s, this.payload this e));
      attribute = (fun this (s, e) -> (map_loc this s, this.payload this e));
      attributes = (fun this l -> List.map (this.attribute this) l);
      payload =
        (fun this -> function
           | PStr x -> PStr (this.structure this x)
           | PSig x -> PSig (this.signature this x)
           | PTyp x -> PTyp (this.typ this x)
           | PPat (x, g) -> PPat (this.pat this x, map_opt (this.expr this) g)
        );
    }

  let rec extension_of_error {loc; msg; if_highlight; sub} =
    { loc; txt = "ocaml.error" },
    PStr ([Str.eval (Exp.constant (Pconst_string (msg, None)));
           Str.eval (Exp.constant (Pconst_string (if_highlight, None)))] @
          (List.map (fun ext -> Str.extension (extension_of_error ext)) sub))

  let attribute_of_warning loc s =
    { loc; txt = "ocaml.ppwarning" },
    PStr ([Str.eval ~loc (Exp.constant (Pconst_string (s, None)))])

end

module Outcometree = struct
  (* Module [Outcometree]: results displayed by the toplevel *)

  (* These types represent messages that the toplevel displays as normal
     results or errors. The real displaying is customisable using the hooks:
        [Toploop.print_out_value]
        [Toploop.print_out_type]
        [Toploop.print_out_sig_item]
        [Toploop.print_out_phrase] *)

  type out_ident              = Outcometree.out_ident    =
    | Oide_apply of out_ident * out_ident
    | Oide_dot of out_ident * string
    | Oide_ident of string

  type out_string              = Outcometree.out_string    =
    | Ostr_string
    | Ostr_bytes

  type out_attribute              = Outcometree.out_attribute    =
    { oattr_name: string }

  type out_value              = Outcometree.out_value    =
    | Oval_array of out_value list
    | Oval_char of char
    | Oval_constr of out_ident * out_value list
    | Oval_ellipsis
    | Oval_float of float
    | Oval_int of int
    | Oval_int32 of int32
    | Oval_int64 of int64
    | Oval_nativeint of nativeint
    | Oval_list of out_value list
    | Oval_printer of (Format.formatter -> unit)
    | Oval_record of (out_ident * out_value) list
    | Oval_string of string * int * out_string (* string, size-to-print, kind *)
    | Oval_stuff of string
    | Oval_tuple of out_value list
    | Oval_variant of string * out_value option

  type out_type              = Outcometree.out_type    =
    | Otyp_abstract
    | Otyp_open
    | Otyp_alias of out_type * string
    | Otyp_arrow of string * out_type * out_type
    | Otyp_class of bool * out_ident * out_type list
    | Otyp_constr of out_ident * out_type list
    | Otyp_manifest of out_type * out_type
    | Otyp_object of (string * out_type) list * bool option
    | Otyp_record of (string * bool * out_type) list
    | Otyp_stuff of string
    | Otyp_sum of (string * out_type list * out_type option) list
    | Otyp_tuple of out_type list
    | Otyp_var of bool * string
    | Otyp_variant of
        bool * out_variant * bool * (string list) option
    | Otyp_poly of string list * out_type
    | Otyp_module of string * string list * out_type list
    | Otyp_attribute of out_type * out_attribute

  and out_variant              = Outcometree.out_variant    =
    | Ovar_fields of (string * bool * out_type list) list
    | Ovar_typ of out_type

  type out_class_type              = Outcometree.out_class_type    =
    | Octy_constr of out_ident * out_type list
    | Octy_arrow of string * out_type * out_class_type
    | Octy_signature of out_type option * out_class_sig_item list
  and out_class_sig_item              = Outcometree.out_class_sig_item    =
    | Ocsg_constraint of out_type * out_type
    | Ocsg_method of string * bool * bool * out_type
    | Ocsg_value of string * bool * bool * out_type

  type out_module_type              = Outcometree.out_module_type    =
    | Omty_abstract
    | Omty_functor of string * out_module_type option * out_module_type
    | Omty_ident of out_ident
    | Omty_signature of out_sig_item list
    | Omty_alias of out_ident
  and out_sig_item              = Outcometree.out_sig_item    =
    | Osig_class of
        bool * string * (string * (bool * bool)) list * out_class_type *
          out_rec_status
    | Osig_class_type of
        bool * string * (string * (bool * bool)) list * out_class_type *
          out_rec_status
    | Osig_typext of out_extension_constructor * out_ext_status
    | Osig_modtype of string * out_module_type
    | Osig_module of string * out_module_type * out_rec_status
    | Osig_type of out_type_decl * out_rec_status
    | Osig_value of out_val_decl
    | Osig_ellipsis
  and out_type_decl              = Outcometree.out_type_decl    =
    { otype_name: string;
      otype_params: (string * (bool * bool)) list;
      otype_type: out_type;
      otype_private: Asttypes.private_flag;
      otype_immediate: bool;
      otype_unboxed: bool;
      otype_cstrs: (out_type * out_type) list }
  and out_extension_constructor              = Outcometree.out_extension_constructor    =
    { oext_name: string;
      oext_type_name: string;
      oext_type_params: string list;
      oext_args: out_type list;
      oext_ret_type: out_type option;
      oext_private: Asttypes.private_flag }
  and out_type_extension              = Outcometree.out_type_extension    =
    { otyext_name: string;
      otyext_params: string list;
      otyext_constructors: (string * out_type list * out_type option) list;
      otyext_private: Asttypes.private_flag }
  and out_val_decl              = Outcometree.out_val_decl    =
    { oval_name: string;
      oval_type: out_type;
      oval_prims: string list;
      oval_attributes: out_attribute list }
  and out_rec_status              = Outcometree.out_rec_status    =
    | Orec_not
    | Orec_first
    | Orec_next
  and out_ext_status              = Outcometree.out_ext_status    =
    | Oext_first
    | Oext_next
    | Oext_exception

  type out_phrase              = Outcometree.out_phrase    =
    | Ophr_eval of out_value * out_type
    | Ophr_signature of (out_sig_item * out_value option) list
    | Ophr_exception of (exn * out_value)

end

module Config = struct
  let ast_impl_magic_number = "Caml1999M022"
  let ast_intf_magic_number = "Caml1999N022"
end

let map_signature mapper = mapper.Ast_mapper.signature mapper
let map_structure mapper = mapper.Ast_mapper.structure mapper

let shallow_identity =
  let id _ x = x in
  {
    Ast_mapper.
    structure               = id;
    structure_item          = id;
    module_expr             = id;
    signature               = id;
    signature_item          = id;
    module_type             = id;
    with_constraint         = id;
    class_declaration       = id;
    class_expr              = id;
    class_field             = id;
    class_structure         = id;
    class_type              = id;
    class_type_field        = id;
    class_signature         = id;
    class_type_declaration  = id;
    class_description       = id;
    type_declaration        = id;
    type_kind               = id;
    typ                     = id;
    type_extension          = id;
    extension_constructor   = id;
    value_description       = id;
    pat                     = id;
    expr                    = id;
    module_declaration      = id;
    module_type_declaration = id;
    module_binding          = id;
    open_description        = id;
    include_description     = id;
    include_declaration     = id;
    value_binding           = id;
    constructor_declaration = id;
    label_declaration       = id;
    cases                   = id;
    case                    = id;
    location                = id;
    extension               = id;
    attribute               = id;
    attributes              = id;
    payload                 = id;
  }

let failing_mapper =
  let fail _ _ =
    invalid_arg "failing_mapper: this mapper function should never get called"
  in
  {
    Ast_mapper.
    structure               = fail;
    structure_item          = fail;
    module_expr             = fail;
    signature               = fail;
    signature_item          = fail;
    module_type             = fail;
    with_constraint         = fail;
    class_declaration       = fail;
    class_expr              = fail;
    class_field             = fail;
    class_structure         = fail;
    class_type              = fail;
    class_type_field        = fail;
    class_signature         = fail;
    class_type_declaration  = fail;
    class_description       = fail;
    type_declaration        = fail;
    type_kind               = fail;
    typ                     = fail;
    type_extension          = fail;
    extension_constructor   = fail;
    value_description       = fail;
    pat                     = fail;
    expr                    = fail;
    module_declaration      = fail;
    module_type_declaration = fail;
    module_binding          = fail;
    open_description        = fail;
    include_description     = fail;
    include_declaration     = fail;
    value_binding           = fail;
    constructor_declaration = fail;
    label_declaration       = fail;
    cases                   = fail;
    case                    = fail;
    location                = fail;
    extension               = fail;
    attribute               = fail;
    attributes              = fail;
    payload                 = fail;
  }

let make_top_mapper ~signature ~structure =
  {failing_mapper with Ast_mapper.
                    signature = (fun _ x -> signature x);
                    structure = (fun _ x -> structure x) }

end
module Migrate_parsetree_402_403_migrate
= struct
#1 "migrate_parsetree_402_403_migrate.ml"
# 1 "src/migrate_parsetree_402_403_migrate.ml"
(**************************************************************************)
(*                                                                        *)
(*                         OCaml Migrate Parsetree                        *)
(*                                                                        *)
(*                             Frédéric Bour                              *)
(*                         Alain Frisch, LexiFi                           *)
(*                                                                        *)
(*   Copyright 2017 Institut National de Recherche en Informatique et     *)
(*     en Automatique (INRIA).                                            *)
(*                                                                        *)
(*   All rights reserved.  This file is distributed under the terms of    *)
(*   the GNU Lesser General Public License version 2.1, with the          *)
(*   special exception on linking described in the file LICENSE.          *)
(*                                                                        *)
(**************************************************************************)

module From = Ast_402
module To = Ast_403

let extract_predef_option label typ =
  let open From in
  let open Longident in
  match label, typ.Parsetree.ptyp_desc with
  | To.Asttypes.Optional _,
    From.Parsetree.Ptyp_constr (
      {Location.txt = Ldot (Lident "*predef*", "option"); _}, [d]) ->
      d
  | _ -> typ

let rec copy_expression :
  From.Parsetree.expression ->
    To.Parsetree.expression
  =
  fun
    { From.Parsetree.pexp_desc = pexp_desc;
      From.Parsetree.pexp_loc = pexp_loc;
      From.Parsetree.pexp_attributes = pexp_attributes }
     ->
    {
      To.Parsetree.pexp_desc =
        (copy_expression_desc pexp_desc);
      To.Parsetree.pexp_loc =
        (copy_location pexp_loc);
      To.Parsetree.pexp_attributes =
        (copy_attributes pexp_attributes)
    }

and copy_expression_desc :
  From.Parsetree.expression_desc ->
    To.Parsetree.expression_desc
  =
  function
  | From.Parsetree.Pexp_ident x0 ->
      To.Parsetree.Pexp_ident
        (copy_loc copy_longident
           x0)
  | From.Parsetree.Pexp_constant x0 ->
      To.Parsetree.Pexp_constant
        (copy_constant x0)
  | From.Parsetree.Pexp_let (x0,x1,x2) ->
      To.Parsetree.Pexp_let
        ((copy_rec_flag x0),
          (List.map copy_value_binding x1),
          (copy_expression x2))
  | From.Parsetree.Pexp_function x0 ->
      To.Parsetree.Pexp_function
        (List.map copy_case x0)
  | From.Parsetree.Pexp_fun (x0,x1,x2,x3) ->
      To.Parsetree.Pexp_fun
        ((copy_arg_label x0),
          (copy_option copy_expression x1),
          (copy_pattern x2),
          (copy_expression x3))
  | From.Parsetree.Pexp_apply (x0,x1) ->
      To.Parsetree.Pexp_apply
        ((copy_expression x0),
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                ((copy_arg_label x0),
                  (copy_expression x1))) x1))
  | From.Parsetree.Pexp_match (x0,x1) ->
      To.Parsetree.Pexp_match
        ((copy_expression x0),
          (List.map copy_case x1))
  | From.Parsetree.Pexp_try (x0,x1) ->
      To.Parsetree.Pexp_try
        ((copy_expression x0),
          (List.map copy_case x1))
  | From.Parsetree.Pexp_tuple x0 ->
      To.Parsetree.Pexp_tuple
        (List.map copy_expression x0)
  | From.Parsetree.Pexp_construct (x0,x1) ->
      To.Parsetree.Pexp_construct
        ((copy_loc
            copy_longident x0),
          (copy_option copy_expression x1))
  | From.Parsetree.Pexp_variant (x0,x1) ->
      To.Parsetree.Pexp_variant
        ((copy_label x0),
          (copy_option copy_expression x1))
  | From.Parsetree.Pexp_record (x0,x1) ->
      To.Parsetree.Pexp_record
        ((List.map
            (fun x  ->
               let (x0,x1) = x  in
               ((copy_loc
                   copy_longident x0),
                 (copy_expression x1))) x0),
          (copy_option copy_expression x1))
  | From.Parsetree.Pexp_field (x0,x1) ->
      To.Parsetree.Pexp_field
        ((copy_expression x0),
          (copy_loc
             copy_longident x1))
  | From.Parsetree.Pexp_setfield (x0,x1,x2) ->
      To.Parsetree.Pexp_setfield
        ((copy_expression x0),
          (copy_loc
             copy_longident x1),
          (copy_expression x2))
  | From.Parsetree.Pexp_array x0 ->
      To.Parsetree.Pexp_array
        (List.map copy_expression x0)
  | From.Parsetree.Pexp_ifthenelse (x0,x1,x2) ->
      To.Parsetree.Pexp_ifthenelse
        ((copy_expression x0),
          (copy_expression x1),
          (copy_option copy_expression x2))
  | From.Parsetree.Pexp_sequence (x0,x1) ->
      To.Parsetree.Pexp_sequence
        ((copy_expression x0),
          (copy_expression x1))
  | From.Parsetree.Pexp_while (x0,x1) ->
      To.Parsetree.Pexp_while
        ((copy_expression x0),
          (copy_expression x1))
  | From.Parsetree.Pexp_for (x0,x1,x2,x3,x4) ->
      To.Parsetree.Pexp_for
        ((copy_pattern x0),
          (copy_expression x1),
          (copy_expression x2),
          (copy_direction_flag x3),
          (copy_expression x4))
  | From.Parsetree.Pexp_constraint (x0,x1) ->
      To.Parsetree.Pexp_constraint
        ((copy_expression x0),
          (copy_core_type x1))
  | From.Parsetree.Pexp_coerce (x0,x1,x2) ->
      To.Parsetree.Pexp_coerce
        ((copy_expression x0),
          (copy_option copy_core_type x1),
          (copy_core_type x2))
  | From.Parsetree.Pexp_send (x0,x1) ->
      To.Parsetree.Pexp_send
        ((copy_expression x0), x1)
  | From.Parsetree.Pexp_new x0 ->
      To.Parsetree.Pexp_new
        (copy_loc copy_longident
           x0)
  | From.Parsetree.Pexp_setinstvar (x0,x1) ->
      To.Parsetree.Pexp_setinstvar
        ((copy_loc (fun x  -> x) x0),
          (copy_expression x1))
  | From.Parsetree.Pexp_override x0 ->
      To.Parsetree.Pexp_override
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_loc (fun x  -> x) x0),
                (copy_expression x1))) x0)
  | From.Parsetree.Pexp_letmodule (x0,x1,x2) ->
      To.Parsetree.Pexp_letmodule
        ((copy_loc (fun x  -> x) x0),
          (copy_module_expr x1),
          (copy_expression x2))
  | From.Parsetree.Pexp_assert x0 ->
      To.Parsetree.Pexp_assert
        (copy_expression x0)
  | From.Parsetree.Pexp_lazy x0 ->
      To.Parsetree.Pexp_lazy
        (copy_expression x0)
  | From.Parsetree.Pexp_poly (x0,x1) ->
      To.Parsetree.Pexp_poly
        ((copy_expression x0),
          (copy_option copy_core_type x1))
  | From.Parsetree.Pexp_object x0 ->
      To.Parsetree.Pexp_object
        (copy_class_structure x0)
  | From.Parsetree.Pexp_newtype (x0,x1) ->
      To.Parsetree.Pexp_newtype
        (x0, (copy_expression x1))
  | From.Parsetree.Pexp_pack x0 ->
      To.Parsetree.Pexp_pack
        (copy_module_expr x0)
  | From.Parsetree.Pexp_open (x0,x1,x2) ->
      To.Parsetree.Pexp_open
        ((copy_override_flag x0),
          (copy_loc
             copy_longident x1),
          (copy_expression x2))
  | From.Parsetree.Pexp_extension x0 ->
      To.Parsetree.Pexp_extension
        (copy_extension x0)

and copy_direction_flag :
  From.Asttypes.direction_flag ->
    To.Asttypes.direction_flag
  =
  function
  | From.Asttypes.Upto  -> To.Asttypes.Upto
  | From.Asttypes.Downto  -> To.Asttypes.Downto

and copy_case :
  From.Parsetree.case -> To.Parsetree.case =
  fun
    { From.Parsetree.pc_lhs = pc_lhs;
      From.Parsetree.pc_guard = pc_guard;
      From.Parsetree.pc_rhs = pc_rhs }
     ->
    {
      To.Parsetree.pc_lhs =
        (copy_pattern pc_lhs);
      To.Parsetree.pc_guard =
        (copy_option copy_expression pc_guard);
      To.Parsetree.pc_rhs =
        (copy_expression pc_rhs)
    }

and copy_value_binding :
  From.Parsetree.value_binding ->
    To.Parsetree.value_binding
  =
  fun
    { From.Parsetree.pvb_pat = pvb_pat;
      From.Parsetree.pvb_expr = pvb_expr;
      From.Parsetree.pvb_attributes = pvb_attributes;
      From.Parsetree.pvb_loc = pvb_loc }
     ->
    {
      To.Parsetree.pvb_pat =
        (copy_pattern pvb_pat);
      To.Parsetree.pvb_expr =
        (copy_expression pvb_expr);
      To.Parsetree.pvb_attributes =
        (copy_attributes pvb_attributes);
      To.Parsetree.pvb_loc =
        (copy_location pvb_loc)
    }

and copy_pattern :
  From.Parsetree.pattern -> To.Parsetree.pattern =
  fun
    { From.Parsetree.ppat_desc = ppat_desc;
      From.Parsetree.ppat_loc = ppat_loc;
      From.Parsetree.ppat_attributes = ppat_attributes }
     ->
    {
      To.Parsetree.ppat_desc =
        (copy_pattern_desc ppat_desc);
      To.Parsetree.ppat_loc =
        (copy_location ppat_loc);
      To.Parsetree.ppat_attributes =
        (copy_attributes ppat_attributes)
    }

and copy_pattern_desc :
  From.Parsetree.pattern_desc ->
    To.Parsetree.pattern_desc
  =
  function
  | From.Parsetree.Ppat_any  ->
      To.Parsetree.Ppat_any
  | From.Parsetree.Ppat_var x0 ->
      To.Parsetree.Ppat_var
        (copy_loc (fun x  -> x) x0)
  | From.Parsetree.Ppat_alias (x0,x1) ->
      To.Parsetree.Ppat_alias
        ((copy_pattern x0),
          (copy_loc (fun x  -> x) x1))
  | From.Parsetree.Ppat_constant x0 ->
      To.Parsetree.Ppat_constant
        (copy_constant x0)
  | From.Parsetree.Ppat_interval (x0,x1) ->
      To.Parsetree.Ppat_interval
        ((copy_constant x0),
          (copy_constant x1))
  | From.Parsetree.Ppat_tuple x0 ->
      To.Parsetree.Ppat_tuple
        (List.map copy_pattern x0)
  | From.Parsetree.Ppat_construct (x0,x1) ->
      To.Parsetree.Ppat_construct
        ((copy_loc
            copy_longident x0),
          (copy_option copy_pattern x1))
  | From.Parsetree.Ppat_variant (x0,x1) ->
      To.Parsetree.Ppat_variant
        ((copy_label x0),
          (copy_option copy_pattern x1))
  | From.Parsetree.Ppat_record (x0,x1) ->
      To.Parsetree.Ppat_record
        ((List.map
            (fun x  ->
               let (x0,x1) = x  in
               ((copy_loc
                   copy_longident x0),
                 (copy_pattern x1))) x0),
          (copy_closed_flag x1))
  | From.Parsetree.Ppat_array x0 ->
      To.Parsetree.Ppat_array
        (List.map copy_pattern x0)
  | From.Parsetree.Ppat_or (x0,x1) ->
      To.Parsetree.Ppat_or
        ((copy_pattern x0),
          (copy_pattern x1))
  | From.Parsetree.Ppat_constraint (x0,x1) ->
      To.Parsetree.Ppat_constraint
        ((copy_pattern x0),
          (copy_core_type x1))
  | From.Parsetree.Ppat_type x0 ->
      To.Parsetree.Ppat_type
        (copy_loc copy_longident
           x0)
  | From.Parsetree.Ppat_lazy x0 ->
      To.Parsetree.Ppat_lazy
        (copy_pattern x0)
  | From.Parsetree.Ppat_unpack x0 ->
      To.Parsetree.Ppat_unpack
        (copy_loc (fun x  -> x) x0)
  | From.Parsetree.Ppat_exception x0 ->
      To.Parsetree.Ppat_exception
        (copy_pattern x0)
  | From.Parsetree.Ppat_extension x0 ->
      To.Parsetree.Ppat_extension
        (copy_extension x0)

and copy_core_type :
  From.Parsetree.core_type ->
    To.Parsetree.core_type
  =
  fun
    { From.Parsetree.ptyp_desc = ptyp_desc;
      From.Parsetree.ptyp_loc = ptyp_loc;
      From.Parsetree.ptyp_attributes = ptyp_attributes }
     ->
    {
      To.Parsetree.ptyp_desc =
        (copy_core_type_desc ptyp_desc);
      To.Parsetree.ptyp_loc =
        (copy_location ptyp_loc);
      To.Parsetree.ptyp_attributes =
        (copy_attributes ptyp_attributes)
    }

and copy_core_type_desc :
  From.Parsetree.core_type_desc ->
    To.Parsetree.core_type_desc
  =
  function
  | From.Parsetree.Ptyp_any  ->
      To.Parsetree.Ptyp_any
  | From.Parsetree.Ptyp_var x0 ->
      To.Parsetree.Ptyp_var x0
  | From.Parsetree.Ptyp_arrow (x0,x1,x2) ->
      let label = copy_arg_label x0 in
      To.Parsetree.Ptyp_arrow
        (label,
         copy_core_type (extract_predef_option label x1),
         copy_core_type x2)
  | From.Parsetree.Ptyp_tuple x0 ->
      To.Parsetree.Ptyp_tuple
        (List.map copy_core_type x0)
  | From.Parsetree.Ptyp_constr (x0,x1) ->
      To.Parsetree.Ptyp_constr
        ((copy_loc
            copy_longident x0),
          (List.map copy_core_type x1))
  | From.Parsetree.Ptyp_object (x0,x1) ->
      To.Parsetree.Ptyp_object
        ((List.map
            (fun x  ->
               let (x0,x1,x2) = x  in
               (x0, (copy_attributes x1),
                 (copy_core_type x2))) x0),
          (copy_closed_flag x1))
  | From.Parsetree.Ptyp_class (x0,x1) ->
      To.Parsetree.Ptyp_class
        ((copy_loc
            copy_longident x0),
          (List.map copy_core_type x1))
  | From.Parsetree.Ptyp_alias (x0,x1) ->
      To.Parsetree.Ptyp_alias
        ((copy_core_type x0), x1)
  | From.Parsetree.Ptyp_variant (x0,x1,x2) ->
      To.Parsetree.Ptyp_variant
        ((List.map copy_row_field x0),
          (copy_closed_flag x1),
          (copy_option
             (fun x  -> List.map copy_label x) x2))
  | From.Parsetree.Ptyp_poly (x0,x1) ->
      To.Parsetree.Ptyp_poly
        ((List.map (fun x  -> x) x0),
          (copy_core_type x1))
  | From.Parsetree.Ptyp_package x0 ->
      To.Parsetree.Ptyp_package
        (copy_package_type x0)
  | From.Parsetree.Ptyp_extension x0 ->
      To.Parsetree.Ptyp_extension
        (copy_extension x0)

and copy_package_type :
  From.Parsetree.package_type ->
    To.Parsetree.package_type
  =
  fun x  ->
    let (x0,x1) = x  in
    ((copy_loc copy_longident x0),
      (List.map
         (fun x  ->
            let (x0,x1) = x  in
            ((copy_loc
                copy_longident x0),
              (copy_core_type x1))) x1))

and copy_row_field :
  From.Parsetree.row_field ->
    To.Parsetree.row_field
  =
  function
  | From.Parsetree.Rtag (x0,x1,x2,x3) ->
      To.Parsetree.Rtag
        ((copy_label x0),
          (copy_attributes x1), (copy_bool x2),
          (List.map copy_core_type x3))
  | From.Parsetree.Rinherit x0 ->
      To.Parsetree.Rinherit
        (copy_core_type x0)

and copy_attributes :
  From.Parsetree.attributes ->
    To.Parsetree.attributes
  = fun x  -> List.map copy_attribute x

and copy_attribute :
  From.Parsetree.attribute ->
    To.Parsetree.attribute
  =
  fun x  ->
    let (x0,x1) = x  in
    ((copy_loc (fun x  -> x) x0),
      (copy_payload x1))

and copy_payload :
  From.Parsetree.payload -> To.Parsetree.payload =
  function
  | From.Parsetree.PStr x0 ->
      To.Parsetree.PStr
        (copy_structure x0)
  | From.Parsetree.PTyp x0 ->
      To.Parsetree.PTyp
        (copy_core_type x0)
  | From.Parsetree.PPat (x0,x1) ->
      To.Parsetree.PPat
        ((copy_pattern x0),
          (copy_option copy_expression x1))

and copy_structure :
  From.Parsetree.structure ->
    To.Parsetree.structure
  = fun x  -> List.map copy_structure_item x

and copy_structure_item :
  From.Parsetree.structure_item ->
    To.Parsetree.structure_item
  =
  fun
    { From.Parsetree.pstr_desc = pstr_desc;
      From.Parsetree.pstr_loc = pstr_loc }
     ->
    {
      To.Parsetree.pstr_desc =
        (copy_structure_item_desc pstr_desc);
      To.Parsetree.pstr_loc =
        (copy_location pstr_loc)
    }

and copy_structure_item_desc :
  From.Parsetree.structure_item_desc ->
    To.Parsetree.structure_item_desc
  =
  function
  | From.Parsetree.Pstr_eval (x0,x1) ->
      To.Parsetree.Pstr_eval
        ((copy_expression x0),
          (copy_attributes x1))
  | From.Parsetree.Pstr_value (x0,x1) ->
      To.Parsetree.Pstr_value
        ((copy_rec_flag x0),
          (List.map copy_value_binding x1))
  | From.Parsetree.Pstr_primitive x0 ->
      To.Parsetree.Pstr_primitive
        (copy_value_description x0)
  | From.Parsetree.Pstr_type x0 ->
      let recflag, types = type_declarations x0 in
      To.Parsetree.Pstr_type (recflag, types)
  | From.Parsetree.Pstr_typext x0 ->
      To.Parsetree.Pstr_typext
        (copy_type_extension x0)
  | From.Parsetree.Pstr_exception x0 ->
      To.Parsetree.Pstr_exception
        (copy_extension_constructor x0)
  | From.Parsetree.Pstr_module x0 ->
      To.Parsetree.Pstr_module
        (copy_module_binding x0)
  | From.Parsetree.Pstr_recmodule x0 ->
      To.Parsetree.Pstr_recmodule
        (List.map copy_module_binding x0)
  | From.Parsetree.Pstr_modtype x0 ->
      To.Parsetree.Pstr_modtype
        (copy_module_type_declaration x0)
  | From.Parsetree.Pstr_open x0 ->
      To.Parsetree.Pstr_open
        (copy_open_description x0)
  | From.Parsetree.Pstr_class x0 ->
      To.Parsetree.Pstr_class
        (List.map copy_class_declaration x0)
  | From.Parsetree.Pstr_class_type x0 ->
      To.Parsetree.Pstr_class_type
        (List.map copy_class_type_declaration x0)
  | From.Parsetree.Pstr_include x0 ->
      To.Parsetree.Pstr_include
        (copy_include_declaration x0)
  | From.Parsetree.Pstr_attribute x0 ->
      To.Parsetree.Pstr_attribute
        (copy_attribute x0)
  | From.Parsetree.Pstr_extension (x0,x1) ->
      To.Parsetree.Pstr_extension
        ((copy_extension x0),
          (copy_attributes x1))

and copy_include_declaration :
  From.Parsetree.include_declaration ->
    To.Parsetree.include_declaration
  =
  fun x  ->
    copy_include_infos
      copy_module_expr x

and copy_class_declaration :
  From.Parsetree.class_declaration ->
    To.Parsetree.class_declaration
  =
  fun x  ->
    copy_class_infos
      copy_class_expr x

and copy_class_expr :
  From.Parsetree.class_expr ->
    To.Parsetree.class_expr
  =
  fun
    { From.Parsetree.pcl_desc = pcl_desc;
      From.Parsetree.pcl_loc = pcl_loc;
      From.Parsetree.pcl_attributes = pcl_attributes }
     ->
    {
      To.Parsetree.pcl_desc =
        (copy_class_expr_desc pcl_desc);
      To.Parsetree.pcl_loc =
        (copy_location pcl_loc);
      To.Parsetree.pcl_attributes =
        (copy_attributes pcl_attributes)
    }

and copy_class_expr_desc :
  From.Parsetree.class_expr_desc ->
    To.Parsetree.class_expr_desc
  =
  function
  | From.Parsetree.Pcl_constr (x0,x1) ->
      To.Parsetree.Pcl_constr
        ((copy_loc
            copy_longident x0),
          (List.map copy_core_type x1))
  | From.Parsetree.Pcl_structure x0 ->
      To.Parsetree.Pcl_structure
        (copy_class_structure x0)
  | From.Parsetree.Pcl_fun (x0,x1,x2,x3) ->
      To.Parsetree.Pcl_fun
        ((copy_arg_label x0),
          (copy_option copy_expression x1),
          (copy_pattern x2),
          (copy_class_expr x3))
  | From.Parsetree.Pcl_apply (x0,x1) ->
      To.Parsetree.Pcl_apply
        ((copy_class_expr x0),
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                ((copy_arg_label x0),
                  (copy_expression x1))) x1))
  | From.Parsetree.Pcl_let (x0,x1,x2) ->
      To.Parsetree.Pcl_let
        ((copy_rec_flag x0),
          (List.map copy_value_binding x1),
          (copy_class_expr x2))
  | From.Parsetree.Pcl_constraint (x0,x1) ->
      To.Parsetree.Pcl_constraint
        ((copy_class_expr x0),
          (copy_class_type x1))
  | From.Parsetree.Pcl_extension x0 ->
      To.Parsetree.Pcl_extension
        (copy_extension x0)

and copy_class_structure :
  From.Parsetree.class_structure ->
    To.Parsetree.class_structure
  =
  fun
    { From.Parsetree.pcstr_self = pcstr_self;
      From.Parsetree.pcstr_fields = pcstr_fields }
     ->
    {
      To.Parsetree.pcstr_self =
        (copy_pattern pcstr_self);
      To.Parsetree.pcstr_fields =
        (List.map copy_class_field pcstr_fields)
    }

and copy_class_field :
  From.Parsetree.class_field ->
    To.Parsetree.class_field
  =
  fun
    { From.Parsetree.pcf_desc = pcf_desc;
      From.Parsetree.pcf_loc = pcf_loc;
      From.Parsetree.pcf_attributes = pcf_attributes }
     ->
    {
      To.Parsetree.pcf_desc =
        (copy_class_field_desc pcf_desc);
      To.Parsetree.pcf_loc =
        (copy_location pcf_loc);
      To.Parsetree.pcf_attributes =
        (copy_attributes pcf_attributes)
    }

and copy_class_field_desc :
  From.Parsetree.class_field_desc ->
    To.Parsetree.class_field_desc
  =
  function
  | From.Parsetree.Pcf_inherit (x0,x1,x2) ->
      To.Parsetree.Pcf_inherit
        ((copy_override_flag x0),
          (copy_class_expr x1),
          (copy_option (fun x  -> x) x2))
  | From.Parsetree.Pcf_val x0 ->
      To.Parsetree.Pcf_val
        (let (x0,x1,x2) = x0  in
         ((copy_loc (fun x  -> x) x0),
           (copy_mutable_flag x1),
           (copy_class_field_kind x2)))
  | From.Parsetree.Pcf_method x0 ->
      To.Parsetree.Pcf_method
        (let (x0,x1,x2) = x0  in
         ((copy_loc (fun x  -> x) x0),
           (copy_private_flag x1),
           (copy_class_field_kind x2)))
  | From.Parsetree.Pcf_constraint x0 ->
      To.Parsetree.Pcf_constraint
        (let (x0,x1) = x0  in
         ((copy_core_type x0),
           (copy_core_type x1)))
  | From.Parsetree.Pcf_initializer x0 ->
      To.Parsetree.Pcf_initializer
        (copy_expression x0)
  | From.Parsetree.Pcf_attribute x0 ->
      To.Parsetree.Pcf_attribute
        (copy_attribute x0)
  | From.Parsetree.Pcf_extension x0 ->
      To.Parsetree.Pcf_extension
        (copy_extension x0)

and copy_class_field_kind :
  From.Parsetree.class_field_kind ->
    To.Parsetree.class_field_kind
  =
  function
  | From.Parsetree.Cfk_virtual x0 ->
      To.Parsetree.Cfk_virtual
        (copy_core_type x0)
  | From.Parsetree.Cfk_concrete (x0,x1) ->
      To.Parsetree.Cfk_concrete
        ((copy_override_flag x0),
          (copy_expression x1))

and copy_module_binding :
  From.Parsetree.module_binding ->
    To.Parsetree.module_binding
  =
  fun
    { From.Parsetree.pmb_name = pmb_name;
      From.Parsetree.pmb_expr = pmb_expr;
      From.Parsetree.pmb_attributes = pmb_attributes;
      From.Parsetree.pmb_loc = pmb_loc }
     ->
    {
      To.Parsetree.pmb_name =
        (copy_loc (fun x  -> x) pmb_name);
      To.Parsetree.pmb_expr =
        (copy_module_expr pmb_expr);
      To.Parsetree.pmb_attributes =
        (copy_attributes pmb_attributes);
      To.Parsetree.pmb_loc =
        (copy_location pmb_loc)
    }

and copy_module_expr :
  From.Parsetree.module_expr ->
    To.Parsetree.module_expr
  =
  fun
    { From.Parsetree.pmod_desc = pmod_desc;
      From.Parsetree.pmod_loc = pmod_loc;
      From.Parsetree.pmod_attributes = pmod_attributes }
     ->
    {
      To.Parsetree.pmod_desc =
        (copy_module_expr_desc pmod_desc);
      To.Parsetree.pmod_loc =
        (copy_location pmod_loc);
      To.Parsetree.pmod_attributes =
        (copy_attributes pmod_attributes)
    }

and copy_module_expr_desc :
  From.Parsetree.module_expr_desc ->
    To.Parsetree.module_expr_desc
  =
  function
  | From.Parsetree.Pmod_ident x0 ->
      To.Parsetree.Pmod_ident
        (copy_loc copy_longident
           x0)
  | From.Parsetree.Pmod_structure x0 ->
      To.Parsetree.Pmod_structure
        (copy_structure x0)
  | From.Parsetree.Pmod_functor (x0,x1,x2) ->
      To.Parsetree.Pmod_functor
        ((copy_loc (fun x  -> x) x0),
          (copy_option copy_module_type x1),
          (copy_module_expr x2))
  | From.Parsetree.Pmod_apply (x0,x1) ->
      To.Parsetree.Pmod_apply
        ((copy_module_expr x0),
          (copy_module_expr x1))
  | From.Parsetree.Pmod_constraint (x0,x1) ->
      To.Parsetree.Pmod_constraint
        ((copy_module_expr x0),
          (copy_module_type x1))
  | From.Parsetree.Pmod_unpack x0 ->
      To.Parsetree.Pmod_unpack
        (copy_expression x0)
  | From.Parsetree.Pmod_extension x0 ->
      To.Parsetree.Pmod_extension
        (copy_extension x0)

and copy_module_type :
  From.Parsetree.module_type ->
    To.Parsetree.module_type
  =
  fun
    { From.Parsetree.pmty_desc = pmty_desc;
      From.Parsetree.pmty_loc = pmty_loc;
      From.Parsetree.pmty_attributes = pmty_attributes }
     ->
    {
      To.Parsetree.pmty_desc =
        (copy_module_type_desc pmty_desc);
      To.Parsetree.pmty_loc =
        (copy_location pmty_loc);
      To.Parsetree.pmty_attributes =
        (copy_attributes pmty_attributes)
    }

and copy_module_type_desc :
  From.Parsetree.module_type_desc ->
    To.Parsetree.module_type_desc
  =
  function
  | From.Parsetree.Pmty_ident x0 ->
      To.Parsetree.Pmty_ident
        (copy_loc copy_longident
           x0)
  | From.Parsetree.Pmty_signature x0 ->
      To.Parsetree.Pmty_signature
        (copy_signature x0)
  | From.Parsetree.Pmty_functor (x0,x1,x2) ->
      To.Parsetree.Pmty_functor
        ((copy_loc (fun x  -> x) x0),
          (copy_option copy_module_type x1),
          (copy_module_type x2))
  | From.Parsetree.Pmty_with (x0,x1) ->
      To.Parsetree.Pmty_with
        ((copy_module_type x0),
          (List.map copy_with_constraint x1))
  | From.Parsetree.Pmty_typeof x0 ->
      To.Parsetree.Pmty_typeof
        (copy_module_expr x0)
  | From.Parsetree.Pmty_extension x0 ->
      To.Parsetree.Pmty_extension
        (copy_extension x0)
  | From.Parsetree.Pmty_alias x0 ->
      To.Parsetree.Pmty_alias
        (copy_loc copy_longident
           x0)

and copy_with_constraint :
  From.Parsetree.with_constraint ->
    To.Parsetree.with_constraint
  =
  function
  | From.Parsetree.Pwith_type (x0,x1) ->
      To.Parsetree.Pwith_type
        ((copy_loc
            copy_longident x0),
          (copy_type_declaration x1))
  | From.Parsetree.Pwith_module (x0,x1) ->
      To.Parsetree.Pwith_module
        ((copy_loc
            copy_longident x0),
          (copy_loc
             copy_longident x1))
  | From.Parsetree.Pwith_typesubst x0 ->
      To.Parsetree.Pwith_typesubst
        (copy_type_declaration x0)
  | From.Parsetree.Pwith_modsubst (x0,x1) ->
      To.Parsetree.Pwith_modsubst
        ((copy_loc (fun x  -> x) x0),
          (copy_loc
             copy_longident x1))

and copy_signature :
  From.Parsetree.signature ->
    To.Parsetree.signature
  = fun x  -> List.map copy_signature_item x

and copy_signature_item :
  From.Parsetree.signature_item ->
    To.Parsetree.signature_item
  =
  fun
    { From.Parsetree.psig_desc = psig_desc;
      From.Parsetree.psig_loc = psig_loc }
     ->
    {
      To.Parsetree.psig_desc =
        (copy_signature_item_desc psig_desc);
      To.Parsetree.psig_loc =
        (copy_location psig_loc)
    }

and copy_signature_item_desc :
  From.Parsetree.signature_item_desc ->
    To.Parsetree.signature_item_desc
  =
  function
  | From.Parsetree.Psig_value x0 ->
      To.Parsetree.Psig_value
        (copy_value_description x0)
  | From.Parsetree.Psig_type x0 ->
      let recflag, types = type_declarations x0 in
      To.Parsetree.Psig_type (recflag, types)
  | From.Parsetree.Psig_typext x0 ->
      To.Parsetree.Psig_typext
        (copy_type_extension x0)
  | From.Parsetree.Psig_exception x0 ->
      To.Parsetree.Psig_exception
        (copy_extension_constructor x0)
  | From.Parsetree.Psig_module x0 ->
      To.Parsetree.Psig_module
        (copy_module_declaration x0)
  | From.Parsetree.Psig_recmodule x0 ->
      To.Parsetree.Psig_recmodule
        (List.map copy_module_declaration x0)
  | From.Parsetree.Psig_modtype x0 ->
      To.Parsetree.Psig_modtype
        (copy_module_type_declaration x0)
  | From.Parsetree.Psig_open x0 ->
      To.Parsetree.Psig_open
        (copy_open_description x0)
  | From.Parsetree.Psig_include x0 ->
      To.Parsetree.Psig_include
        (copy_include_description x0)
  | From.Parsetree.Psig_class x0 ->
      To.Parsetree.Psig_class
        (List.map copy_class_description x0)
  | From.Parsetree.Psig_class_type x0 ->
      To.Parsetree.Psig_class_type
        (List.map copy_class_type_declaration x0)
  | From.Parsetree.Psig_attribute x0 ->
      To.Parsetree.Psig_attribute
        (copy_attribute x0)
  | From.Parsetree.Psig_extension (x0,x1) ->
      To.Parsetree.Psig_extension
        ((copy_extension x0),
          (copy_attributes x1))

and copy_class_type_declaration :
  From.Parsetree.class_type_declaration ->
    To.Parsetree.class_type_declaration
  =
  fun x  ->
    copy_class_infos
      copy_class_type x

and copy_class_description :
  From.Parsetree.class_description ->
    To.Parsetree.class_description
  =
  fun x  ->
    copy_class_infos
      copy_class_type x

and copy_class_type :
  From.Parsetree.class_type ->
    To.Parsetree.class_type
  =
  fun
    { From.Parsetree.pcty_desc = pcty_desc;
      From.Parsetree.pcty_loc = pcty_loc;
      From.Parsetree.pcty_attributes = pcty_attributes }
     ->
    {
      To.Parsetree.pcty_desc =
        (copy_class_type_desc pcty_desc);
      To.Parsetree.pcty_loc =
        (copy_location pcty_loc);
      To.Parsetree.pcty_attributes =
        (copy_attributes pcty_attributes)
    }

and copy_class_type_desc :
  From.Parsetree.class_type_desc ->
    To.Parsetree.class_type_desc
  =
  function
  | From.Parsetree.Pcty_constr (x0,x1) ->
      To.Parsetree.Pcty_constr
        ((copy_loc
            copy_longident x0),
          (List.map copy_core_type x1))
  | From.Parsetree.Pcty_signature x0 ->
      To.Parsetree.Pcty_signature
        (copy_class_signature x0)
  | From.Parsetree.Pcty_arrow (x0,x1,x2) ->
      let label = copy_arg_label x0 in
      To.Parsetree.Pcty_arrow
        (label,
         copy_core_type (extract_predef_option label x1),
         copy_class_type x2)
  | From.Parsetree.Pcty_extension x0 ->
      To.Parsetree.Pcty_extension
        (copy_extension x0)

and copy_class_signature :
  From.Parsetree.class_signature ->
    To.Parsetree.class_signature
  =
  fun
    { From.Parsetree.pcsig_self = pcsig_self;
      From.Parsetree.pcsig_fields = pcsig_fields }
     ->
    {
      To.Parsetree.pcsig_self =
        (copy_core_type pcsig_self);
      To.Parsetree.pcsig_fields =
        (List.map copy_class_type_field
           pcsig_fields)
    }

and copy_class_type_field :
  From.Parsetree.class_type_field ->
    To.Parsetree.class_type_field
  =
  fun
    { From.Parsetree.pctf_desc = pctf_desc;
      From.Parsetree.pctf_loc = pctf_loc;
      From.Parsetree.pctf_attributes = pctf_attributes }
     ->
    {
      To.Parsetree.pctf_desc =
        (copy_class_type_field_desc pctf_desc);
      To.Parsetree.pctf_loc =
        (copy_location pctf_loc);
      To.Parsetree.pctf_attributes =
        (copy_attributes pctf_attributes)
    }

and copy_class_type_field_desc :
  From.Parsetree.class_type_field_desc ->
    To.Parsetree.class_type_field_desc
  =
  function
  | From.Parsetree.Pctf_inherit x0 ->
      To.Parsetree.Pctf_inherit
        (copy_class_type x0)
  | From.Parsetree.Pctf_val x0 ->
      To.Parsetree.Pctf_val
        (let (x0,x1,x2,x3) = x0  in
         (x0, (copy_mutable_flag x1),
           (copy_virtual_flag x2),
           (copy_core_type x3)))
  | From.Parsetree.Pctf_method x0 ->
      To.Parsetree.Pctf_method
        (let (x0,x1,x2,x3) = x0  in
         (x0, (copy_private_flag x1),
           (copy_virtual_flag x2),
           (copy_core_type x3)))
  | From.Parsetree.Pctf_constraint x0 ->
      To.Parsetree.Pctf_constraint
        (let (x0,x1) = x0  in
         ((copy_core_type x0),
           (copy_core_type x1)))
  | From.Parsetree.Pctf_attribute x0 ->
      To.Parsetree.Pctf_attribute
        (copy_attribute x0)
  | From.Parsetree.Pctf_extension x0 ->
      To.Parsetree.Pctf_extension
        (copy_extension x0)

and copy_extension :
  From.Parsetree.extension ->
    To.Parsetree.extension
  =
  fun x  ->
    let (x0,x1) = x  in
    ((copy_loc (fun x  -> x) x0),
      (copy_payload x1))

and copy_class_infos :
  'f0 'g0 .
    ('f0 -> 'g0) ->
      'f0 From.Parsetree.class_infos ->
        'g0 To.Parsetree.class_infos
  =
  fun f0  ->
    fun
      { From.Parsetree.pci_virt = pci_virt;
        From.Parsetree.pci_params = pci_params;
        From.Parsetree.pci_name = pci_name;
        From.Parsetree.pci_expr = pci_expr;
        From.Parsetree.pci_loc = pci_loc;
        From.Parsetree.pci_attributes = pci_attributes }
       ->
      {
        To.Parsetree.pci_virt =
          (copy_virtual_flag pci_virt);
        To.Parsetree.pci_params =
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                ((copy_core_type x0),
                  (copy_variance x1))) pci_params);
        To.Parsetree.pci_name =
          (copy_loc (fun x  -> x) pci_name);
        To.Parsetree.pci_expr = (f0 pci_expr);
        To.Parsetree.pci_loc =
          (copy_location pci_loc);
        To.Parsetree.pci_attributes =
          (copy_attributes pci_attributes)
      }

and copy_virtual_flag :
  From.Asttypes.virtual_flag ->
    To.Asttypes.virtual_flag
  =
  function
  | From.Asttypes.Virtual  -> To.Asttypes.Virtual
  | From.Asttypes.Concrete  -> To.Asttypes.Concrete

and copy_include_description :
  From.Parsetree.include_description ->
    To.Parsetree.include_description
  =
  fun x  ->
    copy_include_infos
      copy_module_type x

and copy_include_infos :
  'f0 'g0 .
    ('f0 -> 'g0) ->
      'f0 From.Parsetree.include_infos ->
        'g0 To.Parsetree.include_infos
  =
  fun f0  ->
    fun
      { From.Parsetree.pincl_mod = pincl_mod;
        From.Parsetree.pincl_loc = pincl_loc;
        From.Parsetree.pincl_attributes = pincl_attributes }
       ->
      {
        To.Parsetree.pincl_mod = (f0 pincl_mod);
        To.Parsetree.pincl_loc =
          (copy_location pincl_loc);
        To.Parsetree.pincl_attributes =
          (copy_attributes pincl_attributes)
      }

and copy_open_description :
  From.Parsetree.open_description ->
    To.Parsetree.open_description
  =
  fun
    { From.Parsetree.popen_lid = popen_lid;
      From.Parsetree.popen_override = popen_override;
      From.Parsetree.popen_loc = popen_loc;
      From.Parsetree.popen_attributes = popen_attributes }
     ->
    {
      To.Parsetree.popen_lid =
        (copy_loc copy_longident
           popen_lid);
      To.Parsetree.popen_override =
        (copy_override_flag popen_override);
      To.Parsetree.popen_loc =
        (copy_location popen_loc);
      To.Parsetree.popen_attributes =
        (copy_attributes popen_attributes)
    }

and copy_override_flag :
  From.Asttypes.override_flag ->
    To.Asttypes.override_flag
  =
  function
  | From.Asttypes.Override  -> To.Asttypes.Override
  | From.Asttypes.Fresh  -> To.Asttypes.Fresh

and copy_module_type_declaration :
  From.Parsetree.module_type_declaration ->
    To.Parsetree.module_type_declaration
  =
  fun
    { From.Parsetree.pmtd_name = pmtd_name;
      From.Parsetree.pmtd_type = pmtd_type;
      From.Parsetree.pmtd_attributes = pmtd_attributes;
      From.Parsetree.pmtd_loc = pmtd_loc }
     ->
    {
      To.Parsetree.pmtd_name =
        (copy_loc (fun x  -> x) pmtd_name);
      To.Parsetree.pmtd_type =
        (copy_option copy_module_type pmtd_type);
      To.Parsetree.pmtd_attributes =
        (copy_attributes pmtd_attributes);
      To.Parsetree.pmtd_loc =
        (copy_location pmtd_loc)
    }

and copy_module_declaration :
  From.Parsetree.module_declaration ->
    To.Parsetree.module_declaration
  =
  fun
    { From.Parsetree.pmd_name = pmd_name;
      From.Parsetree.pmd_type = pmd_type;
      From.Parsetree.pmd_attributes = pmd_attributes;
      From.Parsetree.pmd_loc = pmd_loc }
     ->
    {
      To.Parsetree.pmd_name =
        (copy_loc (fun x  -> x) pmd_name);
      To.Parsetree.pmd_type =
        (copy_module_type pmd_type);
      To.Parsetree.pmd_attributes =
        (copy_attributes pmd_attributes);
      To.Parsetree.pmd_loc =
        (copy_location pmd_loc)
    }

and copy_type_extension :
  From.Parsetree.type_extension ->
    To.Parsetree.type_extension
  =
  fun
    { From.Parsetree.ptyext_path = ptyext_path;
      From.Parsetree.ptyext_params = ptyext_params;
      From.Parsetree.ptyext_constructors = ptyext_constructors;
      From.Parsetree.ptyext_private = ptyext_private;
      From.Parsetree.ptyext_attributes = ptyext_attributes }
     ->
    {
      To.Parsetree.ptyext_path =
        (copy_loc copy_longident
           ptyext_path);
      To.Parsetree.ptyext_params =
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_core_type x0),
                (copy_variance x1))) ptyext_params);
      To.Parsetree.ptyext_constructors =
        (List.map copy_extension_constructor
           ptyext_constructors);
      To.Parsetree.ptyext_private =
        (copy_private_flag ptyext_private);
      To.Parsetree.ptyext_attributes =
        (copy_attributes ptyext_attributes)
    }

and copy_extension_constructor :
  From.Parsetree.extension_constructor ->
    To.Parsetree.extension_constructor
  =
  fun
    { From.Parsetree.pext_name = pext_name;
      From.Parsetree.pext_kind = pext_kind;
      From.Parsetree.pext_loc = pext_loc;
      From.Parsetree.pext_attributes = pext_attributes }
     ->
    {
      To.Parsetree.pext_name =
        (copy_loc (fun x  -> x) pext_name);
      To.Parsetree.pext_kind =
        (copy_extension_constructor_kind pext_kind);
      To.Parsetree.pext_loc =
        (copy_location pext_loc);
      To.Parsetree.pext_attributes =
        (copy_attributes pext_attributes)
    }

and copy_extension_constructor_kind :
  From.Parsetree.extension_constructor_kind ->
    To.Parsetree.extension_constructor_kind
  =
  function
  | From.Parsetree.Pext_decl (x0,x1) ->
      To.Parsetree.Pext_decl
        (To.Parsetree.Pcstr_tuple (List.map copy_core_type x0),
          (copy_option copy_core_type x1))
  | From.Parsetree.Pext_rebind x0 ->
      To.Parsetree.Pext_rebind
        (copy_loc copy_longident
           x0)

and copy_type_declaration :
  From.Parsetree.type_declaration ->
    To.Parsetree.type_declaration
  =
  fun
    { From.Parsetree.ptype_name = ptype_name;
      From.Parsetree.ptype_params = ptype_params;
      From.Parsetree.ptype_cstrs = ptype_cstrs;
      From.Parsetree.ptype_kind = ptype_kind;
      From.Parsetree.ptype_private = ptype_private;
      From.Parsetree.ptype_manifest = ptype_manifest;
      From.Parsetree.ptype_attributes = ptype_attributes;
      From.Parsetree.ptype_loc = ptype_loc }
     ->
    {
      To.Parsetree.ptype_name =
        (copy_loc (fun x  -> x) ptype_name);
      To.Parsetree.ptype_params =
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_core_type x0),
                (copy_variance x1))) ptype_params);
      To.Parsetree.ptype_cstrs =
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              ((copy_core_type x0),
                (copy_core_type x1),
                (copy_location x2))) ptype_cstrs);
      To.Parsetree.ptype_kind =
        (copy_type_kind ptype_kind);
      To.Parsetree.ptype_private =
        (copy_private_flag ptype_private);
      To.Parsetree.ptype_manifest =
        (copy_option copy_core_type ptype_manifest);
      To.Parsetree.ptype_attributes =
        (copy_attributes ptype_attributes);
      To.Parsetree.ptype_loc =
        (copy_location ptype_loc)
    }

and copy_private_flag :
  From.Asttypes.private_flag ->
    To.Asttypes.private_flag
  =
  function
  | From.Asttypes.Private  -> To.Asttypes.Private
  | From.Asttypes.Public  -> To.Asttypes.Public

and copy_type_kind :
  From.Parsetree.type_kind ->
    To.Parsetree.type_kind
  =
  function
  | From.Parsetree.Ptype_abstract  ->
      To.Parsetree.Ptype_abstract
  | From.Parsetree.Ptype_variant x0 ->
      To.Parsetree.Ptype_variant
        (List.map copy_constructor_declaration x0)
  | From.Parsetree.Ptype_record x0 ->
      To.Parsetree.Ptype_record
        (List.map copy_label_declaration x0)
  | From.Parsetree.Ptype_open  ->
      To.Parsetree.Ptype_open

and copy_label_declaration :
  From.Parsetree.label_declaration ->
    To.Parsetree.label_declaration
  =
  fun
    { From.Parsetree.pld_name = pld_name;
      From.Parsetree.pld_mutable = pld_mutable;
      From.Parsetree.pld_type = pld_type;
      From.Parsetree.pld_loc = pld_loc;
      From.Parsetree.pld_attributes = pld_attributes }
     ->
    {
      To.Parsetree.pld_name =
        (copy_loc (fun x  -> x) pld_name);
      To.Parsetree.pld_mutable =
        (copy_mutable_flag pld_mutable);
      To.Parsetree.pld_type =
        (copy_core_type pld_type);
      To.Parsetree.pld_loc =
        (copy_location pld_loc);
      To.Parsetree.pld_attributes =
        (copy_attributes pld_attributes)
    }

and copy_mutable_flag :
  From.Asttypes.mutable_flag ->
    To.Asttypes.mutable_flag
  =
  function
  | From.Asttypes.Immutable  ->
      To.Asttypes.Immutable
  | From.Asttypes.Mutable  -> To.Asttypes.Mutable

and copy_constructor_declaration :
  From.Parsetree.constructor_declaration ->
    To.Parsetree.constructor_declaration
  =
  fun
    { From.Parsetree.pcd_name = pcd_name;
      From.Parsetree.pcd_args = pcd_args;
      From.Parsetree.pcd_res = pcd_res;
      From.Parsetree.pcd_loc = pcd_loc;
      From.Parsetree.pcd_attributes = pcd_attributes }
     ->
    {
      To.Parsetree.pcd_name =
        (copy_loc (fun x  -> x) pcd_name);
      To.Parsetree.pcd_args =
        To.Parsetree.Pcstr_tuple (List.map copy_core_type pcd_args);
      To.Parsetree.pcd_res =
        (copy_option copy_core_type pcd_res);
      To.Parsetree.pcd_loc =
        (copy_location pcd_loc);
      To.Parsetree.pcd_attributes =
        (copy_attributes pcd_attributes)
    }

and copy_variance :
  From.Asttypes.variance -> To.Asttypes.variance =
  function
  | From.Asttypes.Covariant  ->
      To.Asttypes.Covariant
  | From.Asttypes.Contravariant  ->
      To.Asttypes.Contravariant
  | From.Asttypes.Invariant  ->
      To.Asttypes.Invariant

and copy_value_description :
  From.Parsetree.value_description ->
    To.Parsetree.value_description
  =
  fun
    { From.Parsetree.pval_name = pval_name;
      From.Parsetree.pval_type = pval_type;
      From.Parsetree.pval_prim = pval_prim;
      From.Parsetree.pval_attributes = pval_attributes;
      From.Parsetree.pval_loc = pval_loc }
     ->
    {
      To.Parsetree.pval_name =
        (copy_loc (fun x  -> x) pval_name);
      To.Parsetree.pval_type =
        (copy_core_type pval_type);
      To.Parsetree.pval_prim =
        (List.map (fun x  -> x) pval_prim);
      To.Parsetree.pval_attributes =
        (copy_attributes pval_attributes);
      To.Parsetree.pval_loc =
        (copy_location pval_loc)
    }

and copy_closed_flag :
  From.Asttypes.closed_flag ->
    To.Asttypes.closed_flag
  =
  function
  | From.Asttypes.Closed  -> To.Asttypes.Closed
  | From.Asttypes.Open  -> To.Asttypes.Open

and copy_label :
  From.Asttypes.label -> To.Asttypes.label =
  fun x ->
    x

and copy_arg_label :
  From.Asttypes.label -> To.Asttypes.arg_label =
  fun x ->
    if x <> "" then
      if x.[0] = '?' then To.Asttypes.Optional (String.sub x 1 (String.length x - 1))
      else To.Asttypes.Labelled x
    else
      To.Asttypes.Nolabel



and copy_rec_flag :
  From.Asttypes.rec_flag -> To.Asttypes.rec_flag =
  function
  | From.Asttypes.Nonrecursive  ->
      To.Asttypes.Nonrecursive
  | From.Asttypes.Recursive  ->
      To.Asttypes.Recursive

and copy_constant :
  From.Asttypes.constant -> To.Parsetree.constant =
  function
  | From.Asttypes.Const_int x0 ->
      To.Parsetree.Pconst_integer (string_of_int x0, None)
  | From.Asttypes.Const_char x0 ->
      To.Parsetree.Pconst_char x0
  | From.Asttypes.Const_string (x0,x1) ->
      To.Parsetree.Pconst_string
        (x0, (copy_option (fun x  -> x) x1))
  | From.Asttypes.Const_float x0 ->
      To.Parsetree.Pconst_float (x0, None)
  | From.Asttypes.Const_int32 x0 ->
      To.Parsetree.Pconst_integer (Int32.to_string x0, Some 'l')
  | From.Asttypes.Const_int64 x0 ->
      To.Parsetree.Pconst_integer (Int64.to_string x0, Some 'L')
  | From.Asttypes.Const_nativeint x0 ->
      To.Parsetree.Pconst_integer (Nativeint.to_string x0, Some 'n')

and copy_option : 'f0 'g0 . ('f0 -> 'g0) -> 'f0 option -> 'g0 option =
  fun f0  -> function | None  -> None | Some x0 -> Some (f0 x0)

and copy_longident :
  From.Longident.t -> To.Longident.t =
  function
  | From.Longident.Lident x0 ->
      To.Longident.Lident x0
  | From.Longident.Ldot (x0,x1) ->
      To.Longident.Ldot ((copy_longident x0), x1)
  | From.Longident.Lapply (x0,x1) ->
      To.Longident.Lapply ((copy_longident x0), (copy_longident x1))

and copy_loc :
  'f0 'g0 .
    ('f0 -> 'g0) ->
      'f0 From.Asttypes.loc -> 'g0 To.Asttypes.loc
  =
  fun f0  ->
    fun
      { From.Asttypes.txt = txt;
        From.Asttypes.loc = loc }
       ->
      {
        To.Asttypes.txt = (f0 txt);
        To.Asttypes.loc = (copy_location loc)
      }

and copy_location :
  From.Location.t -> To.Location.t =
  fun
    { From.Location.loc_start = loc_start;
      From.Location.loc_end = loc_end;
      From.Location.loc_ghost = loc_ghost }
     ->
    {
      To.Location.loc_start = (copy_Lexing_position loc_start);
      To.Location.loc_end = (copy_Lexing_position loc_end);
      To.Location.loc_ghost = (copy_bool loc_ghost)
    }

and copy_bool : bool -> bool = function | false  -> false | true  -> true

and copy_Lexing_position : Lexing.position -> Lexing.position =
  fun
    { Lexing.pos_fname = pos_fname; Lexing.pos_lnum = pos_lnum;
      Lexing.pos_bol = pos_bol; Lexing.pos_cnum = pos_cnum }
     ->
    {
      Lexing.pos_fname = pos_fname;
      Lexing.pos_lnum = pos_lnum;
      Lexing.pos_bol = pos_bol;
      Lexing.pos_cnum = pos_cnum
    }

and type_declarations types =
  let is_nonrec (attr,_) = attr.To.Location.txt = "nonrec" in
  match List.map copy_type_declaration types with
  | (x :: xs)
    when List.exists is_nonrec x.To.Parsetree.ptype_attributes ->
      let ptype_attributes =
        List.filter (fun x -> not (is_nonrec x)) x.To.Parsetree.ptype_attributes
      in
      (To.Asttypes.Nonrecursive,
       {x with To.Parsetree.ptype_attributes} :: xs)
  | types -> (To.Asttypes.Recursive, types)

let rec copy_out_phrase :
  From.Outcometree.out_phrase -> To.Outcometree.out_phrase =
  function
  | From.Outcometree.Ophr_eval (x0,x1) ->
      To.Outcometree.Ophr_eval
        ((copy_out_value x0),
          (copy_out_type x1))
  | From.Outcometree.Ophr_signature x0 ->
      To.Outcometree.Ophr_signature
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_out_sig_item x0),
                (copy_option copy_out_value x1))) x0)
  | From.Outcometree.Ophr_exception x0 ->
      To.Outcometree.Ophr_exception
        (let (x0,x1) = x0  in
         ((copy_exn x0), (copy_out_value x1)))

and copy_exn : exn -> exn = fun x  -> x

and copy_out_sig_item :
  From.Outcometree.out_sig_item -> To.Outcometree.out_sig_item =
  function
  | From.Outcometree.Osig_class (x0,x1,x2,x3,x4) ->
      To.Outcometree.Osig_class
        ((copy_bool x0), x1,
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                (x0, (let (x0,x1) = x1  in ((copy_bool x0), (copy_bool x1)))))
             x2), (copy_out_class_type x3),
          (copy_out_rec_status x4))
  | From.Outcometree.Osig_class_type (x0,x1,x2,x3,x4) ->
      To.Outcometree.Osig_class_type
        ((copy_bool x0), x1,
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                (x0, (let (x0,x1) = x1  in ((copy_bool x0), (copy_bool x1)))))
             x2), (copy_out_class_type x3),
          (copy_out_rec_status x4))
  | From.Outcometree.Osig_typext (x0,x1) ->
      To.Outcometree.Osig_typext
        ((copy_out_extension_constructor x0),
          (copy_out_ext_status x1))
  | From.Outcometree.Osig_modtype (x0,x1) ->
      To.Outcometree.Osig_modtype
        (x0, (copy_out_module_type x1))
  | From.Outcometree.Osig_module (x0,x1,x2) ->
      To.Outcometree.Osig_module
        (x0, (copy_out_module_type x1),
          (copy_out_rec_status x2))
  | From.Outcometree.Osig_type (x0,x1) ->
      To.Outcometree.Osig_type
        ((copy_out_type_decl x0),
          (copy_out_rec_status x1))
  | From.Outcometree.Osig_value (x0,x1,x2) ->
      To.Outcometree.Osig_value { To.Outcometree.
                                  oval_name = x0;
                                  oval_type = copy_out_type x1;
                                  oval_prims = List.map (fun x -> x) x2;
                                  oval_attributes = [] }

and copy_out_type_decl :
  From.Outcometree.out_type_decl -> To.Outcometree.out_type_decl =
  fun
    { From.Outcometree.otype_name = otype_name;
      From.Outcometree.otype_params = otype_params;
      From.Outcometree.otype_type = otype_type;
      From.Outcometree.otype_private = otype_private;
      From.Outcometree.otype_cstrs = otype_cstrs }
     ->
    {
      To.Outcometree.otype_name = otype_name;
      To.Outcometree.otype_params =
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              (x0, (let (x0,x1) = x1  in ((copy_bool x0), (copy_bool x1)))))
           otype_params);
      To.Outcometree.otype_type =
        (copy_out_type otype_type);
      To.Outcometree.otype_private =
        (copy_private_flag otype_private);
      To.Outcometree.otype_cstrs =
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_out_type x0),
               (copy_out_type x1))) otype_cstrs);
      To.Outcometree.otype_immediate = false;
    }

and copy_out_module_type :
  From.Outcometree.out_module_type -> To.Outcometree.out_module_type
  =
  function
  | From.Outcometree.Omty_abstract  -> To.Outcometree.Omty_abstract
  | From.Outcometree.Omty_functor (x0,x1,x2) ->
      To.Outcometree.Omty_functor
        (x0, (copy_option copy_out_module_type x1),
          (copy_out_module_type x2))
  | From.Outcometree.Omty_ident x0 ->
      To.Outcometree.Omty_ident (copy_out_ident x0)
  | From.Outcometree.Omty_signature x0 ->
      To.Outcometree.Omty_signature
        (List.map copy_out_sig_item x0)
  | From.Outcometree.Omty_alias x0 ->
      To.Outcometree.Omty_alias (copy_out_ident x0)

and copy_out_ext_status :
  From.Outcometree.out_ext_status -> To.Outcometree.out_ext_status =
  function
  | From.Outcometree.Oext_first  -> To.Outcometree.Oext_first
  | From.Outcometree.Oext_next  -> To.Outcometree.Oext_next
  | From.Outcometree.Oext_exception  -> To.Outcometree.Oext_exception

and copy_out_extension_constructor :
  From.Outcometree.out_extension_constructor ->
    To.Outcometree.out_extension_constructor
  =
  fun
    { From.Outcometree.oext_name = oext_name;
      From.Outcometree.oext_type_name = oext_type_name;
      From.Outcometree.oext_type_params = oext_type_params;
      From.Outcometree.oext_args = oext_args;
      From.Outcometree.oext_ret_type = oext_ret_type;
      From.Outcometree.oext_private = oext_private }
     ->
    {
      To.Outcometree.oext_name = oext_name;
      To.Outcometree.oext_type_name = oext_type_name;
      To.Outcometree.oext_type_params =
        (List.map (fun x  -> x) oext_type_params);
      To.Outcometree.oext_args =
        (List.map copy_out_type oext_args);
      To.Outcometree.oext_ret_type =
        (copy_option copy_out_type oext_ret_type);
      To.Outcometree.oext_private =
        (copy_private_flag oext_private)
    }

and copy_out_rec_status :
  From.Outcometree.out_rec_status -> To.Outcometree.out_rec_status =
  function
  | From.Outcometree.Orec_not  -> To.Outcometree.Orec_not
  | From.Outcometree.Orec_first  -> To.Outcometree.Orec_first
  | From.Outcometree.Orec_next  -> To.Outcometree.Orec_next

and copy_out_class_type :
  From.Outcometree.out_class_type -> To.Outcometree.out_class_type =
  function
  | From.Outcometree.Octy_constr (x0,x1) ->
      To.Outcometree.Octy_constr
        ((copy_out_ident x0),
          (List.map copy_out_type x1))
  | From.Outcometree.Octy_arrow (x0,x1,x2) ->
      To.Outcometree.Octy_arrow
        (x0, (copy_out_type x1),
          (copy_out_class_type x2))
  | From.Outcometree.Octy_signature (x0,x1) ->
      To.Outcometree.Octy_signature
        ((copy_option copy_out_type x0),
          (List.map copy_out_class_sig_item x1))

and copy_out_class_sig_item :
  From.Outcometree.out_class_sig_item ->
    To.Outcometree.out_class_sig_item
  =
  function
  | From.Outcometree.Ocsg_constraint (x0,x1) ->
      To.Outcometree.Ocsg_constraint
        ((copy_out_type x0),
          (copy_out_type x1))
  | From.Outcometree.Ocsg_method (x0,x1,x2,x3) ->
      To.Outcometree.Ocsg_method
        (x0, (copy_bool x1), (copy_bool x2),
          (copy_out_type x3))
  | From.Outcometree.Ocsg_value (x0,x1,x2,x3) ->
      To.Outcometree.Ocsg_value
        (x0, (copy_bool x1), (copy_bool x2),
          (copy_out_type x3))

and copy_out_type :
  From.Outcometree.out_type -> To.Outcometree.out_type =
  function
  | From.Outcometree.Otyp_abstract  -> To.Outcometree.Otyp_abstract
  | From.Outcometree.Otyp_open  -> To.Outcometree.Otyp_open
  | From.Outcometree.Otyp_alias (x0,x1) ->
      To.Outcometree.Otyp_alias
        ((copy_out_type x0), x1)
  | From.Outcometree.Otyp_arrow (x0,x1,x2) ->
      To.Outcometree.Otyp_arrow
        (x0, (copy_out_type x1),
          (copy_out_type x2))
  | From.Outcometree.Otyp_class (x0,x1,x2) ->
      To.Outcometree.Otyp_class
        ((copy_bool x0), (copy_out_ident x1),
          (List.map copy_out_type x2))
  | From.Outcometree.Otyp_constr (x0,x1) ->
      To.Outcometree.Otyp_constr
        ((copy_out_ident x0),
          (List.map copy_out_type x1))
  | From.Outcometree.Otyp_manifest (x0,x1) ->
      To.Outcometree.Otyp_manifest
        ((copy_out_type x0),
          (copy_out_type x1))
  | From.Outcometree.Otyp_object (x0,x1) ->
      To.Outcometree.Otyp_object
        ((List.map
            (fun x  ->
               let (x0,x1) = x  in
               (x0, (copy_out_type x1))) x0),
          (copy_option copy_bool x1))
  | From.Outcometree.Otyp_record x0 ->
      To.Outcometree.Otyp_record
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              (x0, (copy_bool x1), (copy_out_type x2)))
           x0)
  | From.Outcometree.Otyp_stuff x0 -> To.Outcometree.Otyp_stuff x0
  | From.Outcometree.Otyp_sum x0 ->
      To.Outcometree.Otyp_sum
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              (x0, (List.map copy_out_type x1),
                (copy_option copy_out_type x2))) x0)
  | From.Outcometree.Otyp_tuple x0 ->
      To.Outcometree.Otyp_tuple
        (List.map copy_out_type x0)
  | From.Outcometree.Otyp_var (x0,x1) ->
      To.Outcometree.Otyp_var ((copy_bool x0), x1)
  | From.Outcometree.Otyp_variant (x0,x1,x2,x3) ->
      To.Outcometree.Otyp_variant
        ((copy_bool x0), (copy_out_variant x1),
          (copy_bool x2),
          (copy_option (fun x  -> List.map (fun x  -> x) x) x3))
  | From.Outcometree.Otyp_poly (x0,x1) ->
      To.Outcometree.Otyp_poly
        ((List.map (fun x  -> x) x0), (copy_out_type x1))
  | From.Outcometree.Otyp_module (x0,x1,x2) ->
      To.Outcometree.Otyp_module
        (x0, (List.map (fun x  -> x) x1),
          (List.map copy_out_type x2))

and copy_out_variant :
  From.Outcometree.out_variant -> To.Outcometree.out_variant =
  function
  | From.Outcometree.Ovar_fields x0 ->
      To.Outcometree.Ovar_fields
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              (x0, (copy_bool x1),
                (List.map copy_out_type x2))) x0)
  | From.Outcometree.Ovar_name (x0,x1) ->
      To.Outcometree.Ovar_name
        ((copy_out_ident x0),
          (List.map copy_out_type x1))

and copy_out_value :
  From.Outcometree.out_value -> To.Outcometree.out_value =
  function
  | From.Outcometree.Oval_array x0 ->
      To.Outcometree.Oval_array
        (List.map copy_out_value x0)
  | From.Outcometree.Oval_char x0 -> To.Outcometree.Oval_char x0
  | From.Outcometree.Oval_constr (x0,x1) ->
      To.Outcometree.Oval_constr
        ((copy_out_ident x0),
          (List.map copy_out_value x1))
  | From.Outcometree.Oval_ellipsis  -> To.Outcometree.Oval_ellipsis
  | From.Outcometree.Oval_float x0 ->
      To.Outcometree.Oval_float (copy_float x0)
  | From.Outcometree.Oval_int x0 -> To.Outcometree.Oval_int x0
  | From.Outcometree.Oval_int32 x0 -> To.Outcometree.Oval_int32 x0
  | From.Outcometree.Oval_int64 x0 -> To.Outcometree.Oval_int64 x0
  | From.Outcometree.Oval_nativeint x0 ->
      To.Outcometree.Oval_nativeint x0
  | From.Outcometree.Oval_list x0 ->
      To.Outcometree.Oval_list
        (List.map copy_out_value x0)
  | From.Outcometree.Oval_printer x0 ->
      To.Outcometree.Oval_printer x0
  | From.Outcometree.Oval_record x0 ->
      To.Outcometree.Oval_record
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_out_ident x0),
                (copy_out_value x1))) x0)
  | From.Outcometree.Oval_string x0 -> To.Outcometree.Oval_string x0
  | From.Outcometree.Oval_stuff x0 -> To.Outcometree.Oval_stuff x0
  | From.Outcometree.Oval_tuple x0 ->
      To.Outcometree.Oval_tuple
        (List.map copy_out_value x0)
  | From.Outcometree.Oval_variant (x0,x1) ->
      To.Outcometree.Oval_variant
        (x0, (copy_option copy_out_value x1))

and copy_float : float -> float = fun x  -> x

and copy_out_ident :
  From.Outcometree.out_ident -> To.Outcometree.out_ident =
  function
  | From.Outcometree.Oide_apply (x0,x1) ->
      To.Outcometree.Oide_apply
        ((copy_out_ident x0),
          (copy_out_ident x1))
  | From.Outcometree.Oide_dot (x0,x1) ->
      To.Outcometree.Oide_dot
        ((copy_out_ident x0), x1)
  | From.Outcometree.Oide_ident x0 -> To.Outcometree.Oide_ident x0

let rec copy_toplevel_phrase :
  From.Parsetree.toplevel_phrase -> To.Parsetree.toplevel_phrase =
  function
  | From.Parsetree.Ptop_def x0 ->
      To.Parsetree.Ptop_def (copy_structure x0)
  | From.Parsetree.Ptop_dir (x0,x1) ->
      To.Parsetree.Ptop_dir
        (x0, (copy_directive_argument x1))

and copy_directive_argument :
  From.Parsetree.directive_argument -> To.Parsetree.directive_argument =
  function
  | From.Parsetree.Pdir_none  -> To.Parsetree.Pdir_none
  | From.Parsetree.Pdir_string x0 -> To.Parsetree.Pdir_string x0
  | From.Parsetree.Pdir_int x0 -> To.Parsetree.Pdir_int (string_of_int x0, None)
  | From.Parsetree.Pdir_ident x0 -> To.Parsetree.Pdir_ident (copy_longident x0)
  | From.Parsetree.Pdir_bool x0 -> To.Parsetree.Pdir_bool (copy_bool x0)

let copy_out_type_extension :
  From.Outcometree.out_type_extension -> To.Outcometree.out_type_extension =
  fun
    { From.Outcometree.otyext_name = otyext_name;
      From.Outcometree.otyext_params = otyext_params;
      From.Outcometree.otyext_constructors = otyext_constructors;
      From.Outcometree.otyext_private = otyext_private }
     ->
    {
      To.Outcometree.otyext_name = otyext_name;
      To.Outcometree.otyext_params =
        (List.map (fun x  -> x) otyext_params);
      To.Outcometree.otyext_constructors =
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              (x0, (List.map copy_out_type x1),
                (copy_option copy_out_type x2)))
           otyext_constructors);
      To.Outcometree.otyext_private =
        (copy_private_flag otyext_private)
    }

let copy_cases x = List.map copy_case x
let copy_pat = copy_pattern
let copy_expr = copy_expression
let copy_typ = copy_core_type

end
module Migrate_parsetree_def : sig 
#1 "migrate_parsetree_def.mli"
# 1 "src/migrate_parsetree_def.mli"
(**************************************************************************)
(*                                                                        *)
(*                         OCaml Migrate Parsetree                        *)
(*                                                                        *)
(*                             Frédéric Bour                              *)
(*                                                                        *)
(*   Copyright 2017 Institut National de Recherche en Informatique et     *)
(*     en Automatique (INRIA).                                            *)
(*                                                                        *)
(*   All rights reserved.  This file is distributed under the terms of    *)
(*   the GNU Lesser General Public License version 2.1, with the          *)
(*   special exception on linking described in the file LICENSE.          *)
(*                                                                        *)
(**************************************************************************)

(** Features which are not available in all versions of the frontend *)
type missing_feature =
    Pexp_letexception
  | Ppat_open
  | Pexp_unreachable
  | PSig
  | Pcstr_record
  | Pconst_integer
  | Pconst_float
  | Pcl_open
  | Pcty_open
  | Oinherit
  | Pwith_typesubst_longident
  | Pwith_modsubst_longident

(** Exception thrown by migration functions when a feature is not supported. *)
exception Migration_error of missing_feature * Location.t

(** [missing_feature_description x] is a text describing the feature [x]. *)
val missing_feature_description : missing_feature -> string

(** [missing_feature_minimal_version x] is the OCaml version where x was
    introduced. *)
val missing_feature_minimal_version : missing_feature -> string

(** Turn a missing feature into a reasonable error message. *)
val migration_error_message : missing_feature -> string

end = struct
#1 "migrate_parsetree_def.ml"
# 1 "src/migrate_parsetree_def.ml"
(**************************************************************************)
(*                                                                        *)
(*                         OCaml Migrate Parsetree                        *)
(*                                                                        *)
(*                             Frédéric Bour                              *)
(*                                                                        *)
(*   Copyright 2017 Institut National de Recherche en Informatique et     *)
(*     en Automatique (INRIA).                                            *)
(*                                                                        *)
(*   All rights reserved.  This file is distributed under the terms of    *)
(*   the GNU Lesser General Public License version 2.1, with the          *)
(*   special exception on linking described in the file LICENSE.          *)
(*                                                                        *)
(**************************************************************************)

(** Errors that can happen when converting constructions that doesn't exist in
    older version of the AST. *)
type missing_feature =
  | Pexp_letexception
    (** 4.04 -> 4.03: local exception, let exception _ in ... *)
  | Ppat_open
    (** 4.04 -> 4.03: module open in pattern match x with M.(_) -> ... *)
  | Pexp_unreachable
    (** 4.04 -> 4.03: unreachable pattern -> . *)
  | PSig
    (** 4.03 -> 4.02: signature in attribute, [@: val x : int] *)
  | Pcstr_record
    (** 4.03 -> 4.02: inline record *)
  | Pconst_integer
    (** 4.03 -> 4.02: integer literal with invalid suffix, 1234d *)
  | Pconst_float
    (** 4.03 -> 4.02: float literal with invalid suffix, 1234.0g *)
  | Pcl_open
    (** 4.06 -> 4.05: let open M in <class-expression> *)
  | Pcty_open
    (** 4.06 -> 4.05: let open M in <class-type> *)
  | Oinherit
    (** 4.06 -> 4.05: type t = < m : int; u > *)
  | Pwith_typesubst_longident
    (** 4.06 -> 4.05: T with type X.t := ... *)
  | Pwith_modsubst_longident
    (** 4.06 -> 4.05: T with module X.Y := ... *)

exception Migration_error of missing_feature * Location.t

(** [missing_feature_description x] is a text describing the feature [x]. *)
let missing_feature_description = function
  | Pexp_letexception -> "local exceptions"
  | Ppat_open         -> "module open in patterns"
  | Pexp_unreachable  -> "unreachable patterns"
  | PSig              -> "signatures in attribute"
  | Pcstr_record      -> "inline records"
  | Pconst_integer    -> "custom integer literals"
  | Pconst_float      -> "custom float literals"
  | Pcl_open          -> "module open in class expression"
  | Pcty_open         -> "module open in class type"
  | Oinherit          -> "inheritance in object type"
  | Pwith_typesubst_longident -> "type substitution inside a submodule"
  | Pwith_modsubst_longident  -> "module substitution inside a submodule"

(** [missing_feature_minimal_version x] is the OCaml version where x was
    introduced. *)
let missing_feature_minimal_version = function
  | Pexp_letexception -> "OCaml 4.04"
  | Ppat_open         -> "OCaml 4.04"
  | Pexp_unreachable  -> "OCaml 4.03"
  | PSig              -> "OCaml 4.03"
  | Pcstr_record      -> "OCaml 4.03"
  | Pconst_integer    -> "OCaml 4.03"
  | Pconst_float      -> "OCaml 4.03"
  | Pcl_open          -> "OCaml 4.06"
  | Pcty_open         -> "OCaml 4.06"
  | Oinherit          -> "OCaml 4.06"
  | Pwith_typesubst_longident -> "OCaml 4.06"
  | Pwith_modsubst_longident  -> "OCaml 4.06"

(** Turn a missing feature into a reasonable error message. *)
let migration_error_message x =
  let feature = missing_feature_description x in
  let version = missing_feature_minimal_version x in
  feature ^ " are not supported before " ^ version

let () =
  let location_prefix l =
    if l = Location.none then "" else
      let {Location.loc_start; loc_end; _} = l in
      let bol = loc_start.Lexing.pos_bol in
      Printf.sprintf "File %S, line %d, characters %d-%d: "
        loc_start.Lexing.pos_fname
        loc_start.Lexing.pos_lnum
        (loc_start.Lexing.pos_cnum - bol)
        (loc_end.Lexing.pos_cnum - bol)
  in
  Printexc.register_printer (function
      | Migration_error (err, loc) ->
          Some (location_prefix loc ^ migration_error_message err)
      | _ -> None
    )

end
module Migrate_parsetree_403_402_migrate
= struct
#1 "migrate_parsetree_403_402_migrate.ml"
# 1 "src/migrate_parsetree_403_402_migrate.ml"
(**************************************************************************)
(*                                                                        *)
(*                         OCaml Migrate Parsetree                        *)
(*                                                                        *)
(*                             Frédéric Bour                              *)
(*                         Alain Frisch, LexiFi                           *)
(*                                                                        *)
(*   Copyright 2017 Institut National de Recherche en Informatique et     *)
(*     en Automatique (INRIA).                                            *)
(*                                                                        *)
(*   All rights reserved.  This file is distributed under the terms of    *)
(*   the GNU Lesser General Public License version 2.1, with the          *)
(*   special exception on linking described in the file LICENSE.          *)
(*                                                                        *)
(**************************************************************************)

module Def = Migrate_parsetree_def
module From = Ast_403
module To = Ast_402

let inject_predef_option label d =
  let open To in
  let open Parsetree in
  match label with
  | From.Asttypes.Optional _ ->
    let loc = {d.ptyp_loc with Location.loc_ghost = true} in
    let txt = Longident.Ldot (Longident.Lident "*predef*", "option") in
    let ident = {Location. txt; loc} in
    { ptyp_desc = Ptyp_constr(ident,[d]); ptyp_loc = loc; ptyp_attributes = []}
  | _ -> d

let from_loc {From.Location. txt = _; loc} = loc

let migration_error location feature =
  raise (Def.Migration_error (feature, location))

let rec copy_expression :
  From.Parsetree.expression ->
    To.Parsetree.expression
  =
  fun
    { From.Parsetree.pexp_desc = pexp_desc;
      From.Parsetree.pexp_loc = pexp_loc;
      From.Parsetree.pexp_attributes = pexp_attributes }
     ->
    {
      To.Parsetree.pexp_desc =
        (copy_expression_desc pexp_loc pexp_desc);
      To.Parsetree.pexp_loc =
        (copy_location pexp_loc);
      To.Parsetree.pexp_attributes =
        (copy_attributes pexp_attributes)
    }

and copy_expression_desc loc :
  From.Parsetree.expression_desc ->
    To.Parsetree.expression_desc
  =
  function
  | From.Parsetree.Pexp_ident x0 ->
      To.Parsetree.Pexp_ident
        (copy_loc copy_longident
           x0)
  | From.Parsetree.Pexp_constant x0 ->
      To.Parsetree.Pexp_constant
        (copy_constant loc x0)
  | From.Parsetree.Pexp_let (x0,x1,x2) ->
      To.Parsetree.Pexp_let
        ((copy_rec_flag x0),
          (List.map copy_value_binding x1),
          (copy_expression x2))
  | From.Parsetree.Pexp_function x0 ->
      To.Parsetree.Pexp_function
        (List.map copy_case x0)
  | From.Parsetree.Pexp_fun (x0,x1,x2,x3) ->
      To.Parsetree.Pexp_fun
        ((copy_arg_label x0),
          (copy_option copy_expression x1),
          (copy_pattern x2),
          (copy_expression x3))
  | From.Parsetree.Pexp_apply (x0,x1) ->
      To.Parsetree.Pexp_apply
        ((copy_expression x0),
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                ((copy_arg_label x0),
                  (copy_expression x1))) x1))
  | From.Parsetree.Pexp_match (x0,x1) ->
      To.Parsetree.Pexp_match
        ((copy_expression x0),
          (List.map copy_case x1))
  | From.Parsetree.Pexp_try (x0,x1) ->
      To.Parsetree.Pexp_try
        ((copy_expression x0),
          (List.map copy_case x1))
  | From.Parsetree.Pexp_tuple x0 ->
      To.Parsetree.Pexp_tuple
        (List.map copy_expression x0)
  | From.Parsetree.Pexp_construct (x0,x1) ->
      To.Parsetree.Pexp_construct
        ((copy_loc
            copy_longident x0),
          (copy_option copy_expression x1))
  | From.Parsetree.Pexp_variant (x0,x1) ->
      To.Parsetree.Pexp_variant
        ((copy_label x0),
          (copy_option copy_expression x1))
  | From.Parsetree.Pexp_record (x0,x1) ->
      To.Parsetree.Pexp_record
        ((List.map
            (fun x  ->
               let (x0,x1) = x  in
               ((copy_loc
                   copy_longident x0),
                 (copy_expression x1))) x0),
          (copy_option copy_expression x1))
  | From.Parsetree.Pexp_field (x0,x1) ->
      To.Parsetree.Pexp_field
        ((copy_expression x0),
          (copy_loc
             copy_longident x1))
  | From.Parsetree.Pexp_setfield (x0,x1,x2) ->
      To.Parsetree.Pexp_setfield
        ((copy_expression x0),
          (copy_loc
             copy_longident x1),
          (copy_expression x2))
  | From.Parsetree.Pexp_array x0 ->
      To.Parsetree.Pexp_array
        (List.map copy_expression x0)
  | From.Parsetree.Pexp_ifthenelse (x0,x1,x2) ->
      To.Parsetree.Pexp_ifthenelse
        ((copy_expression x0),
          (copy_expression x1),
          (copy_option copy_expression x2))
  | From.Parsetree.Pexp_sequence (x0,x1) ->
      To.Parsetree.Pexp_sequence
        ((copy_expression x0),
          (copy_expression x1))
  | From.Parsetree.Pexp_while (x0,x1) ->
      To.Parsetree.Pexp_while
        ((copy_expression x0),
          (copy_expression x1))
  | From.Parsetree.Pexp_for (x0,x1,x2,x3,x4) ->
      To.Parsetree.Pexp_for
        ((copy_pattern x0),
          (copy_expression x1),
          (copy_expression x2),
          (copy_direction_flag x3),
          (copy_expression x4))
  | From.Parsetree.Pexp_constraint (x0,x1) ->
      To.Parsetree.Pexp_constraint
        ((copy_expression x0),
          (copy_core_type x1))
  | From.Parsetree.Pexp_coerce (x0,x1,x2) ->
      To.Parsetree.Pexp_coerce
        ((copy_expression x0),
          (copy_option copy_core_type x1),
          (copy_core_type x2))
  | From.Parsetree.Pexp_send (x0,x1) ->
      To.Parsetree.Pexp_send
        ((copy_expression x0), x1)
  | From.Parsetree.Pexp_new x0 ->
      To.Parsetree.Pexp_new
        (copy_loc copy_longident
           x0)
  | From.Parsetree.Pexp_setinstvar (x0,x1) ->
      To.Parsetree.Pexp_setinstvar
        ((copy_loc (fun x  -> x) x0),
          (copy_expression x1))
  | From.Parsetree.Pexp_override x0 ->
      To.Parsetree.Pexp_override
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_loc (fun x  -> x) x0),
                (copy_expression x1))) x0)
  | From.Parsetree.Pexp_letmodule (x0,x1,x2) ->
      To.Parsetree.Pexp_letmodule
        ((copy_loc (fun x  -> x) x0),
          (copy_module_expr x1),
          (copy_expression x2))
  | From.Parsetree.Pexp_assert x0 ->
      To.Parsetree.Pexp_assert
        (copy_expression x0)
  | From.Parsetree.Pexp_lazy x0 ->
      To.Parsetree.Pexp_lazy
        (copy_expression x0)
  | From.Parsetree.Pexp_poly (x0,x1) ->
      To.Parsetree.Pexp_poly
        ((copy_expression x0),
          (copy_option copy_core_type x1))
  | From.Parsetree.Pexp_object x0 ->
      To.Parsetree.Pexp_object
        (copy_class_structure x0)
  | From.Parsetree.Pexp_newtype (x0,x1) ->
      To.Parsetree.Pexp_newtype
        (x0, (copy_expression x1))
  | From.Parsetree.Pexp_pack x0 ->
      To.Parsetree.Pexp_pack
        (copy_module_expr x0)
  | From.Parsetree.Pexp_open (x0,x1,x2) ->
      To.Parsetree.Pexp_open
        ((copy_override_flag x0),
          (copy_loc
             copy_longident x1),
          (copy_expression x2))
  | From.Parsetree.Pexp_extension x0 ->
      To.Parsetree.Pexp_extension
        (copy_extension x0)
  | From.Parsetree.Pexp_unreachable  ->
      migration_error loc Def.Pexp_unreachable

and copy_direction_flag :
  From.Asttypes.direction_flag ->
    To.Asttypes.direction_flag
  =
  function
  | From.Asttypes.Upto  -> To.Asttypes.Upto
  | From.Asttypes.Downto  -> To.Asttypes.Downto

and copy_case :
  From.Parsetree.case -> To.Parsetree.case =
  fun
    { From.Parsetree.pc_lhs = pc_lhs;
      From.Parsetree.pc_guard = pc_guard;
      From.Parsetree.pc_rhs = pc_rhs }
     ->
    {
      To.Parsetree.pc_lhs =
        (copy_pattern pc_lhs);
      To.Parsetree.pc_guard =
        (copy_option copy_expression pc_guard);
      To.Parsetree.pc_rhs =
        (copy_expression pc_rhs)
    }

and copy_value_binding :
  From.Parsetree.value_binding ->
    To.Parsetree.value_binding
  =
  fun
    { From.Parsetree.pvb_pat = pvb_pat;
      From.Parsetree.pvb_expr = pvb_expr;
      From.Parsetree.pvb_attributes = pvb_attributes;
      From.Parsetree.pvb_loc = pvb_loc }
     ->
    {
      To.Parsetree.pvb_pat =
        (copy_pattern pvb_pat);
      To.Parsetree.pvb_expr =
        (copy_expression pvb_expr);
      To.Parsetree.pvb_attributes =
        (copy_attributes pvb_attributes);
      To.Parsetree.pvb_loc =
        (copy_location pvb_loc)
    }

and copy_pattern :
  From.Parsetree.pattern -> To.Parsetree.pattern =
  fun
    { From.Parsetree.ppat_desc = ppat_desc;
      From.Parsetree.ppat_loc = ppat_loc;
      From.Parsetree.ppat_attributes = ppat_attributes }
     ->
    {
      To.Parsetree.ppat_desc =
        (copy_pattern_desc ppat_loc ppat_desc);
      To.Parsetree.ppat_loc =
        (copy_location ppat_loc);
      To.Parsetree.ppat_attributes =
        (copy_attributes ppat_attributes)
    }

and copy_pattern_desc loc :
  From.Parsetree.pattern_desc ->
    To.Parsetree.pattern_desc
  =
  function
  | From.Parsetree.Ppat_any  ->
      To.Parsetree.Ppat_any
  | From.Parsetree.Ppat_var x0 ->
      To.Parsetree.Ppat_var
        (copy_loc (fun x  -> x) x0)
  | From.Parsetree.Ppat_alias (x0,x1) ->
      To.Parsetree.Ppat_alias
        ((copy_pattern x0),
          (copy_loc (fun x  -> x) x1))
  | From.Parsetree.Ppat_constant x0 ->
      To.Parsetree.Ppat_constant
        (copy_constant loc x0)
  | From.Parsetree.Ppat_interval (x0,x1) ->
      To.Parsetree.Ppat_interval
        ((copy_constant loc x0),
          (copy_constant loc x1))
  | From.Parsetree.Ppat_tuple x0 ->
      To.Parsetree.Ppat_tuple
        (List.map copy_pattern x0)
  | From.Parsetree.Ppat_construct (x0,x1) ->
      To.Parsetree.Ppat_construct
        ((copy_loc
            copy_longident x0),
          (copy_option copy_pattern x1))
  | From.Parsetree.Ppat_variant (x0,x1) ->
      To.Parsetree.Ppat_variant
        ((copy_label x0),
          (copy_option copy_pattern x1))
  | From.Parsetree.Ppat_record (x0,x1) ->
      To.Parsetree.Ppat_record
        ((List.map
            (fun x  ->
               let (x0,x1) = x  in
               ((copy_loc
                   copy_longident x0),
                 (copy_pattern x1))) x0),
          (copy_closed_flag x1))
  | From.Parsetree.Ppat_array x0 ->
      To.Parsetree.Ppat_array
        (List.map copy_pattern x0)
  | From.Parsetree.Ppat_or (x0,x1) ->
      To.Parsetree.Ppat_or
        ((copy_pattern x0),
          (copy_pattern x1))
  | From.Parsetree.Ppat_constraint (x0,x1) ->
      To.Parsetree.Ppat_constraint
        ((copy_pattern x0),
          (copy_core_type x1))
  | From.Parsetree.Ppat_type x0 ->
      To.Parsetree.Ppat_type
        (copy_loc copy_longident
           x0)
  | From.Parsetree.Ppat_lazy x0 ->
      To.Parsetree.Ppat_lazy
        (copy_pattern x0)
  | From.Parsetree.Ppat_unpack x0 ->
      To.Parsetree.Ppat_unpack
        (copy_loc (fun x  -> x) x0)
  | From.Parsetree.Ppat_exception x0 ->
      To.Parsetree.Ppat_exception
        (copy_pattern x0)
  | From.Parsetree.Ppat_extension x0 ->
      To.Parsetree.Ppat_extension
        (copy_extension x0)

and copy_core_type :
  From.Parsetree.core_type ->
    To.Parsetree.core_type
  =
  fun
    { From.Parsetree.ptyp_desc = ptyp_desc;
      From.Parsetree.ptyp_loc = ptyp_loc;
      From.Parsetree.ptyp_attributes = ptyp_attributes }
     ->
    {
      To.Parsetree.ptyp_desc =
        (copy_core_type_desc ptyp_desc);
      To.Parsetree.ptyp_loc =
        (copy_location ptyp_loc);
      To.Parsetree.ptyp_attributes =
        (copy_attributes ptyp_attributes)
    }

and copy_core_type_desc :
  From.Parsetree.core_type_desc ->
    To.Parsetree.core_type_desc
  =
  function
  | From.Parsetree.Ptyp_any  ->
      To.Parsetree.Ptyp_any
  | From.Parsetree.Ptyp_var x0 ->
      To.Parsetree.Ptyp_var x0
  | From.Parsetree.Ptyp_arrow (x0,x1,x2) ->
      To.Parsetree.Ptyp_arrow
        ((copy_arg_label x0),
          inject_predef_option x0 (copy_core_type x1),
          (copy_core_type x2))
  | From.Parsetree.Ptyp_tuple x0 ->
      To.Parsetree.Ptyp_tuple
        (List.map copy_core_type x0)
  | From.Parsetree.Ptyp_constr (x0,x1) ->
      To.Parsetree.Ptyp_constr
        ((copy_loc
            copy_longident x0),
          (List.map copy_core_type x1))
  | From.Parsetree.Ptyp_object (x0,x1) ->
      To.Parsetree.Ptyp_object
        ((List.map
            (fun x  ->
               let (x0,x1,x2) = x  in
               (x0, (copy_attributes x1),
                 (copy_core_type x2))) x0),
          (copy_closed_flag x1))
  | From.Parsetree.Ptyp_class (x0,x1) ->
      To.Parsetree.Ptyp_class
        ((copy_loc
            copy_longident x0),
          (List.map copy_core_type x1))
  | From.Parsetree.Ptyp_alias (x0,x1) ->
      To.Parsetree.Ptyp_alias
        ((copy_core_type x0), x1)
  | From.Parsetree.Ptyp_variant (x0,x1,x2) ->
      To.Parsetree.Ptyp_variant
        ((List.map copy_row_field x0),
          (copy_closed_flag x1),
          (copy_option
             (fun x  -> List.map copy_label x) x2))
  | From.Parsetree.Ptyp_poly (x0,x1) ->
      To.Parsetree.Ptyp_poly
        ((List.map (fun x  -> x) x0),
          (copy_core_type x1))
  | From.Parsetree.Ptyp_package x0 ->
      To.Parsetree.Ptyp_package
        (copy_package_type x0)
  | From.Parsetree.Ptyp_extension x0 ->
      To.Parsetree.Ptyp_extension
        (copy_extension x0)

and copy_package_type :
  From.Parsetree.package_type ->
    To.Parsetree.package_type
  =
  fun x  ->
    let (x0,x1) = x  in
    ((copy_loc copy_longident x0),
      (List.map
         (fun x  ->
            let (x0,x1) = x  in
            ((copy_loc
                copy_longident x0),
              (copy_core_type x1))) x1))

and copy_row_field :
  From.Parsetree.row_field ->
    To.Parsetree.row_field
  =
  function
  | From.Parsetree.Rtag (x0,x1,x2,x3) ->
      To.Parsetree.Rtag
        ((copy_label x0),
          (copy_attributes x1), (copy_bool x2),
          (List.map copy_core_type x3))
  | From.Parsetree.Rinherit x0 ->
      To.Parsetree.Rinherit
        (copy_core_type x0)

and copy_attributes :
  From.Parsetree.attributes ->
    To.Parsetree.attributes
  = fun x  -> List.map copy_attribute x

and copy_attribute :
  From.Parsetree.attribute ->
    To.Parsetree.attribute
  =
  fun x  ->
    let (x0,x1) = x  in
    ((copy_loc (fun x  -> x) x0),
      (copy_payload (from_loc x0) x1))

and copy_payload loc :
  From.Parsetree.payload -> To.Parsetree.payload =
  function
  | From.Parsetree.PStr x0 ->
      To.Parsetree.PStr
        (copy_structure x0)
  | From.Parsetree.PSig _x0 ->
      migration_error loc Def.PSig
  | From.Parsetree.PTyp x0 ->
      To.Parsetree.PTyp
        (copy_core_type x0)
  | From.Parsetree.PPat (x0,x1) ->
      To.Parsetree.PPat
        ((copy_pattern x0),
          (copy_option copy_expression x1))

and copy_structure :
  From.Parsetree.structure ->
    To.Parsetree.structure
  = fun x  -> List.map copy_structure_item x

and copy_structure_item :
  From.Parsetree.structure_item ->
    To.Parsetree.structure_item
  =
  fun
    { From.Parsetree.pstr_desc = pstr_desc;
      From.Parsetree.pstr_loc = pstr_loc }
     ->
    {
      To.Parsetree.pstr_desc =
        (copy_structure_item_desc pstr_desc);
      To.Parsetree.pstr_loc =
        (copy_location pstr_loc)
    }

and copy_structure_item_desc :
  From.Parsetree.structure_item_desc ->
    To.Parsetree.structure_item_desc
  =
  function
  | From.Parsetree.Pstr_eval (x0,x1) ->
      To.Parsetree.Pstr_eval
        ((copy_expression x0),
          (copy_attributes x1))
  | From.Parsetree.Pstr_value (x0,x1) ->
      To.Parsetree.Pstr_value
        ((copy_rec_flag x0),
          (List.map copy_value_binding x1))
  | From.Parsetree.Pstr_primitive x0 ->
      To.Parsetree.Pstr_primitive
        (copy_value_description x0)
  | From.Parsetree.Pstr_type (x0,x1) ->
      To.Parsetree.Pstr_type (type_declarations x0 x1)
  | From.Parsetree.Pstr_typext x0 ->
      To.Parsetree.Pstr_typext
        (copy_type_extension x0)
  | From.Parsetree.Pstr_exception x0 ->
      To.Parsetree.Pstr_exception
        (copy_extension_constructor x0)
  | From.Parsetree.Pstr_module x0 ->
      To.Parsetree.Pstr_module
        (copy_module_binding x0)
  | From.Parsetree.Pstr_recmodule x0 ->
      To.Parsetree.Pstr_recmodule
        (List.map copy_module_binding x0)
  | From.Parsetree.Pstr_modtype x0 ->
      To.Parsetree.Pstr_modtype
        (copy_module_type_declaration x0)
  | From.Parsetree.Pstr_open x0 ->
      To.Parsetree.Pstr_open
        (copy_open_description x0)
  | From.Parsetree.Pstr_class x0 ->
      To.Parsetree.Pstr_class
        (List.map copy_class_declaration x0)
  | From.Parsetree.Pstr_class_type x0 ->
      To.Parsetree.Pstr_class_type
        (List.map copy_class_type_declaration x0)
  | From.Parsetree.Pstr_include x0 ->
      To.Parsetree.Pstr_include
        (copy_include_declaration x0)
  | From.Parsetree.Pstr_attribute x0 ->
      To.Parsetree.Pstr_attribute
        (copy_attribute x0)
  | From.Parsetree.Pstr_extension (x0,x1) ->
      To.Parsetree.Pstr_extension
        ((copy_extension x0),
          (copy_attributes x1))

and copy_include_declaration :
  From.Parsetree.include_declaration ->
    To.Parsetree.include_declaration
  =
  fun x  ->
    copy_include_infos
      copy_module_expr x

and copy_class_declaration :
  From.Parsetree.class_declaration ->
    To.Parsetree.class_declaration
  =
  fun x  ->
    copy_class_infos
      copy_class_expr x

and copy_class_expr :
  From.Parsetree.class_expr ->
    To.Parsetree.class_expr
  =
  fun
    { From.Parsetree.pcl_desc = pcl_desc;
      From.Parsetree.pcl_loc = pcl_loc;
      From.Parsetree.pcl_attributes = pcl_attributes }
     ->
    {
      To.Parsetree.pcl_desc =
        (copy_class_expr_desc pcl_desc);
      To.Parsetree.pcl_loc =
        (copy_location pcl_loc);
      To.Parsetree.pcl_attributes =
        (copy_attributes pcl_attributes)
    }

and copy_class_expr_desc :
  From.Parsetree.class_expr_desc ->
    To.Parsetree.class_expr_desc
  =
  function
  | From.Parsetree.Pcl_constr (x0,x1) ->
      To.Parsetree.Pcl_constr
        ((copy_loc
            copy_longident x0),
          (List.map copy_core_type x1))
  | From.Parsetree.Pcl_structure x0 ->
      To.Parsetree.Pcl_structure
        (copy_class_structure x0)
  | From.Parsetree.Pcl_fun (x0,x1,x2,x3) ->
      To.Parsetree.Pcl_fun
        ((copy_arg_label x0),
          (copy_option copy_expression x1),
          (copy_pattern x2),
          (copy_class_expr x3))
  | From.Parsetree.Pcl_apply (x0,x1) ->
      To.Parsetree.Pcl_apply
        ((copy_class_expr x0),
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                ((copy_arg_label x0),
                  (copy_expression x1))) x1))
  | From.Parsetree.Pcl_let (x0,x1,x2) ->
      To.Parsetree.Pcl_let
        ((copy_rec_flag x0),
          (List.map copy_value_binding x1),
          (copy_class_expr x2))
  | From.Parsetree.Pcl_constraint (x0,x1) ->
      To.Parsetree.Pcl_constraint
        ((copy_class_expr x0),
          (copy_class_type x1))
  | From.Parsetree.Pcl_extension x0 ->
      To.Parsetree.Pcl_extension
        (copy_extension x0)

and copy_class_structure :
  From.Parsetree.class_structure ->
    To.Parsetree.class_structure
  =
  fun
    { From.Parsetree.pcstr_self = pcstr_self;
      From.Parsetree.pcstr_fields = pcstr_fields }
     ->
    {
      To.Parsetree.pcstr_self =
        (copy_pattern pcstr_self);
      To.Parsetree.pcstr_fields =
        (List.map copy_class_field pcstr_fields)
    }

and copy_class_field :
  From.Parsetree.class_field ->
    To.Parsetree.class_field
  =
  fun
    { From.Parsetree.pcf_desc = pcf_desc;
      From.Parsetree.pcf_loc = pcf_loc;
      From.Parsetree.pcf_attributes = pcf_attributes }
     ->
    {
      To.Parsetree.pcf_desc =
        (copy_class_field_desc pcf_desc);
      To.Parsetree.pcf_loc =
        (copy_location pcf_loc);
      To.Parsetree.pcf_attributes =
        (copy_attributes pcf_attributes)
    }

and copy_class_field_desc :
  From.Parsetree.class_field_desc ->
    To.Parsetree.class_field_desc
  =
  function
  | From.Parsetree.Pcf_inherit (x0,x1,x2) ->
      To.Parsetree.Pcf_inherit
        ((copy_override_flag x0),
          (copy_class_expr x1),
          (copy_option (fun x  -> x) x2))
  | From.Parsetree.Pcf_val x0 ->
      To.Parsetree.Pcf_val
        (let (x0,x1,x2) = x0  in
         ((copy_loc (fun x  -> x) x0),
           (copy_mutable_flag x1),
           (copy_class_field_kind x2)))
  | From.Parsetree.Pcf_method x0 ->
      To.Parsetree.Pcf_method
        (let (x0,x1,x2) = x0  in
         ((copy_loc (fun x  -> x) x0),
           (copy_private_flag x1),
           (copy_class_field_kind x2)))
  | From.Parsetree.Pcf_constraint x0 ->
      To.Parsetree.Pcf_constraint
        (let (x0,x1) = x0  in
         ((copy_core_type x0),
           (copy_core_type x1)))
  | From.Parsetree.Pcf_initializer x0 ->
      To.Parsetree.Pcf_initializer
        (copy_expression x0)
  | From.Parsetree.Pcf_attribute x0 ->
      To.Parsetree.Pcf_attribute
        (copy_attribute x0)
  | From.Parsetree.Pcf_extension x0 ->
      To.Parsetree.Pcf_extension
        (copy_extension x0)

and copy_class_field_kind :
  From.Parsetree.class_field_kind ->
    To.Parsetree.class_field_kind
  =
  function
  | From.Parsetree.Cfk_virtual x0 ->
      To.Parsetree.Cfk_virtual
        (copy_core_type x0)
  | From.Parsetree.Cfk_concrete (x0,x1) ->
      To.Parsetree.Cfk_concrete
        ((copy_override_flag x0),
          (copy_expression x1))

and copy_module_binding :
  From.Parsetree.module_binding ->
    To.Parsetree.module_binding
  =
  fun
    { From.Parsetree.pmb_name = pmb_name;
      From.Parsetree.pmb_expr = pmb_expr;
      From.Parsetree.pmb_attributes = pmb_attributes;
      From.Parsetree.pmb_loc = pmb_loc }
     ->
    {
      To.Parsetree.pmb_name =
        (copy_loc (fun x  -> x) pmb_name);
      To.Parsetree.pmb_expr =
        (copy_module_expr pmb_expr);
      To.Parsetree.pmb_attributes =
        (copy_attributes pmb_attributes);
      To.Parsetree.pmb_loc =
        (copy_location pmb_loc)
    }

and copy_module_expr :
  From.Parsetree.module_expr ->
    To.Parsetree.module_expr
  =
  fun
    { From.Parsetree.pmod_desc = pmod_desc;
      From.Parsetree.pmod_loc = pmod_loc;
      From.Parsetree.pmod_attributes = pmod_attributes }
     ->
    {
      To.Parsetree.pmod_desc =
        (copy_module_expr_desc pmod_desc);
      To.Parsetree.pmod_loc =
        (copy_location pmod_loc);
      To.Parsetree.pmod_attributes =
        (copy_attributes pmod_attributes)
    }

and copy_module_expr_desc :
  From.Parsetree.module_expr_desc ->
    To.Parsetree.module_expr_desc
  =
  function
  | From.Parsetree.Pmod_ident x0 ->
      To.Parsetree.Pmod_ident
        (copy_loc copy_longident
           x0)
  | From.Parsetree.Pmod_structure x0 ->
      To.Parsetree.Pmod_structure
        (copy_structure x0)
  | From.Parsetree.Pmod_functor (x0,x1,x2) ->
      To.Parsetree.Pmod_functor
        ((copy_loc (fun x  -> x) x0),
          (copy_option copy_module_type x1),
          (copy_module_expr x2))
  | From.Parsetree.Pmod_apply (x0,x1) ->
      To.Parsetree.Pmod_apply
        ((copy_module_expr x0),
          (copy_module_expr x1))
  | From.Parsetree.Pmod_constraint (x0,x1) ->
      To.Parsetree.Pmod_constraint
        ((copy_module_expr x0),
          (copy_module_type x1))
  | From.Parsetree.Pmod_unpack x0 ->
      To.Parsetree.Pmod_unpack
        (copy_expression x0)
  | From.Parsetree.Pmod_extension x0 ->
      To.Parsetree.Pmod_extension
        (copy_extension x0)

and copy_module_type :
  From.Parsetree.module_type ->
    To.Parsetree.module_type
  =
  fun
    { From.Parsetree.pmty_desc = pmty_desc;
      From.Parsetree.pmty_loc = pmty_loc;
      From.Parsetree.pmty_attributes = pmty_attributes }
     ->
    {
      To.Parsetree.pmty_desc =
        (copy_module_type_desc pmty_desc);
      To.Parsetree.pmty_loc =
        (copy_location pmty_loc);
      To.Parsetree.pmty_attributes =
        (copy_attributes pmty_attributes)
    }

and copy_module_type_desc :
  From.Parsetree.module_type_desc ->
    To.Parsetree.module_type_desc
  =
  function
  | From.Parsetree.Pmty_ident x0 ->
      To.Parsetree.Pmty_ident
        (copy_loc copy_longident
           x0)
  | From.Parsetree.Pmty_signature x0 ->
      To.Parsetree.Pmty_signature
        (copy_signature x0)
  | From.Parsetree.Pmty_functor (x0,x1,x2) ->
      To.Parsetree.Pmty_functor
        ((copy_loc (fun x  -> x) x0),
          (copy_option copy_module_type x1),
          (copy_module_type x2))
  | From.Parsetree.Pmty_with (x0,x1) ->
      To.Parsetree.Pmty_with
        ((copy_module_type x0),
          (List.map copy_with_constraint x1))
  | From.Parsetree.Pmty_typeof x0 ->
      To.Parsetree.Pmty_typeof
        (copy_module_expr x0)
  | From.Parsetree.Pmty_extension x0 ->
      To.Parsetree.Pmty_extension
        (copy_extension x0)
  | From.Parsetree.Pmty_alias x0 ->
      To.Parsetree.Pmty_alias
        (copy_loc copy_longident
           x0)

and copy_with_constraint :
  From.Parsetree.with_constraint ->
    To.Parsetree.with_constraint
  =
  function
  | From.Parsetree.Pwith_type (x0,x1) ->
      To.Parsetree.Pwith_type
        ((copy_loc
            copy_longident x0),
          (copy_type_declaration x1))
  | From.Parsetree.Pwith_module (x0,x1) ->
      To.Parsetree.Pwith_module
        ((copy_loc
            copy_longident x0),
          (copy_loc
             copy_longident x1))
  | From.Parsetree.Pwith_typesubst x0 ->
      To.Parsetree.Pwith_typesubst
        (copy_type_declaration x0)
  | From.Parsetree.Pwith_modsubst (x0,x1) ->
      To.Parsetree.Pwith_modsubst
        ((copy_loc (fun x  -> x) x0),
          (copy_loc
             copy_longident x1))

and copy_signature :
  From.Parsetree.signature ->
    To.Parsetree.signature
  = fun x  -> List.map copy_signature_item x

and copy_signature_item :
  From.Parsetree.signature_item ->
    To.Parsetree.signature_item
  =
  fun
    { From.Parsetree.psig_desc = psig_desc;
      From.Parsetree.psig_loc = psig_loc }
     ->
    {
      To.Parsetree.psig_desc =
        (copy_signature_item_desc psig_desc);
      To.Parsetree.psig_loc =
        (copy_location psig_loc)
    }

and copy_signature_item_desc :
  From.Parsetree.signature_item_desc ->
    To.Parsetree.signature_item_desc
  =
  function
  | From.Parsetree.Psig_value x0 ->
      To.Parsetree.Psig_value
        (copy_value_description x0)
  | From.Parsetree.Psig_type (x0,x1) ->
      To.Parsetree.Psig_type (type_declarations x0 x1)
  | From.Parsetree.Psig_typext x0 ->
      To.Parsetree.Psig_typext
        (copy_type_extension x0)
  | From.Parsetree.Psig_exception x0 ->
      To.Parsetree.Psig_exception
        (copy_extension_constructor x0)
  | From.Parsetree.Psig_module x0 ->
      To.Parsetree.Psig_module
        (copy_module_declaration x0)
  | From.Parsetree.Psig_recmodule x0 ->
      To.Parsetree.Psig_recmodule
        (List.map copy_module_declaration x0)
  | From.Parsetree.Psig_modtype x0 ->
      To.Parsetree.Psig_modtype
        (copy_module_type_declaration x0)
  | From.Parsetree.Psig_open x0 ->
      To.Parsetree.Psig_open
        (copy_open_description x0)
  | From.Parsetree.Psig_include x0 ->
      To.Parsetree.Psig_include
        (copy_include_description x0)
  | From.Parsetree.Psig_class x0 ->
      To.Parsetree.Psig_class
        (List.map copy_class_description x0)
  | From.Parsetree.Psig_class_type x0 ->
      To.Parsetree.Psig_class_type
        (List.map copy_class_type_declaration x0)
  | From.Parsetree.Psig_attribute x0 ->
      To.Parsetree.Psig_attribute
        (copy_attribute x0)
  | From.Parsetree.Psig_extension (x0,x1) ->
      To.Parsetree.Psig_extension
        ((copy_extension x0),
          (copy_attributes x1))

and copy_class_type_declaration :
  From.Parsetree.class_type_declaration ->
    To.Parsetree.class_type_declaration
  =
  fun x  ->
    copy_class_infos
      copy_class_type x

and copy_class_description :
  From.Parsetree.class_description ->
    To.Parsetree.class_description
  =
  fun x  ->
    copy_class_infos
      copy_class_type x

and copy_class_type :
  From.Parsetree.class_type ->
    To.Parsetree.class_type
  =
  fun
    { From.Parsetree.pcty_desc = pcty_desc;
      From.Parsetree.pcty_loc = pcty_loc;
      From.Parsetree.pcty_attributes = pcty_attributes }
     ->
    {
      To.Parsetree.pcty_desc =
        (copy_class_type_desc pcty_desc);
      To.Parsetree.pcty_loc =
        (copy_location pcty_loc);
      To.Parsetree.pcty_attributes =
        (copy_attributes pcty_attributes)
    }

and copy_class_type_desc :
  From.Parsetree.class_type_desc ->
    To.Parsetree.class_type_desc
  =
  function
  | From.Parsetree.Pcty_constr (x0,x1) ->
      To.Parsetree.Pcty_constr
        ((copy_loc
            copy_longident x0),
          (List.map copy_core_type x1))
  | From.Parsetree.Pcty_signature x0 ->
      To.Parsetree.Pcty_signature
        (copy_class_signature x0)
  | From.Parsetree.Pcty_arrow (x0,x1,x2) ->
      To.Parsetree.Pcty_arrow
        ((copy_arg_label x0),
          inject_predef_option x0 (copy_core_type x1),
          (copy_class_type x2))
  | From.Parsetree.Pcty_extension x0 ->
      To.Parsetree.Pcty_extension
        (copy_extension x0)

and copy_class_signature :
  From.Parsetree.class_signature ->
    To.Parsetree.class_signature
  =
  fun
    { From.Parsetree.pcsig_self = pcsig_self;
      From.Parsetree.pcsig_fields = pcsig_fields }
     ->
    {
      To.Parsetree.pcsig_self =
        (copy_core_type pcsig_self);
      To.Parsetree.pcsig_fields =
        (List.map copy_class_type_field
           pcsig_fields)
    }

and copy_class_type_field :
  From.Parsetree.class_type_field ->
    To.Parsetree.class_type_field
  =
  fun
    { From.Parsetree.pctf_desc = pctf_desc;
      From.Parsetree.pctf_loc = pctf_loc;
      From.Parsetree.pctf_attributes = pctf_attributes }
     ->
    {
      To.Parsetree.pctf_desc =
        (copy_class_type_field_desc pctf_desc);
      To.Parsetree.pctf_loc =
        (copy_location pctf_loc);
      To.Parsetree.pctf_attributes =
        (copy_attributes pctf_attributes)
    }

and copy_class_type_field_desc :
  From.Parsetree.class_type_field_desc ->
    To.Parsetree.class_type_field_desc
  =
  function
  | From.Parsetree.Pctf_inherit x0 ->
      To.Parsetree.Pctf_inherit
        (copy_class_type x0)
  | From.Parsetree.Pctf_val x0 ->
      To.Parsetree.Pctf_val
        (let (x0,x1,x2,x3) = x0  in
         (x0, (copy_mutable_flag x1),
           (copy_virtual_flag x2),
           (copy_core_type x3)))
  | From.Parsetree.Pctf_method x0 ->
      To.Parsetree.Pctf_method
        (let (x0,x1,x2,x3) = x0  in
         (x0, (copy_private_flag x1),
           (copy_virtual_flag x2),
           (copy_core_type x3)))
  | From.Parsetree.Pctf_constraint x0 ->
      To.Parsetree.Pctf_constraint
        (let (x0,x1) = x0  in
         ((copy_core_type x0),
           (copy_core_type x1)))
  | From.Parsetree.Pctf_attribute x0 ->
      To.Parsetree.Pctf_attribute
        (copy_attribute x0)
  | From.Parsetree.Pctf_extension x0 ->
      To.Parsetree.Pctf_extension
        (copy_extension x0)

and copy_extension :
  From.Parsetree.extension ->
    To.Parsetree.extension
  =
  fun x  ->
    let (x0,x1) = x  in
    ((copy_loc (fun x  -> x) x0),
      (copy_payload (from_loc x0) x1))

and copy_class_infos :
  'f0 'g0 .
    ('f0 -> 'g0) ->
      'f0 From.Parsetree.class_infos ->
        'g0 To.Parsetree.class_infos
  =
  fun f0  ->
    fun
      { From.Parsetree.pci_virt = pci_virt;
        From.Parsetree.pci_params = pci_params;
        From.Parsetree.pci_name = pci_name;
        From.Parsetree.pci_expr = pci_expr;
        From.Parsetree.pci_loc = pci_loc;
        From.Parsetree.pci_attributes = pci_attributes }
       ->
      {
        To.Parsetree.pci_virt =
          (copy_virtual_flag pci_virt);
        To.Parsetree.pci_params =
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                ((copy_core_type x0),
                  (copy_variance x1))) pci_params);
        To.Parsetree.pci_name =
          (copy_loc (fun x  -> x) pci_name);
        To.Parsetree.pci_expr = (f0 pci_expr);
        To.Parsetree.pci_loc =
          (copy_location pci_loc);
        To.Parsetree.pci_attributes =
          (copy_attributes pci_attributes)
      }

and copy_virtual_flag :
  From.Asttypes.virtual_flag ->
    To.Asttypes.virtual_flag
  =
  function
  | From.Asttypes.Virtual  -> To.Asttypes.Virtual
  | From.Asttypes.Concrete  -> To.Asttypes.Concrete

and copy_include_description :
  From.Parsetree.include_description ->
    To.Parsetree.include_description
  =
  fun x  ->
    copy_include_infos
      copy_module_type x

and copy_include_infos :
  'f0 'g0 .
    ('f0 -> 'g0) ->
      'f0 From.Parsetree.include_infos ->
        'g0 To.Parsetree.include_infos
  =
  fun f0  ->
    fun
      { From.Parsetree.pincl_mod = pincl_mod;
        From.Parsetree.pincl_loc = pincl_loc;
        From.Parsetree.pincl_attributes = pincl_attributes }
       ->
      {
        To.Parsetree.pincl_mod = (f0 pincl_mod);
        To.Parsetree.pincl_loc =
          (copy_location pincl_loc);
        To.Parsetree.pincl_attributes =
          (copy_attributes pincl_attributes)
      }

and copy_open_description :
  From.Parsetree.open_description ->
    To.Parsetree.open_description
  =
  fun
    { From.Parsetree.popen_lid = popen_lid;
      From.Parsetree.popen_override = popen_override;
      From.Parsetree.popen_loc = popen_loc;
      From.Parsetree.popen_attributes = popen_attributes }
     ->
    {
      To.Parsetree.popen_lid =
        (copy_loc copy_longident
           popen_lid);
      To.Parsetree.popen_override =
        (copy_override_flag popen_override);
      To.Parsetree.popen_loc =
        (copy_location popen_loc);
      To.Parsetree.popen_attributes =
        (copy_attributes popen_attributes)
    }

and copy_override_flag :
  From.Asttypes.override_flag ->
    To.Asttypes.override_flag
  =
  function
  | From.Asttypes.Override  -> To.Asttypes.Override
  | From.Asttypes.Fresh  -> To.Asttypes.Fresh

and copy_module_type_declaration :
  From.Parsetree.module_type_declaration ->
    To.Parsetree.module_type_declaration
  =
  fun
    { From.Parsetree.pmtd_name = pmtd_name;
      From.Parsetree.pmtd_type = pmtd_type;
      From.Parsetree.pmtd_attributes = pmtd_attributes;
      From.Parsetree.pmtd_loc = pmtd_loc }
     ->
    {
      To.Parsetree.pmtd_name =
        (copy_loc (fun x  -> x) pmtd_name);
      To.Parsetree.pmtd_type =
        (copy_option copy_module_type pmtd_type);
      To.Parsetree.pmtd_attributes =
        (copy_attributes pmtd_attributes);
      To.Parsetree.pmtd_loc =
        (copy_location pmtd_loc)
    }

and copy_module_declaration :
  From.Parsetree.module_declaration ->
    To.Parsetree.module_declaration
  =
  fun
    { From.Parsetree.pmd_name = pmd_name;
      From.Parsetree.pmd_type = pmd_type;
      From.Parsetree.pmd_attributes = pmd_attributes;
      From.Parsetree.pmd_loc = pmd_loc }
     ->
    {
      To.Parsetree.pmd_name =
        (copy_loc (fun x  -> x) pmd_name);
      To.Parsetree.pmd_type =
        (copy_module_type pmd_type);
      To.Parsetree.pmd_attributes =
        (copy_attributes pmd_attributes);
      To.Parsetree.pmd_loc =
        (copy_location pmd_loc)
    }

and copy_type_extension :
  From.Parsetree.type_extension ->
    To.Parsetree.type_extension
  =
  fun
    { From.Parsetree.ptyext_path = ptyext_path;
      From.Parsetree.ptyext_params = ptyext_params;
      From.Parsetree.ptyext_constructors = ptyext_constructors;
      From.Parsetree.ptyext_private = ptyext_private;
      From.Parsetree.ptyext_attributes = ptyext_attributes }
     ->
    {
      To.Parsetree.ptyext_path =
        (copy_loc copy_longident
           ptyext_path);
      To.Parsetree.ptyext_params =
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_core_type x0),
                (copy_variance x1))) ptyext_params);
      To.Parsetree.ptyext_constructors =
        (List.map copy_extension_constructor
           ptyext_constructors);
      To.Parsetree.ptyext_private =
        (copy_private_flag ptyext_private);
      To.Parsetree.ptyext_attributes =
        (copy_attributes ptyext_attributes)
    }

and copy_extension_constructor :
  From.Parsetree.extension_constructor ->
    To.Parsetree.extension_constructor
  =
  fun
    { From.Parsetree.pext_name = pext_name;
      From.Parsetree.pext_kind = pext_kind;
      From.Parsetree.pext_loc = pext_loc;
      From.Parsetree.pext_attributes = pext_attributes }
     ->
    {
      To.Parsetree.pext_name =
        (copy_loc (fun x  -> x) pext_name);
      To.Parsetree.pext_kind =
        (copy_extension_constructor_kind (from_loc pext_name) pext_kind);
      To.Parsetree.pext_loc =
        (copy_location pext_loc);
      To.Parsetree.pext_attributes =
        (copy_attributes pext_attributes)
    }

and copy_extension_constructor_kind loc :
  From.Parsetree.extension_constructor_kind ->
    To.Parsetree.extension_constructor_kind
  =
  function
  | From.Parsetree.Pext_decl (x0,x1) ->
      To.Parsetree.Pext_decl
        ((copy_constructor_arguments loc x0),
          (copy_option copy_core_type x1))
  | From.Parsetree.Pext_rebind x0 ->
      To.Parsetree.Pext_rebind
        (copy_loc copy_longident
           x0)

and copy_type_declaration :
  From.Parsetree.type_declaration ->
    To.Parsetree.type_declaration
  =
  fun
    { From.Parsetree.ptype_name = ptype_name;
      From.Parsetree.ptype_params = ptype_params;
      From.Parsetree.ptype_cstrs = ptype_cstrs;
      From.Parsetree.ptype_kind = ptype_kind;
      From.Parsetree.ptype_private = ptype_private;
      From.Parsetree.ptype_manifest = ptype_manifest;
      From.Parsetree.ptype_attributes = ptype_attributes;
      From.Parsetree.ptype_loc = ptype_loc }
     ->
    {
      To.Parsetree.ptype_name =
        (copy_loc (fun x  -> x) ptype_name);
      To.Parsetree.ptype_params =
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_core_type x0),
                (copy_variance x1))) ptype_params);
      To.Parsetree.ptype_cstrs =
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              ((copy_core_type x0),
                (copy_core_type x1),
                (copy_location x2))) ptype_cstrs);
      To.Parsetree.ptype_kind =
        (copy_type_kind ptype_kind);
      To.Parsetree.ptype_private =
        (copy_private_flag ptype_private);
      To.Parsetree.ptype_manifest =
        (copy_option copy_core_type ptype_manifest);
      To.Parsetree.ptype_attributes =
        (copy_attributes ptype_attributes);
      To.Parsetree.ptype_loc =
        (copy_location ptype_loc)
    }

and copy_private_flag :
  From.Asttypes.private_flag ->
    To.Asttypes.private_flag
  =
  function
  | From.Asttypes.Private  -> To.Asttypes.Private
  | From.Asttypes.Public  -> To.Asttypes.Public

and copy_type_kind :
  From.Parsetree.type_kind ->
    To.Parsetree.type_kind
  =
  function
  | From.Parsetree.Ptype_abstract  ->
      To.Parsetree.Ptype_abstract
  | From.Parsetree.Ptype_variant x0 ->
      To.Parsetree.Ptype_variant
        (List.map copy_constructor_declaration x0)
  | From.Parsetree.Ptype_record x0 ->
      To.Parsetree.Ptype_record
        (List.map copy_label_declaration x0)
  | From.Parsetree.Ptype_open  ->
      To.Parsetree.Ptype_open

and copy_constructor_declaration :
  From.Parsetree.constructor_declaration ->
    To.Parsetree.constructor_declaration
  =
  fun
    { From.Parsetree.pcd_name = pcd_name;
      From.Parsetree.pcd_args = pcd_args;
      From.Parsetree.pcd_res = pcd_res;
      From.Parsetree.pcd_loc = pcd_loc;
      From.Parsetree.pcd_attributes = pcd_attributes }
     ->
    {
      To.Parsetree.pcd_name =
        (copy_loc (fun x  -> x) pcd_name);
      To.Parsetree.pcd_args =
        (copy_constructor_arguments (from_loc pcd_name) pcd_args);
      To.Parsetree.pcd_res =
        (copy_option copy_core_type pcd_res);
      To.Parsetree.pcd_loc =
        (copy_location pcd_loc);
      To.Parsetree.pcd_attributes =
        (copy_attributes pcd_attributes)
    }

and copy_constructor_arguments loc :
  From.Parsetree.constructor_arguments ->
    To.Parsetree.core_type list
  =
  function
  | From.Parsetree.Pcstr_tuple x0 ->
      List.map copy_core_type x0
  | From.Parsetree.Pcstr_record _x0 ->
      migration_error loc Def.Pcstr_record

and copy_label_declaration :
  From.Parsetree.label_declaration ->
    To.Parsetree.label_declaration
  =
  fun
    { From.Parsetree.pld_name = pld_name;
      From.Parsetree.pld_mutable = pld_mutable;
      From.Parsetree.pld_type = pld_type;
      From.Parsetree.pld_loc = pld_loc;
      From.Parsetree.pld_attributes = pld_attributes }
     ->
    {
      To.Parsetree.pld_name =
        (copy_loc (fun x  -> x) pld_name);
      To.Parsetree.pld_mutable =
        (copy_mutable_flag pld_mutable);
      To.Parsetree.pld_type =
        (copy_core_type pld_type);
      To.Parsetree.pld_loc =
        (copy_location pld_loc);
      To.Parsetree.pld_attributes =
        (copy_attributes pld_attributes)
    }

and copy_mutable_flag :
  From.Asttypes.mutable_flag ->
    To.Asttypes.mutable_flag
  =
  function
  | From.Asttypes.Immutable  ->
      To.Asttypes.Immutable
  | From.Asttypes.Mutable  -> To.Asttypes.Mutable

and copy_variance :
  From.Asttypes.variance -> To.Asttypes.variance =
  function
  | From.Asttypes.Covariant  ->
      To.Asttypes.Covariant
  | From.Asttypes.Contravariant  ->
      To.Asttypes.Contravariant
  | From.Asttypes.Invariant  ->
      To.Asttypes.Invariant

and copy_value_description :
  From.Parsetree.value_description ->
    To.Parsetree.value_description
  =
  fun
    { From.Parsetree.pval_name = pval_name;
      From.Parsetree.pval_type = pval_type;
      From.Parsetree.pval_prim = pval_prim;
      From.Parsetree.pval_attributes = pval_attributes;
      From.Parsetree.pval_loc = pval_loc }
     ->
    {
      To.Parsetree.pval_name =
        (copy_loc (fun x  -> x) pval_name);
      To.Parsetree.pval_type =
        (copy_core_type pval_type);
      To.Parsetree.pval_prim =
        (List.map (fun x  -> x) pval_prim);
      To.Parsetree.pval_attributes =
        (copy_attributes pval_attributes);
      To.Parsetree.pval_loc =
        (copy_location pval_loc)
    }

and copy_arg_label :
  From.Asttypes.arg_label -> string
  =
  function
  | From.Asttypes.Nolabel  -> ""
  | From.Asttypes.Labelled x0 -> x0
  | From.Asttypes.Optional x0 -> "?" ^ x0

and copy_closed_flag :
  From.Asttypes.closed_flag ->
    To.Asttypes.closed_flag
  =
  function
  | From.Asttypes.Closed  -> To.Asttypes.Closed
  | From.Asttypes.Open  -> To.Asttypes.Open

and copy_label :
  From.Asttypes.label -> To.Asttypes.label =
  fun x  -> x

and copy_rec_flag :
  From.Asttypes.rec_flag -> To.Asttypes.rec_flag =
  function
  | From.Asttypes.Nonrecursive  ->
      To.Asttypes.Nonrecursive
  | From.Asttypes.Recursive  ->
      To.Asttypes.Recursive

and copy_constant loc :
  From.Parsetree.constant -> To.Asttypes.constant
  =
  function
  | From.Parsetree.Pconst_integer (x0,x1) ->
     begin match x1 with
     | None -> To.Asttypes.Const_int (int_of_string x0)
     | Some 'l' ->
         To.Asttypes.Const_int32 (Int32.of_string x0)
     | Some 'L' ->
         To.Asttypes.Const_int64 (Int64.of_string x0)
     | Some 'n' ->
         To.Asttypes.Const_nativeint (Nativeint.of_string x0)
     | Some _ -> migration_error loc Def.Pconst_integer
     end
  | From.Parsetree.Pconst_char x0 ->
      To.Asttypes.Const_char x0
  | From.Parsetree.Pconst_string (x0,x1) ->
      To.Asttypes.Const_string (x0,x1)
  | From.Parsetree.Pconst_float (x0,x1) ->
      begin match x1 with
      | None -> To.Asttypes.Const_float x0
      | Some _ -> migration_error loc Def.Pconst_float
      end

and copy_option : 'f0 'g0 . ('f0 -> 'g0) -> 'f0 option -> 'g0 option =
  fun f0  -> function | None  -> None | Some x0 -> Some (f0 x0)

and copy_longident : From.Longident.t -> To.Longident.t = function
  | From.Longident.Lident x0 ->
      To.Longident.Lident x0
  | From.Longident.Ldot (x0,x1) ->
      To.Longident.Ldot
        ((copy_longident x0), x1)
  | From.Longident.Lapply (x0,x1) ->
      To.Longident.Lapply
        ((copy_longident x0), (copy_longident x1))

and copy_loc :
  'f0 'g0 .
    ('f0 -> 'g0) ->
      'f0 From.Asttypes.loc -> 'g0 To.Asttypes.loc
  =
  fun f0  ->
    fun
      { From.Asttypes.txt = txt;
        From.Asttypes.loc = loc }
       ->
      {
        To.Asttypes.txt = (f0 txt);
        To.Asttypes.loc = copy_location loc
      }

and copy_location :
  From.Location.t -> To.Location.t =
  fun
    { From.Location.loc_start = loc_start;
      From.Location.loc_end = loc_end;
      From.Location.loc_ghost = loc_ghost }
     ->
    {
      To.Location.loc_start = (copy_Lexing_position loc_start);
      To.Location.loc_end = (copy_Lexing_position loc_end);
      To.Location.loc_ghost = (copy_bool loc_ghost)
    }

and copy_bool : bool -> bool = function | false  -> false | true  -> true

and copy_Lexing_position : Lexing.position -> Lexing.position =
  fun
    { Lexing.pos_fname = pos_fname; Lexing.pos_lnum = pos_lnum;
      Lexing.pos_bol = pos_bol; Lexing.pos_cnum = pos_cnum }
     ->
    {
      Lexing.pos_fname = pos_fname;
      Lexing.pos_lnum = pos_lnum;
      Lexing.pos_bol = pos_bol;
      Lexing.pos_cnum = pos_cnum
    }

and type_declarations recflag types =
  match
    (recflag, List.map copy_type_declaration types)
  with
  | From.Asttypes.Recursive, types -> types
  | From.Asttypes.Nonrecursive, [] -> []
  | From.Asttypes.Nonrecursive, (x :: xs) ->
      let pos = {Lexing. pos_fname = "_none_"; pos_lnum = 1;
                 pos_bol = 0; pos_cnum = -1} in
      let loc = {To.Location. loc_start = pos; loc_end = pos;
                 loc_ghost = true} in
      let ptype_attributes =
        ({To.Asttypes.txt = "nonrec"; loc}, To.Parsetree.PStr []) ::
        x.To.Parsetree.ptype_attributes
      in
      {x with To.Parsetree.ptype_attributes} :: xs

let rec copy_out_phrase :
  From.Outcometree.out_phrase -> To.Outcometree.out_phrase =
  function
  | From.Outcometree.Ophr_eval (x0,x1) ->
      To.Outcometree.Ophr_eval
        ((copy_out_value x0),
          (copy_out_type x1))
  | From.Outcometree.Ophr_signature x0 ->
      To.Outcometree.Ophr_signature
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_out_sig_item x0),
                (copy_option copy_out_value x1))) x0)
  | From.Outcometree.Ophr_exception x0 ->
      To.Outcometree.Ophr_exception
        (let (x0,x1) = x0  in
         ((copy_exn x0), (copy_out_value x1)))

and copy_exn : exn -> exn = fun x  -> x

and copy_out_sig_item :
  From.Outcometree.out_sig_item -> To.Outcometree.out_sig_item =
  function
  | From.Outcometree.Osig_class (x0,x1,x2,x3,x4) ->
      To.Outcometree.Osig_class
        ((copy_bool x0), x1,
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                (x0, (let (x0,x1) = x1  in ((copy_bool x0), (copy_bool x1)))))
             x2), (copy_out_class_type x3),
          (copy_out_rec_status x4))
  | From.Outcometree.Osig_class_type (x0,x1,x2,x3,x4) ->
      To.Outcometree.Osig_class_type
        ((copy_bool x0), x1,
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                (x0, (let (x0,x1) = x1  in ((copy_bool x0), (copy_bool x1)))))
             x2), (copy_out_class_type x3),
          (copy_out_rec_status x4))
  | From.Outcometree.Osig_typext (x0,x1) ->
      To.Outcometree.Osig_typext
        ((copy_out_extension_constructor x0),
          (copy_out_ext_status x1))
  | From.Outcometree.Osig_modtype (x0,x1) ->
      To.Outcometree.Osig_modtype
        (x0, (copy_out_module_type x1))
  | From.Outcometree.Osig_module (x0,x1,x2) ->
      To.Outcometree.Osig_module
        (x0, (copy_out_module_type x1),
          (copy_out_rec_status x2))
  | From.Outcometree.Osig_type (x0,x1) ->
      To.Outcometree.Osig_type
        ((copy_out_type_decl x0),
          (copy_out_rec_status x1))
  | From.Outcometree.Osig_value x0 -> copy_out_val_decl x0
  | From.Outcometree.Osig_ellipsis ->
      To.Outcometree.Osig_value ("...", To.Outcometree.Otyp_abstract, [])

and copy_out_val_decl :
  From.Outcometree.out_val_decl -> To.Outcometree.out_sig_item =
  fun
    { From.Outcometree.oval_name = oval_name;
      From.Outcometree.oval_type = oval_type;
      From.Outcometree.oval_prims = oval_prims;
      From.Outcometree.oval_attributes = _ }
     ->
       To.Outcometree.Osig_value (
         oval_name,
         copy_out_type oval_type,
         List.map (fun x  -> x) oval_prims
       )

and copy_out_type_decl :
  From.Outcometree.out_type_decl -> To.Outcometree.out_type_decl =
  fun
    { From.Outcometree.otype_name = otype_name;
      From.Outcometree.otype_params = otype_params;
      From.Outcometree.otype_type = otype_type;
      From.Outcometree.otype_private = otype_private;
      From.Outcometree.otype_immediate = _;
      From.Outcometree.otype_cstrs = otype_cstrs }
     ->
    {
      To.Outcometree.otype_name = otype_name;
      To.Outcometree.otype_params =
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              (x0, (let (x0,x1) = x1  in ((copy_bool x0), (copy_bool x1)))))
           otype_params);
      To.Outcometree.otype_type =
        (copy_out_type otype_type);
      To.Outcometree.otype_private =
        (copy_From_Asttypes_private_flag otype_private);
      (*To.Outcometree.otype_immediate = (copy_bool otype_immediate);*)
      To.Outcometree.otype_cstrs =
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_out_type x0),
                (copy_out_type x1))) otype_cstrs)
    }

and copy_out_module_type :
  From.Outcometree.out_module_type -> To.Outcometree.out_module_type
  =
  function
  | From.Outcometree.Omty_abstract  -> To.Outcometree.Omty_abstract
  | From.Outcometree.Omty_functor (x0,x1,x2) ->
      To.Outcometree.Omty_functor
        (x0, (copy_option copy_out_module_type x1),
          (copy_out_module_type x2))
  | From.Outcometree.Omty_ident x0 ->
      To.Outcometree.Omty_ident (copy_out_ident x0)
  | From.Outcometree.Omty_signature x0 ->
      To.Outcometree.Omty_signature
        (List.map copy_out_sig_item x0)
  | From.Outcometree.Omty_alias x0 ->
      To.Outcometree.Omty_alias (copy_out_ident x0)

and copy_out_ext_status :
  From.Outcometree.out_ext_status -> To.Outcometree.out_ext_status =
  function
  | From.Outcometree.Oext_first  -> To.Outcometree.Oext_first
  | From.Outcometree.Oext_next  -> To.Outcometree.Oext_next
  | From.Outcometree.Oext_exception  -> To.Outcometree.Oext_exception

and copy_out_extension_constructor :
  From.Outcometree.out_extension_constructor ->
    To.Outcometree.out_extension_constructor
  =
  fun
    { From.Outcometree.oext_name = oext_name;
      From.Outcometree.oext_type_name = oext_type_name;
      From.Outcometree.oext_type_params = oext_type_params;
      From.Outcometree.oext_args = oext_args;
      From.Outcometree.oext_ret_type = oext_ret_type;
      From.Outcometree.oext_private = oext_private }
     ->
    {
      To.Outcometree.oext_name = oext_name;
      To.Outcometree.oext_type_name = oext_type_name;
      To.Outcometree.oext_type_params =
        (List.map (fun x  -> x) oext_type_params);
      To.Outcometree.oext_args =
        (List.map copy_out_type oext_args);
      To.Outcometree.oext_ret_type =
        (copy_option copy_out_type oext_ret_type);
      To.Outcometree.oext_private =
        (copy_From_Asttypes_private_flag oext_private)
    }

and copy_From_Asttypes_private_flag :
  From.Asttypes.private_flag -> To.Asttypes.private_flag =
  function
  | From.Asttypes.Private  -> To.Asttypes.Private
  | From.Asttypes.Public  -> To.Asttypes.Public

and copy_out_rec_status :
  From.Outcometree.out_rec_status -> To.Outcometree.out_rec_status =
  function
  | From.Outcometree.Orec_not  -> To.Outcometree.Orec_not
  | From.Outcometree.Orec_first  -> To.Outcometree.Orec_first
  | From.Outcometree.Orec_next  -> To.Outcometree.Orec_next

and copy_out_class_type :
  From.Outcometree.out_class_type -> To.Outcometree.out_class_type =
  function
  | From.Outcometree.Octy_constr (x0,x1) ->
      To.Outcometree.Octy_constr
        ((copy_out_ident x0),
          (List.map copy_out_type x1))
  | From.Outcometree.Octy_arrow (x0,x1,x2) ->
      To.Outcometree.Octy_arrow
        (x0, (copy_out_type x1),
          (copy_out_class_type x2))
  | From.Outcometree.Octy_signature (x0,x1) ->
      To.Outcometree.Octy_signature
        ((copy_option copy_out_type x0),
          (List.map copy_out_class_sig_item x1))

and copy_out_class_sig_item :
  From.Outcometree.out_class_sig_item ->
    To.Outcometree.out_class_sig_item
  =
  function
  | From.Outcometree.Ocsg_constraint (x0,x1) ->
      To.Outcometree.Ocsg_constraint
        ((copy_out_type x0),
          (copy_out_type x1))
  | From.Outcometree.Ocsg_method (x0,x1,x2,x3) ->
      To.Outcometree.Ocsg_method
        (x0, (copy_bool x1), (copy_bool x2),
          (copy_out_type x3))
  | From.Outcometree.Ocsg_value (x0,x1,x2,x3) ->
      To.Outcometree.Ocsg_value
        (x0, (copy_bool x1), (copy_bool x2),
          (copy_out_type x3))

and copy_out_type :
  From.Outcometree.out_type -> To.Outcometree.out_type =
  function
  | From.Outcometree.Otyp_abstract  -> To.Outcometree.Otyp_abstract
  | From.Outcometree.Otyp_open  -> To.Outcometree.Otyp_open
  | From.Outcometree.Otyp_alias (x0,x1) ->
      To.Outcometree.Otyp_alias
        ((copy_out_type x0), x1)
  | From.Outcometree.Otyp_arrow (x0,x1,x2) ->
      To.Outcometree.Otyp_arrow
        (x0, (copy_out_type x1),
          (copy_out_type x2))
  | From.Outcometree.Otyp_class (x0,x1,x2) ->
      To.Outcometree.Otyp_class
        ((copy_bool x0), (copy_out_ident x1),
          (List.map copy_out_type x2))
  | From.Outcometree.Otyp_constr (x0,x1) ->
      To.Outcometree.Otyp_constr
        ((copy_out_ident x0),
          (List.map copy_out_type x1))
  | From.Outcometree.Otyp_manifest (x0,x1) ->
      To.Outcometree.Otyp_manifest
        ((copy_out_type x0),
          (copy_out_type x1))
  | From.Outcometree.Otyp_object (x0,x1) ->
      To.Outcometree.Otyp_object
        ((List.map
            (fun x  ->
               let (x0,x1) = x  in
               (x0, (copy_out_type x1))) x0),
          (copy_option copy_bool x1))
  | From.Outcometree.Otyp_record x0 ->
      To.Outcometree.Otyp_record
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              (x0, (copy_bool x1), (copy_out_type x2)))
           x0)
  | From.Outcometree.Otyp_stuff x0 -> To.Outcometree.Otyp_stuff x0
  | From.Outcometree.Otyp_sum x0 ->
      To.Outcometree.Otyp_sum
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              (x0, (List.map copy_out_type x1),
                (copy_option copy_out_type x2))) x0)
  | From.Outcometree.Otyp_tuple x0 ->
      To.Outcometree.Otyp_tuple
        (List.map copy_out_type x0)
  | From.Outcometree.Otyp_var (x0,x1) ->
      To.Outcometree.Otyp_var ((copy_bool x0), x1)
  | From.Outcometree.Otyp_variant (x0,x1,x2,x3) ->
      To.Outcometree.Otyp_variant
        ((copy_bool x0), (copy_out_variant x1),
          (copy_bool x2),
          (copy_option (fun x  -> List.map (fun x  -> x) x) x3))
  | From.Outcometree.Otyp_poly (x0,x1) ->
      To.Outcometree.Otyp_poly
        ((List.map (fun x  -> x) x0), (copy_out_type x1))
  | From.Outcometree.Otyp_module (x0,x1,x2) ->
      To.Outcometree.Otyp_module
        (x0, (List.map (fun x  -> x) x1),
          (List.map copy_out_type x2))
  | From.Outcometree.Otyp_attribute (_x0,_x1) ->
      To.Outcometree.Otyp_abstract
      (*To.Outcometree.Otyp_attribute
        ((copy_out_type x0),
          (copy_out_attribute x1))*)

(*and copy_out_attribute :
  From.Outcometree.out_attribute -> To.Outcometree.out_attribute =
  fun { From.Outcometree.oattr_name = oattr_name }  ->
    { To.Outcometree.oattr_name = oattr_name }*)

and copy_out_variant :
  From.Outcometree.out_variant -> To.Outcometree.out_variant =
  function
  | From.Outcometree.Ovar_fields x0 ->
      To.Outcometree.Ovar_fields
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              (x0, (copy_bool x1),
                (List.map copy_out_type x2))) x0)
  | From.Outcometree.Ovar_name (x0,x1) ->
      To.Outcometree.Ovar_name
        ((copy_out_ident x0),
          (List.map copy_out_type x1))

and copy_out_value :
  From.Outcometree.out_value -> To.Outcometree.out_value =
  function
  | From.Outcometree.Oval_array x0 ->
      To.Outcometree.Oval_array
        (List.map copy_out_value x0)
  | From.Outcometree.Oval_char x0 -> To.Outcometree.Oval_char x0
  | From.Outcometree.Oval_constr (x0,x1) ->
      To.Outcometree.Oval_constr
        ((copy_out_ident x0),
          (List.map copy_out_value x1))
  | From.Outcometree.Oval_ellipsis  -> To.Outcometree.Oval_ellipsis
  | From.Outcometree.Oval_float x0 ->
      To.Outcometree.Oval_float (copy_float x0)
  | From.Outcometree.Oval_int x0 -> To.Outcometree.Oval_int x0
  | From.Outcometree.Oval_int32 x0 -> To.Outcometree.Oval_int32 x0
  | From.Outcometree.Oval_int64 x0 -> To.Outcometree.Oval_int64 x0
  | From.Outcometree.Oval_nativeint x0 ->
      To.Outcometree.Oval_nativeint x0
  | From.Outcometree.Oval_list x0 ->
      To.Outcometree.Oval_list
        (List.map copy_out_value x0)
  | From.Outcometree.Oval_printer x0 ->
      To.Outcometree.Oval_printer x0
  | From.Outcometree.Oval_record x0 ->
      To.Outcometree.Oval_record
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_out_ident x0),
                (copy_out_value x1))) x0)
  | From.Outcometree.Oval_string x0 -> To.Outcometree.Oval_string x0
  | From.Outcometree.Oval_stuff x0 -> To.Outcometree.Oval_stuff x0
  | From.Outcometree.Oval_tuple x0 ->
      To.Outcometree.Oval_tuple
        (List.map copy_out_value x0)
  | From.Outcometree.Oval_variant (x0,x1) ->
      To.Outcometree.Oval_variant
        (x0, (copy_option copy_out_value x1))

and copy_float : float -> float = fun x  -> x

and copy_out_ident :
  From.Outcometree.out_ident -> To.Outcometree.out_ident =
  function
  | From.Outcometree.Oide_apply (x0,x1) ->
      To.Outcometree.Oide_apply
        ((copy_out_ident x0),
          (copy_out_ident x1))
  | From.Outcometree.Oide_dot (x0,x1) ->
      To.Outcometree.Oide_dot
        ((copy_out_ident x0), x1)
  | From.Outcometree.Oide_ident x0 -> To.Outcometree.Oide_ident x0

let rec copy_toplevel_phrase :
  From.Parsetree.toplevel_phrase -> To.Parsetree.toplevel_phrase =
  function
  | From.Parsetree.Ptop_def x0 ->
      To.Parsetree.Ptop_def (copy_structure x0)
  | From.Parsetree.Ptop_dir (x0,x1) ->
      To.Parsetree.Ptop_dir
        (x0, (copy_directive_argument x1))

and copy_directive_argument :
  From.Parsetree.directive_argument ->
    To.Parsetree.directive_argument
  =
  function
  | From.Parsetree.Pdir_none  -> To.Parsetree.Pdir_none
  | From.Parsetree.Pdir_string x0 -> To.Parsetree.Pdir_string x0
  | From.Parsetree.Pdir_int (x0,_x1) ->
      To.Parsetree.Pdir_int (int_of_string x0)
  | From.Parsetree.Pdir_ident x0 ->
      To.Parsetree.Pdir_ident (copy_longident x0)
  | From.Parsetree.Pdir_bool x0 ->
      To.Parsetree.Pdir_bool (copy_bool x0)

let copy_out_type_extension :
  From.Outcometree.out_type_extension -> To.Outcometree.out_type_extension =
  fun
    { From.Outcometree.otyext_name = otyext_name;
      From.Outcometree.otyext_params = otyext_params;
      From.Outcometree.otyext_constructors = otyext_constructors;
      From.Outcometree.otyext_private = otyext_private }
     ->
    {
      To.Outcometree.otyext_name = otyext_name;
      To.Outcometree.otyext_params =
        (List.map (fun x  -> x) otyext_params);
      To.Outcometree.otyext_constructors =
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              (x0, (List.map copy_out_type x1),
                (copy_option copy_out_type x2)))
           otyext_constructors);
      To.Outcometree.otyext_private =
        (copy_private_flag otyext_private)
    }

let copy_cases x = List.map copy_case x
let copy_pat = copy_pattern
let copy_expr = copy_expression
let copy_typ = copy_core_type

end
module Migrate_parsetree_402_403
= struct
#1 "migrate_parsetree_402_403.ml"
# 1 "src/migrate_parsetree_402_403.ml"
(**************************************************************************)
(*                                                                        *)
(*                         OCaml Migrate Parsetree                        *)
(*                                                                        *)
(*                             Frédéric Bour                              *)
(*                                                                        *)
(*   Copyright 2017 Institut National de Recherche en Informatique et     *)
(*     en Automatique (INRIA).                                            *)
(*                                                                        *)
(*   All rights reserved.  This file is distributed under the terms of    *)
(*   the GNU Lesser General Public License version 2.1, with the          *)
(*   special exception on linking described in the file LICENSE.          *)
(*                                                                        *)
(**************************************************************************)

include Migrate_parsetree_402_403_migrate

(*$ open Printf
    let fields = [
      "attribute"; "attributes"; "case"; "cases"; "class_declaration";
      "class_description"; "class_expr"; "class_field"; "class_signature";
      "class_structure"; "class_type"; "class_type_declaration";
      "class_type_field"; "constructor_declaration"; "expr"; "extension";
      "extension_constructor"; "include_declaration"; "include_description";
      "label_declaration"; "location"; "module_binding"; "module_declaration";
      "module_expr"; "module_type"; "module_type_declaration";
      "open_description"; "pat"; "signature"; "signature_item"; "structure";
      "structure_item"; "typ"; "type_declaration"; "type_extension";
      "type_kind"; "value_binding"; "value_description";
      "with_constraint"
    ]
  let foreach_field f =
    printf "\n";
    List.iter f fields
*)(*$*)

let copy_mapper = fun
  ({ From.Ast_mapper.
     (*$ foreach_field (printf "%s;\n")*)
     attribute;
     attributes;
     case;
     cases;
     class_declaration;
     class_description;
     class_expr;
     class_field;
     class_signature;
     class_structure;
     class_type;
     class_type_declaration;
     class_type_field;
     constructor_declaration;
     expr;
     extension;
     extension_constructor;
     include_declaration;
     include_description;
     label_declaration;
     location;
     module_binding;
     module_declaration;
     module_expr;
     module_type;
     module_type_declaration;
     open_description;
     pat;
     signature;
     signature_item;
     structure;
     structure_item;
     typ;
     type_declaration;
     type_extension;
     type_kind;
     value_binding;
     value_description;
     with_constraint;
     (*$*)
     payload
   } as mapper) ->
  let module R = Migrate_parsetree_403_402_migrate in
  {
    To.Ast_mapper.
    (*$ foreach_field (fun s ->
          printf
          "%s = (fun _ x -> copy_%s (%s mapper (R.copy_%s x)));\n" s s s s)
    *)
    attribute = (fun _ x -> copy_attribute (attribute mapper (R.copy_attribute x)));
    attributes = (fun _ x -> copy_attributes (attributes mapper (R.copy_attributes x)));
    case = (fun _ x -> copy_case (case mapper (R.copy_case x)));
    cases = (fun _ x -> copy_cases (cases mapper (R.copy_cases x)));
    class_declaration = (fun _ x -> copy_class_declaration (class_declaration mapper (R.copy_class_declaration x)));
    class_description = (fun _ x -> copy_class_description (class_description mapper (R.copy_class_description x)));
    class_expr = (fun _ x -> copy_class_expr (class_expr mapper (R.copy_class_expr x)));
    class_field = (fun _ x -> copy_class_field (class_field mapper (R.copy_class_field x)));
    class_signature = (fun _ x -> copy_class_signature (class_signature mapper (R.copy_class_signature x)));
    class_structure = (fun _ x -> copy_class_structure (class_structure mapper (R.copy_class_structure x)));
    class_type = (fun _ x -> copy_class_type (class_type mapper (R.copy_class_type x)));
    class_type_declaration = (fun _ x -> copy_class_type_declaration (class_type_declaration mapper (R.copy_class_type_declaration x)));
    class_type_field = (fun _ x -> copy_class_type_field (class_type_field mapper (R.copy_class_type_field x)));
    constructor_declaration = (fun _ x -> copy_constructor_declaration (constructor_declaration mapper (R.copy_constructor_declaration x)));
    expr = (fun _ x -> copy_expr (expr mapper (R.copy_expr x)));
    extension = (fun _ x -> copy_extension (extension mapper (R.copy_extension x)));
    extension_constructor = (fun _ x -> copy_extension_constructor (extension_constructor mapper (R.copy_extension_constructor x)));
    include_declaration = (fun _ x -> copy_include_declaration (include_declaration mapper (R.copy_include_declaration x)));
    include_description = (fun _ x -> copy_include_description (include_description mapper (R.copy_include_description x)));
    label_declaration = (fun _ x -> copy_label_declaration (label_declaration mapper (R.copy_label_declaration x)));
    location = (fun _ x -> copy_location (location mapper (R.copy_location x)));
    module_binding = (fun _ x -> copy_module_binding (module_binding mapper (R.copy_module_binding x)));
    module_declaration = (fun _ x -> copy_module_declaration (module_declaration mapper (R.copy_module_declaration x)));
    module_expr = (fun _ x -> copy_module_expr (module_expr mapper (R.copy_module_expr x)));
    module_type = (fun _ x -> copy_module_type (module_type mapper (R.copy_module_type x)));
    module_type_declaration = (fun _ x -> copy_module_type_declaration (module_type_declaration mapper (R.copy_module_type_declaration x)));
    open_description = (fun _ x -> copy_open_description (open_description mapper (R.copy_open_description x)));
    pat = (fun _ x -> copy_pat (pat mapper (R.copy_pat x)));
    signature = (fun _ x -> copy_signature (signature mapper (R.copy_signature x)));
    signature_item = (fun _ x -> copy_signature_item (signature_item mapper (R.copy_signature_item x)));
    structure = (fun _ x -> copy_structure (structure mapper (R.copy_structure x)));
    structure_item = (fun _ x -> copy_structure_item (structure_item mapper (R.copy_structure_item x)));
    typ = (fun _ x -> copy_typ (typ mapper (R.copy_typ x)));
    type_declaration = (fun _ x -> copy_type_declaration (type_declaration mapper (R.copy_type_declaration x)));
    type_extension = (fun _ x -> copy_type_extension (type_extension mapper (R.copy_type_extension x)));
    type_kind = (fun _ x -> copy_type_kind (type_kind mapper (R.copy_type_kind x)));
    value_binding = (fun _ x -> copy_value_binding (value_binding mapper (R.copy_value_binding x)));
    value_description = (fun _ x -> copy_value_description (value_description mapper (R.copy_value_description x)));
    with_constraint = (fun _ x -> copy_with_constraint (with_constraint mapper (R.copy_with_constraint x)));
    (*$*)
    payload = (fun _ x -> copy_payload (payload mapper (R.copy_payload Location.none x)))
  }

end
module Migrate_parsetree_403_402
= struct
#1 "migrate_parsetree_403_402.ml"
# 1 "src/migrate_parsetree_403_402.ml"
(**************************************************************************)
(*                                                                        *)
(*                         OCaml Migrate Parsetree                        *)
(*                                                                        *)
(*                             Frédéric Bour                              *)
(*                                                                        *)
(*   Copyright 2017 Institut National de Recherche en Informatique et     *)
(*     en Automatique (INRIA).                                            *)
(*                                                                        *)
(*   All rights reserved.  This file is distributed under the terms of    *)
(*   the GNU Lesser General Public License version 2.1, with the          *)
(*   special exception on linking described in the file LICENSE.          *)
(*                                                                        *)
(**************************************************************************)

include Migrate_parsetree_403_402_migrate

(*$ open Printf
    let fields = [
      "attribute"; "attributes"; "case"; "cases"; "class_declaration";
      "class_description"; "class_expr"; "class_field"; "class_signature";
      "class_structure"; "class_type"; "class_type_declaration";
      "class_type_field"; "constructor_declaration"; "expr"; "extension";
      "extension_constructor"; "include_declaration"; "include_description";
      "label_declaration"; "location"; "module_binding"; "module_declaration";
      "module_expr"; "module_type"; "module_type_declaration";
      "open_description"; "pat"; "signature"; "signature_item"; "structure";
      "structure_item"; "typ"; "type_declaration"; "type_extension";
      "type_kind"; "value_binding"; "value_description";
      "with_constraint"
    ]
  let foreach_field f =
    printf "\n";
    List.iter f fields
*)(*$*)

let copy_mapper = fun
  ({ From.Ast_mapper.
     (*$ foreach_field (printf "%s;\n")*)
     attribute;
     attributes;
     case;
     cases;
     class_declaration;
     class_description;
     class_expr;
     class_field;
     class_signature;
     class_structure;
     class_type;
     class_type_declaration;
     class_type_field;
     constructor_declaration;
     expr;
     extension;
     extension_constructor;
     include_declaration;
     include_description;
     label_declaration;
     location;
     module_binding;
     module_declaration;
     module_expr;
     module_type;
     module_type_declaration;
     open_description;
     pat;
     signature;
     signature_item;
     structure;
     structure_item;
     typ;
     type_declaration;
     type_extension;
     type_kind;
     value_binding;
     value_description;
     with_constraint;
     (*$*)
     payload
   } as mapper) ->
  let module R = Migrate_parsetree_402_403_migrate in
  {
    To.Ast_mapper.
    (*$ foreach_field (fun s ->
          printf
          "%s = (fun _ x -> copy_%s (%s mapper (R.copy_%s x)));\n" s s s s)
    *)
    attribute = (fun _ x -> copy_attribute (attribute mapper (R.copy_attribute x)));
    attributes = (fun _ x -> copy_attributes (attributes mapper (R.copy_attributes x)));
    case = (fun _ x -> copy_case (case mapper (R.copy_case x)));
    cases = (fun _ x -> copy_cases (cases mapper (R.copy_cases x)));
    class_declaration = (fun _ x -> copy_class_declaration (class_declaration mapper (R.copy_class_declaration x)));
    class_description = (fun _ x -> copy_class_description (class_description mapper (R.copy_class_description x)));
    class_expr = (fun _ x -> copy_class_expr (class_expr mapper (R.copy_class_expr x)));
    class_field = (fun _ x -> copy_class_field (class_field mapper (R.copy_class_field x)));
    class_signature = (fun _ x -> copy_class_signature (class_signature mapper (R.copy_class_signature x)));
    class_structure = (fun _ x -> copy_class_structure (class_structure mapper (R.copy_class_structure x)));
    class_type = (fun _ x -> copy_class_type (class_type mapper (R.copy_class_type x)));
    class_type_declaration = (fun _ x -> copy_class_type_declaration (class_type_declaration mapper (R.copy_class_type_declaration x)));
    class_type_field = (fun _ x -> copy_class_type_field (class_type_field mapper (R.copy_class_type_field x)));
    constructor_declaration = (fun _ x -> copy_constructor_declaration (constructor_declaration mapper (R.copy_constructor_declaration x)));
    expr = (fun _ x -> copy_expr (expr mapper (R.copy_expr x)));
    extension = (fun _ x -> copy_extension (extension mapper (R.copy_extension x)));
    extension_constructor = (fun _ x -> copy_extension_constructor (extension_constructor mapper (R.copy_extension_constructor x)));
    include_declaration = (fun _ x -> copy_include_declaration (include_declaration mapper (R.copy_include_declaration x)));
    include_description = (fun _ x -> copy_include_description (include_description mapper (R.copy_include_description x)));
    label_declaration = (fun _ x -> copy_label_declaration (label_declaration mapper (R.copy_label_declaration x)));
    location = (fun _ x -> copy_location (location mapper (R.copy_location x)));
    module_binding = (fun _ x -> copy_module_binding (module_binding mapper (R.copy_module_binding x)));
    module_declaration = (fun _ x -> copy_module_declaration (module_declaration mapper (R.copy_module_declaration x)));
    module_expr = (fun _ x -> copy_module_expr (module_expr mapper (R.copy_module_expr x)));
    module_type = (fun _ x -> copy_module_type (module_type mapper (R.copy_module_type x)));
    module_type_declaration = (fun _ x -> copy_module_type_declaration (module_type_declaration mapper (R.copy_module_type_declaration x)));
    open_description = (fun _ x -> copy_open_description (open_description mapper (R.copy_open_description x)));
    pat = (fun _ x -> copy_pat (pat mapper (R.copy_pat x)));
    signature = (fun _ x -> copy_signature (signature mapper (R.copy_signature x)));
    signature_item = (fun _ x -> copy_signature_item (signature_item mapper (R.copy_signature_item x)));
    structure = (fun _ x -> copy_structure (structure mapper (R.copy_structure x)));
    structure_item = (fun _ x -> copy_structure_item (structure_item mapper (R.copy_structure_item x)));
    typ = (fun _ x -> copy_typ (typ mapper (R.copy_typ x)));
    type_declaration = (fun _ x -> copy_type_declaration (type_declaration mapper (R.copy_type_declaration x)));
    type_extension = (fun _ x -> copy_type_extension (type_extension mapper (R.copy_type_extension x)));
    type_kind = (fun _ x -> copy_type_kind (type_kind mapper (R.copy_type_kind x)));
    value_binding = (fun _ x -> copy_value_binding (value_binding mapper (R.copy_value_binding x)));
    value_description = (fun _ x -> copy_value_description (value_description mapper (R.copy_value_description x)));
    with_constraint = (fun _ x -> copy_with_constraint (with_constraint mapper (R.copy_with_constraint x)));
    (*$*)
    payload = (fun _ x -> copy_payload Location.none (payload mapper (R.copy_payload x)))
  }

end
module Migrate_parsetree_403_404_migrate
= struct
#1 "migrate_parsetree_403_404_migrate.ml"
# 1 "src/migrate_parsetree_403_404_migrate.ml"
(**************************************************************************)
(*                                                                        *)
(*                         OCaml Migrate Parsetree                        *)
(*                                                                        *)
(*                             Frédéric Bour                              *)
(*                         Alain Frisch, LexiFi                           *)
(*                                                                        *)
(*   Copyright 2017 Institut National de Recherche en Informatique et     *)
(*     en Automatique (INRIA).                                            *)
(*                                                                        *)
(*   All rights reserved.  This file is distributed under the terms of    *)
(*   the GNU Lesser General Public License version 2.1, with the          *)
(*   special exception on linking described in the file LICENSE.          *)
(*                                                                        *)
(**************************************************************************)

module From = Ast_403
module To = Ast_404

let rec copy_expression :
  From.Parsetree.expression ->
    To.Parsetree.expression
  =
  fun
    { From.Parsetree.pexp_desc = pexp_desc;
      From.Parsetree.pexp_loc = pexp_loc;
      From.Parsetree.pexp_attributes = pexp_attributes }
     ->
    {
      To.Parsetree.pexp_desc =
        (copy_expression_desc pexp_desc);
      To.Parsetree.pexp_loc =
        (copy_location pexp_loc);
      To.Parsetree.pexp_attributes =
        (copy_attributes pexp_attributes)
    }

and copy_expression_desc :
  From.Parsetree.expression_desc ->
    To.Parsetree.expression_desc
  =
  function
  | From.Parsetree.Pexp_ident x0 ->
      To.Parsetree.Pexp_ident
        (copy_loc copy_longident
           x0)
  | From.Parsetree.Pexp_constant x0 ->
      To.Parsetree.Pexp_constant
        (copy_constant x0)
  | From.Parsetree.Pexp_let (x0,x1,x2) ->
      To.Parsetree.Pexp_let
        ((copy_rec_flag x0),
          (List.map copy_value_binding x1),
          (copy_expression x2))
  | From.Parsetree.Pexp_function x0 ->
      To.Parsetree.Pexp_function
        (List.map copy_case x0)
  | From.Parsetree.Pexp_fun (x0,x1,x2,x3) ->
      To.Parsetree.Pexp_fun
        ((copy_arg_label x0),
          (copy_option copy_expression x1),
          (copy_pattern x2),
          (copy_expression x3))
  | From.Parsetree.Pexp_apply (x0,x1) ->
      To.Parsetree.Pexp_apply
        ((copy_expression x0),
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                ((copy_arg_label x0),
                  (copy_expression x1))) x1))
  | From.Parsetree.Pexp_match (x0,x1) ->
      To.Parsetree.Pexp_match
        ((copy_expression x0),
          (List.map copy_case x1))
  | From.Parsetree.Pexp_try (x0,x1) ->
      To.Parsetree.Pexp_try
        ((copy_expression x0),
          (List.map copy_case x1))
  | From.Parsetree.Pexp_tuple x0 ->
      To.Parsetree.Pexp_tuple
        (List.map copy_expression x0)
  | From.Parsetree.Pexp_construct (x0,x1) ->
      To.Parsetree.Pexp_construct
        ((copy_loc
            copy_longident x0),
          (copy_option copy_expression x1))
  | From.Parsetree.Pexp_variant (x0,x1) ->
      To.Parsetree.Pexp_variant
        ((copy_label x0),
          (copy_option copy_expression x1))
  | From.Parsetree.Pexp_record (x0,x1) ->
      To.Parsetree.Pexp_record
        ((List.map
            (fun x  ->
               let (x0,x1) = x  in
               ((copy_loc
                   copy_longident x0),
                 (copy_expression x1))) x0),
          (copy_option copy_expression x1))
  | From.Parsetree.Pexp_field (x0,x1) ->
      To.Parsetree.Pexp_field
        ((copy_expression x0),
          (copy_loc
             copy_longident x1))
  | From.Parsetree.Pexp_setfield (x0,x1,x2) ->
      To.Parsetree.Pexp_setfield
        ((copy_expression x0),
          (copy_loc
             copy_longident x1),
          (copy_expression x2))
  | From.Parsetree.Pexp_array x0 ->
      To.Parsetree.Pexp_array
        (List.map copy_expression x0)
  | From.Parsetree.Pexp_ifthenelse (x0,x1,x2) ->
      To.Parsetree.Pexp_ifthenelse
        ((copy_expression x0),
          (copy_expression x1),
          (copy_option copy_expression x2))
  | From.Parsetree.Pexp_sequence (x0,x1) ->
      To.Parsetree.Pexp_sequence
        ((copy_expression x0),
          (copy_expression x1))
  | From.Parsetree.Pexp_while (x0,x1) ->
      To.Parsetree.Pexp_while
        ((copy_expression x0),
          (copy_expression x1))
  | From.Parsetree.Pexp_for (x0,x1,x2,x3,x4) ->
      To.Parsetree.Pexp_for
        ((copy_pattern x0),
          (copy_expression x1),
          (copy_expression x2),
          (copy_direction_flag x3),
          (copy_expression x4))
  | From.Parsetree.Pexp_constraint (x0,x1) ->
      To.Parsetree.Pexp_constraint
        ((copy_expression x0),
          (copy_core_type x1))
  | From.Parsetree.Pexp_coerce (x0,x1,x2) ->
      To.Parsetree.Pexp_coerce
        ((copy_expression x0),
          (copy_option copy_core_type x1),
          (copy_core_type x2))
  | From.Parsetree.Pexp_send (x0,x1) ->
      To.Parsetree.Pexp_send
        ((copy_expression x0), x1)
  | From.Parsetree.Pexp_new x0 ->
      To.Parsetree.Pexp_new
        (copy_loc copy_longident
           x0)
  | From.Parsetree.Pexp_setinstvar (x0,x1) ->
      To.Parsetree.Pexp_setinstvar
        ((copy_loc (fun x  -> x) x0),
          (copy_expression x1))
  | From.Parsetree.Pexp_override x0 ->
      To.Parsetree.Pexp_override
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_loc (fun x  -> x) x0),
                (copy_expression x1))) x0)
  | From.Parsetree.Pexp_letmodule (x0,x1,x2) ->
      To.Parsetree.Pexp_letmodule
        ((copy_loc (fun x  -> x) x0),
          (copy_module_expr x1),
          (copy_expression x2))
  | From.Parsetree.Pexp_assert x0 ->
      To.Parsetree.Pexp_assert
        (copy_expression x0)
  | From.Parsetree.Pexp_lazy x0 ->
      To.Parsetree.Pexp_lazy
        (copy_expression x0)
  | From.Parsetree.Pexp_poly (x0,x1) ->
      To.Parsetree.Pexp_poly
        ((copy_expression x0),
          (copy_option copy_core_type x1))
  | From.Parsetree.Pexp_object x0 ->
      To.Parsetree.Pexp_object
        (copy_class_structure x0)
  | From.Parsetree.Pexp_newtype (x0,x1) ->
      To.Parsetree.Pexp_newtype
        (x0, (copy_expression x1))
  | From.Parsetree.Pexp_pack x0 ->
      To.Parsetree.Pexp_pack
        (copy_module_expr x0)
  | From.Parsetree.Pexp_open (x0,x1,x2) ->
      To.Parsetree.Pexp_open
        ((copy_override_flag x0),
          (copy_loc
             copy_longident x1),
          (copy_expression x2))
  | From.Parsetree.Pexp_extension x0 ->
      To.Parsetree.Pexp_extension
        (copy_extension x0)
  | From.Parsetree.Pexp_unreachable  ->
      To.Parsetree.Pexp_unreachable

and copy_direction_flag :
  From.Asttypes.direction_flag ->
    To.Asttypes.direction_flag
  =
  function
  | From.Asttypes.Upto  -> To.Asttypes.Upto
  | From.Asttypes.Downto  -> To.Asttypes.Downto

and copy_case :
  From.Parsetree.case -> To.Parsetree.case =
  fun
    { From.Parsetree.pc_lhs = pc_lhs;
      From.Parsetree.pc_guard = pc_guard;
      From.Parsetree.pc_rhs = pc_rhs }
     ->
    {
      To.Parsetree.pc_lhs =
        (copy_pattern pc_lhs);
      To.Parsetree.pc_guard =
        (copy_option copy_expression pc_guard);
      To.Parsetree.pc_rhs =
        (copy_expression pc_rhs)
    }

and copy_value_binding :
  From.Parsetree.value_binding ->
    To.Parsetree.value_binding
  =
  fun
    { From.Parsetree.pvb_pat = pvb_pat;
      From.Parsetree.pvb_expr = pvb_expr;
      From.Parsetree.pvb_attributes = pvb_attributes;
      From.Parsetree.pvb_loc = pvb_loc }
     ->
    {
      To.Parsetree.pvb_pat =
        (copy_pattern pvb_pat);
      To.Parsetree.pvb_expr =
        (copy_expression pvb_expr);
      To.Parsetree.pvb_attributes =
        (copy_attributes pvb_attributes);
      To.Parsetree.pvb_loc =
        (copy_location pvb_loc)
    }

and copy_pattern :
  From.Parsetree.pattern -> To.Parsetree.pattern =
  fun
    { From.Parsetree.ppat_desc = ppat_desc;
      From.Parsetree.ppat_loc = ppat_loc;
      From.Parsetree.ppat_attributes = ppat_attributes }
     ->
    {
      To.Parsetree.ppat_desc =
        (copy_pattern_desc ppat_desc);
      To.Parsetree.ppat_loc =
        (copy_location ppat_loc);
      To.Parsetree.ppat_attributes =
        (copy_attributes ppat_attributes)
    }

and copy_pattern_desc :
  From.Parsetree.pattern_desc ->
    To.Parsetree.pattern_desc
  =
  function
  | From.Parsetree.Ppat_any  ->
      To.Parsetree.Ppat_any
  | From.Parsetree.Ppat_var x0 ->
      To.Parsetree.Ppat_var
        (copy_loc (fun x  -> x) x0)
  | From.Parsetree.Ppat_alias (x0,x1) ->
      To.Parsetree.Ppat_alias
        ((copy_pattern x0),
          (copy_loc (fun x  -> x) x1))
  | From.Parsetree.Ppat_constant x0 ->
      To.Parsetree.Ppat_constant
        (copy_constant x0)
  | From.Parsetree.Ppat_interval (x0,x1) ->
      To.Parsetree.Ppat_interval
        ((copy_constant x0),
          (copy_constant x1))
  | From.Parsetree.Ppat_tuple x0 ->
      To.Parsetree.Ppat_tuple
        (List.map copy_pattern x0)
  | From.Parsetree.Ppat_construct (x0,x1) ->
      To.Parsetree.Ppat_construct
        ((copy_loc
            copy_longident x0),
          (copy_option copy_pattern x1))
  | From.Parsetree.Ppat_variant (x0,x1) ->
      To.Parsetree.Ppat_variant
        ((copy_label x0),
          (copy_option copy_pattern x1))
  | From.Parsetree.Ppat_record (x0,x1) ->
      To.Parsetree.Ppat_record
        ((List.map
            (fun x  ->
               let (x0,x1) = x  in
               ((copy_loc
                   copy_longident x0),
                 (copy_pattern x1))) x0),
          (copy_closed_flag x1))
  | From.Parsetree.Ppat_array x0 ->
      To.Parsetree.Ppat_array
        (List.map copy_pattern x0)
  | From.Parsetree.Ppat_or (x0,x1) ->
      To.Parsetree.Ppat_or
        ((copy_pattern x0),
          (copy_pattern x1))
  | From.Parsetree.Ppat_constraint (x0,x1) ->
      To.Parsetree.Ppat_constraint
        ((copy_pattern x0),
          (copy_core_type x1))
  | From.Parsetree.Ppat_type x0 ->
      To.Parsetree.Ppat_type
        (copy_loc copy_longident
           x0)
  | From.Parsetree.Ppat_lazy x0 ->
      To.Parsetree.Ppat_lazy
        (copy_pattern x0)
  | From.Parsetree.Ppat_unpack x0 ->
      To.Parsetree.Ppat_unpack
        (copy_loc (fun x  -> x) x0)
  | From.Parsetree.Ppat_exception x0 ->
      To.Parsetree.Ppat_exception
        (copy_pattern x0)
  | From.Parsetree.Ppat_extension x0 ->
      To.Parsetree.Ppat_extension
        (copy_extension x0)

and copy_core_type :
  From.Parsetree.core_type ->
    To.Parsetree.core_type
  =
  fun
    { From.Parsetree.ptyp_desc = ptyp_desc;
      From.Parsetree.ptyp_loc = ptyp_loc;
      From.Parsetree.ptyp_attributes = ptyp_attributes }
     ->
    {
      To.Parsetree.ptyp_desc =
        (copy_core_type_desc ptyp_desc);
      To.Parsetree.ptyp_loc =
        (copy_location ptyp_loc);
      To.Parsetree.ptyp_attributes =
        (copy_attributes ptyp_attributes)
    }

and copy_core_type_desc :
  From.Parsetree.core_type_desc ->
    To.Parsetree.core_type_desc
  =
  function
  | From.Parsetree.Ptyp_any  ->
      To.Parsetree.Ptyp_any
  | From.Parsetree.Ptyp_var x0 ->
      To.Parsetree.Ptyp_var x0
  | From.Parsetree.Ptyp_arrow (x0,x1,x2) ->
      To.Parsetree.Ptyp_arrow
        ((copy_arg_label x0),
          (copy_core_type x1),
          (copy_core_type x2))
  | From.Parsetree.Ptyp_tuple x0 ->
      To.Parsetree.Ptyp_tuple
        (List.map copy_core_type x0)
  | From.Parsetree.Ptyp_constr (x0,x1) ->
      To.Parsetree.Ptyp_constr
        ((copy_loc
            copy_longident x0),
          (List.map copy_core_type x1))
  | From.Parsetree.Ptyp_object (x0,x1) ->
      To.Parsetree.Ptyp_object
        ((List.map
            (fun x  ->
               let (x0,x1,x2) = x  in
               (x0, (copy_attributes x1),
                 (copy_core_type x2))) x0),
          (copy_closed_flag x1))
  | From.Parsetree.Ptyp_class (x0,x1) ->
      To.Parsetree.Ptyp_class
        ((copy_loc
            copy_longident x0),
          (List.map copy_core_type x1))
  | From.Parsetree.Ptyp_alias (x0,x1) ->
      To.Parsetree.Ptyp_alias
        ((copy_core_type x0), x1)
  | From.Parsetree.Ptyp_variant (x0,x1,x2) ->
      To.Parsetree.Ptyp_variant
        ((List.map copy_row_field x0),
          (copy_closed_flag x1),
          (copy_option
             (fun x  -> List.map copy_label x) x2))
  | From.Parsetree.Ptyp_poly (x0,x1) ->
      To.Parsetree.Ptyp_poly
        ((List.map (fun x  -> x) x0),
          (copy_core_type x1))
  | From.Parsetree.Ptyp_package x0 ->
      To.Parsetree.Ptyp_package
        (copy_package_type x0)
  | From.Parsetree.Ptyp_extension x0 ->
      To.Parsetree.Ptyp_extension
        (copy_extension x0)

and copy_package_type :
  From.Parsetree.package_type ->
    To.Parsetree.package_type
  =
  fun x  ->
    let (x0,x1) = x  in
    ((copy_loc copy_longident x0),
      (List.map
         (fun x  ->
            let (x0,x1) = x  in
            ((copy_loc
                copy_longident x0),
              (copy_core_type x1))) x1))

and copy_row_field :
  From.Parsetree.row_field ->
    To.Parsetree.row_field
  =
  function
  | From.Parsetree.Rtag (x0,x1,x2,x3) ->
      To.Parsetree.Rtag
        ((copy_label x0),
          (copy_attributes x1), (copy_bool x2),
          (List.map copy_core_type x3))
  | From.Parsetree.Rinherit x0 ->
      To.Parsetree.Rinherit
        (copy_core_type x0)

and copy_attributes :
  From.Parsetree.attributes ->
    To.Parsetree.attributes
  = fun x  -> List.map copy_attribute x

and copy_attribute :
  From.Parsetree.attribute ->
    To.Parsetree.attribute
  =
  fun x  ->
    let (x0,x1) = x  in
    ((copy_loc (fun x  -> x) x0),
      (copy_payload x1))

and copy_payload :
  From.Parsetree.payload -> To.Parsetree.payload =
  function
  | From.Parsetree.PStr x0 ->
      To.Parsetree.PStr
        (copy_structure x0)
  | From.Parsetree.PSig x0 ->
      To.Parsetree.PSig
        (copy_signature x0)
  | From.Parsetree.PTyp x0 ->
      To.Parsetree.PTyp
        (copy_core_type x0)
  | From.Parsetree.PPat (x0,x1) ->
      To.Parsetree.PPat
        ((copy_pattern x0),
          (copy_option copy_expression x1))

and copy_structure :
  From.Parsetree.structure ->
    To.Parsetree.structure
  = fun x  -> List.map copy_structure_item x

and copy_structure_item :
  From.Parsetree.structure_item ->
    To.Parsetree.structure_item
  =
  fun
    { From.Parsetree.pstr_desc = pstr_desc;
      From.Parsetree.pstr_loc = pstr_loc }
     ->
    {
      To.Parsetree.pstr_desc =
        (copy_structure_item_desc pstr_desc);
      To.Parsetree.pstr_loc =
        (copy_location pstr_loc)
    }

and copy_structure_item_desc :
  From.Parsetree.structure_item_desc ->
    To.Parsetree.structure_item_desc
  =
  function
  | From.Parsetree.Pstr_eval (x0,x1) ->
      To.Parsetree.Pstr_eval
        ((copy_expression x0),
          (copy_attributes x1))
  | From.Parsetree.Pstr_value (x0,x1) ->
      To.Parsetree.Pstr_value
        ((copy_rec_flag x0),
          (List.map copy_value_binding x1))
  | From.Parsetree.Pstr_primitive x0 ->
      To.Parsetree.Pstr_primitive
        (copy_value_description x0)
  | From.Parsetree.Pstr_type (x0,x1) ->
      To.Parsetree.Pstr_type
        ((copy_rec_flag x0),
          (List.map copy_type_declaration x1))
  | From.Parsetree.Pstr_typext x0 ->
      To.Parsetree.Pstr_typext
        (copy_type_extension x0)
  | From.Parsetree.Pstr_exception x0 ->
      To.Parsetree.Pstr_exception
        (copy_extension_constructor x0)
  | From.Parsetree.Pstr_module x0 ->
      To.Parsetree.Pstr_module
        (copy_module_binding x0)
  | From.Parsetree.Pstr_recmodule x0 ->
      To.Parsetree.Pstr_recmodule
        (List.map copy_module_binding x0)
  | From.Parsetree.Pstr_modtype x0 ->
      To.Parsetree.Pstr_modtype
        (copy_module_type_declaration x0)
  | From.Parsetree.Pstr_open x0 ->
      To.Parsetree.Pstr_open
        (copy_open_description x0)
  | From.Parsetree.Pstr_class x0 ->
      To.Parsetree.Pstr_class
        (List.map copy_class_declaration x0)
  | From.Parsetree.Pstr_class_type x0 ->
      To.Parsetree.Pstr_class_type
        (List.map copy_class_type_declaration x0)
  | From.Parsetree.Pstr_include x0 ->
      To.Parsetree.Pstr_include
        (copy_include_declaration x0)
  | From.Parsetree.Pstr_attribute x0 ->
      To.Parsetree.Pstr_attribute
        (copy_attribute x0)
  | From.Parsetree.Pstr_extension (x0,x1) ->
      To.Parsetree.Pstr_extension
        ((copy_extension x0),
          (copy_attributes x1))

and copy_include_declaration :
  From.Parsetree.include_declaration ->
    To.Parsetree.include_declaration
  =
  fun x  ->
    copy_include_infos
      copy_module_expr x

and copy_class_declaration :
  From.Parsetree.class_declaration ->
    To.Parsetree.class_declaration
  =
  fun x  ->
    copy_class_infos
      copy_class_expr x

and copy_class_expr :
  From.Parsetree.class_expr ->
    To.Parsetree.class_expr
  =
  fun
    { From.Parsetree.pcl_desc = pcl_desc;
      From.Parsetree.pcl_loc = pcl_loc;
      From.Parsetree.pcl_attributes = pcl_attributes }
     ->
    {
      To.Parsetree.pcl_desc =
        (copy_class_expr_desc pcl_desc);
      To.Parsetree.pcl_loc =
        (copy_location pcl_loc);
      To.Parsetree.pcl_attributes =
        (copy_attributes pcl_attributes)
    }

and copy_class_expr_desc :
  From.Parsetree.class_expr_desc ->
    To.Parsetree.class_expr_desc
  =
  function
  | From.Parsetree.Pcl_constr (x0,x1) ->
      To.Parsetree.Pcl_constr
        ((copy_loc
            copy_longident x0),
          (List.map copy_core_type x1))
  | From.Parsetree.Pcl_structure x0 ->
      To.Parsetree.Pcl_structure
        (copy_class_structure x0)
  | From.Parsetree.Pcl_fun (x0,x1,x2,x3) ->
      To.Parsetree.Pcl_fun
        ((copy_arg_label x0),
          (copy_option copy_expression x1),
          (copy_pattern x2),
          (copy_class_expr x3))
  | From.Parsetree.Pcl_apply (x0,x1) ->
      To.Parsetree.Pcl_apply
        ((copy_class_expr x0),
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                ((copy_arg_label x0),
                  (copy_expression x1))) x1))
  | From.Parsetree.Pcl_let (x0,x1,x2) ->
      To.Parsetree.Pcl_let
        ((copy_rec_flag x0),
          (List.map copy_value_binding x1),
          (copy_class_expr x2))
  | From.Parsetree.Pcl_constraint (x0,x1) ->
      To.Parsetree.Pcl_constraint
        ((copy_class_expr x0),
          (copy_class_type x1))
  | From.Parsetree.Pcl_extension x0 ->
      To.Parsetree.Pcl_extension
        (copy_extension x0)

and copy_class_structure :
  From.Parsetree.class_structure ->
    To.Parsetree.class_structure
  =
  fun
    { From.Parsetree.pcstr_self = pcstr_self;
      From.Parsetree.pcstr_fields = pcstr_fields }
     ->
    {
      To.Parsetree.pcstr_self =
        (copy_pattern pcstr_self);
      To.Parsetree.pcstr_fields =
        (List.map copy_class_field pcstr_fields)
    }

and copy_class_field :
  From.Parsetree.class_field ->
    To.Parsetree.class_field
  =
  fun
    { From.Parsetree.pcf_desc = pcf_desc;
      From.Parsetree.pcf_loc = pcf_loc;
      From.Parsetree.pcf_attributes = pcf_attributes }
     ->
    {
      To.Parsetree.pcf_desc =
        (copy_class_field_desc pcf_desc);
      To.Parsetree.pcf_loc =
        (copy_location pcf_loc);
      To.Parsetree.pcf_attributes =
        (copy_attributes pcf_attributes)
    }

and copy_class_field_desc :
  From.Parsetree.class_field_desc ->
    To.Parsetree.class_field_desc
  =
  function
  | From.Parsetree.Pcf_inherit (x0,x1,x2) ->
      To.Parsetree.Pcf_inherit
        ((copy_override_flag x0),
          (copy_class_expr x1),
          (copy_option (fun x  -> x) x2))
  | From.Parsetree.Pcf_val x0 ->
      To.Parsetree.Pcf_val
        (let (x0,x1,x2) = x0  in
         ((copy_loc (fun x  -> x) x0),
           (copy_mutable_flag x1),
           (copy_class_field_kind x2)))
  | From.Parsetree.Pcf_method x0 ->
      To.Parsetree.Pcf_method
        (let (x0,x1,x2) = x0  in
         ((copy_loc (fun x  -> x) x0),
           (copy_private_flag x1),
           (copy_class_field_kind x2)))
  | From.Parsetree.Pcf_constraint x0 ->
      To.Parsetree.Pcf_constraint
        (let (x0,x1) = x0  in
         ((copy_core_type x0),
           (copy_core_type x1)))
  | From.Parsetree.Pcf_initializer x0 ->
      To.Parsetree.Pcf_initializer
        (copy_expression x0)
  | From.Parsetree.Pcf_attribute x0 ->
      To.Parsetree.Pcf_attribute
        (copy_attribute x0)
  | From.Parsetree.Pcf_extension x0 ->
      To.Parsetree.Pcf_extension
        (copy_extension x0)

and copy_class_field_kind :
  From.Parsetree.class_field_kind ->
    To.Parsetree.class_field_kind
  =
  function
  | From.Parsetree.Cfk_virtual x0 ->
      To.Parsetree.Cfk_virtual
        (copy_core_type x0)
  | From.Parsetree.Cfk_concrete (x0,x1) ->
      To.Parsetree.Cfk_concrete
        ((copy_override_flag x0),
          (copy_expression x1))

and copy_module_binding :
  From.Parsetree.module_binding ->
    To.Parsetree.module_binding
  =
  fun
    { From.Parsetree.pmb_name = pmb_name;
      From.Parsetree.pmb_expr = pmb_expr;
      From.Parsetree.pmb_attributes = pmb_attributes;
      From.Parsetree.pmb_loc = pmb_loc }
     ->
    {
      To.Parsetree.pmb_name =
        (copy_loc (fun x  -> x) pmb_name);
      To.Parsetree.pmb_expr =
        (copy_module_expr pmb_expr);
      To.Parsetree.pmb_attributes =
        (copy_attributes pmb_attributes);
      To.Parsetree.pmb_loc =
        (copy_location pmb_loc)
    }

and copy_module_expr :
  From.Parsetree.module_expr ->
    To.Parsetree.module_expr
  =
  fun
    { From.Parsetree.pmod_desc = pmod_desc;
      From.Parsetree.pmod_loc = pmod_loc;
      From.Parsetree.pmod_attributes = pmod_attributes }
     ->
    {
      To.Parsetree.pmod_desc =
        (copy_module_expr_desc pmod_desc);
      To.Parsetree.pmod_loc =
        (copy_location pmod_loc);
      To.Parsetree.pmod_attributes =
        (copy_attributes pmod_attributes)
    }

and copy_module_expr_desc :
  From.Parsetree.module_expr_desc ->
    To.Parsetree.module_expr_desc
  =
  function
  | From.Parsetree.Pmod_ident x0 ->
      To.Parsetree.Pmod_ident
        (copy_loc copy_longident
           x0)
  | From.Parsetree.Pmod_structure x0 ->
      To.Parsetree.Pmod_structure
        (copy_structure x0)
  | From.Parsetree.Pmod_functor (x0,x1,x2) ->
      To.Parsetree.Pmod_functor
        ((copy_loc (fun x  -> x) x0),
          (copy_option copy_module_type x1),
          (copy_module_expr x2))
  | From.Parsetree.Pmod_apply (x0,x1) ->
      To.Parsetree.Pmod_apply
        ((copy_module_expr x0),
          (copy_module_expr x1))
  | From.Parsetree.Pmod_constraint (x0,x1) ->
      To.Parsetree.Pmod_constraint
        ((copy_module_expr x0),
          (copy_module_type x1))
  | From.Parsetree.Pmod_unpack x0 ->
      To.Parsetree.Pmod_unpack
        (copy_expression x0)
  | From.Parsetree.Pmod_extension x0 ->
      To.Parsetree.Pmod_extension
        (copy_extension x0)

and copy_module_type :
  From.Parsetree.module_type ->
    To.Parsetree.module_type
  =
  fun
    { From.Parsetree.pmty_desc = pmty_desc;
      From.Parsetree.pmty_loc = pmty_loc;
      From.Parsetree.pmty_attributes = pmty_attributes }
     ->
    {
      To.Parsetree.pmty_desc =
        (copy_module_type_desc pmty_desc);
      To.Parsetree.pmty_loc =
        (copy_location pmty_loc);
      To.Parsetree.pmty_attributes =
        (copy_attributes pmty_attributes)
    }

and copy_module_type_desc :
  From.Parsetree.module_type_desc ->
    To.Parsetree.module_type_desc
  =
  function
  | From.Parsetree.Pmty_ident x0 ->
      To.Parsetree.Pmty_ident
        (copy_loc copy_longident
           x0)
  | From.Parsetree.Pmty_signature x0 ->
      To.Parsetree.Pmty_signature
        (copy_signature x0)
  | From.Parsetree.Pmty_functor (x0,x1,x2) ->
      To.Parsetree.Pmty_functor
        ((copy_loc (fun x  -> x) x0),
          (copy_option copy_module_type x1),
          (copy_module_type x2))
  | From.Parsetree.Pmty_with (x0,x1) ->
      To.Parsetree.Pmty_with
        ((copy_module_type x0),
          (List.map copy_with_constraint x1))
  | From.Parsetree.Pmty_typeof x0 ->
      To.Parsetree.Pmty_typeof
        (copy_module_expr x0)
  | From.Parsetree.Pmty_extension x0 ->
      To.Parsetree.Pmty_extension
        (copy_extension x0)
  | From.Parsetree.Pmty_alias x0 ->
      To.Parsetree.Pmty_alias
        (copy_loc copy_longident
           x0)

and copy_with_constraint :
  From.Parsetree.with_constraint ->
    To.Parsetree.with_constraint
  =
  function
  | From.Parsetree.Pwith_type (x0,x1) ->
      To.Parsetree.Pwith_type
        ((copy_loc
            copy_longident x0),
          (copy_type_declaration x1))
  | From.Parsetree.Pwith_module (x0,x1) ->
      To.Parsetree.Pwith_module
        ((copy_loc
            copy_longident x0),
          (copy_loc
             copy_longident x1))
  | From.Parsetree.Pwith_typesubst x0 ->
      To.Parsetree.Pwith_typesubst
        (copy_type_declaration x0)
  | From.Parsetree.Pwith_modsubst (x0,x1) ->
      To.Parsetree.Pwith_modsubst
        ((copy_loc (fun x  -> x) x0),
          (copy_loc
             copy_longident x1))

and copy_signature :
  From.Parsetree.signature ->
    To.Parsetree.signature
  = fun x  -> List.map copy_signature_item x

and copy_signature_item :
  From.Parsetree.signature_item ->
    To.Parsetree.signature_item
  =
  fun
    { From.Parsetree.psig_desc = psig_desc;
      From.Parsetree.psig_loc = psig_loc }
     ->
    {
      To.Parsetree.psig_desc =
        (copy_signature_item_desc psig_desc);
      To.Parsetree.psig_loc =
        (copy_location psig_loc)
    }

and copy_signature_item_desc :
  From.Parsetree.signature_item_desc ->
    To.Parsetree.signature_item_desc
  =
  function
  | From.Parsetree.Psig_value x0 ->
      To.Parsetree.Psig_value
        (copy_value_description x0)
  | From.Parsetree.Psig_type (x0,x1) ->
      To.Parsetree.Psig_type
        ((copy_rec_flag x0),
          (List.map copy_type_declaration x1))
  | From.Parsetree.Psig_typext x0 ->
      To.Parsetree.Psig_typext
        (copy_type_extension x0)
  | From.Parsetree.Psig_exception x0 ->
      To.Parsetree.Psig_exception
        (copy_extension_constructor x0)
  | From.Parsetree.Psig_module x0 ->
      To.Parsetree.Psig_module
        (copy_module_declaration x0)
  | From.Parsetree.Psig_recmodule x0 ->
      To.Parsetree.Psig_recmodule
        (List.map copy_module_declaration x0)
  | From.Parsetree.Psig_modtype x0 ->
      To.Parsetree.Psig_modtype
        (copy_module_type_declaration x0)
  | From.Parsetree.Psig_open x0 ->
      To.Parsetree.Psig_open
        (copy_open_description x0)
  | From.Parsetree.Psig_include x0 ->
      To.Parsetree.Psig_include
        (copy_include_description x0)
  | From.Parsetree.Psig_class x0 ->
      To.Parsetree.Psig_class
        (List.map copy_class_description x0)
  | From.Parsetree.Psig_class_type x0 ->
      To.Parsetree.Psig_class_type
        (List.map copy_class_type_declaration x0)
  | From.Parsetree.Psig_attribute x0 ->
      To.Parsetree.Psig_attribute
        (copy_attribute x0)
  | From.Parsetree.Psig_extension (x0,x1) ->
      To.Parsetree.Psig_extension
        ((copy_extension x0),
          (copy_attributes x1))

and copy_class_type_declaration :
  From.Parsetree.class_type_declaration ->
    To.Parsetree.class_type_declaration
  =
  fun x  ->
    copy_class_infos
      copy_class_type x

and copy_class_description :
  From.Parsetree.class_description ->
    To.Parsetree.class_description
  =
  fun x  ->
    copy_class_infos
      copy_class_type x

and copy_class_type :
  From.Parsetree.class_type ->
    To.Parsetree.class_type
  =
  fun
    { From.Parsetree.pcty_desc = pcty_desc;
      From.Parsetree.pcty_loc = pcty_loc;
      From.Parsetree.pcty_attributes = pcty_attributes }
     ->
    {
      To.Parsetree.pcty_desc =
        (copy_class_type_desc pcty_desc);
      To.Parsetree.pcty_loc =
        (copy_location pcty_loc);
      To.Parsetree.pcty_attributes =
        (copy_attributes pcty_attributes)
    }

and copy_class_type_desc :
  From.Parsetree.class_type_desc ->
    To.Parsetree.class_type_desc
  =
  function
  | From.Parsetree.Pcty_constr (x0,x1) ->
      To.Parsetree.Pcty_constr
        ((copy_loc
            copy_longident x0),
          (List.map copy_core_type x1))
  | From.Parsetree.Pcty_signature x0 ->
      To.Parsetree.Pcty_signature
        (copy_class_signature x0)
  | From.Parsetree.Pcty_arrow (x0,x1,x2) ->
      To.Parsetree.Pcty_arrow
        ((copy_arg_label x0),
          (copy_core_type x1),
          (copy_class_type x2))
  | From.Parsetree.Pcty_extension x0 ->
      To.Parsetree.Pcty_extension
        (copy_extension x0)

and copy_class_signature :
  From.Parsetree.class_signature ->
    To.Parsetree.class_signature
  =
  fun
    { From.Parsetree.pcsig_self = pcsig_self;
      From.Parsetree.pcsig_fields = pcsig_fields }
     ->
    {
      To.Parsetree.pcsig_self =
        (copy_core_type pcsig_self);
      To.Parsetree.pcsig_fields =
        (List.map copy_class_type_field
           pcsig_fields)
    }

and copy_class_type_field :
  From.Parsetree.class_type_field ->
    To.Parsetree.class_type_field
  =
  fun
    { From.Parsetree.pctf_desc = pctf_desc;
      From.Parsetree.pctf_loc = pctf_loc;
      From.Parsetree.pctf_attributes = pctf_attributes }
     ->
    {
      To.Parsetree.pctf_desc =
        (copy_class_type_field_desc pctf_desc);
      To.Parsetree.pctf_loc =
        (copy_location pctf_loc);
      To.Parsetree.pctf_attributes =
        (copy_attributes pctf_attributes)
    }

and copy_class_type_field_desc :
  From.Parsetree.class_type_field_desc ->
    To.Parsetree.class_type_field_desc
  =
  function
  | From.Parsetree.Pctf_inherit x0 ->
      To.Parsetree.Pctf_inherit
        (copy_class_type x0)
  | From.Parsetree.Pctf_val x0 ->
      To.Parsetree.Pctf_val
        (let (x0,x1,x2,x3) = x0  in
         (x0, (copy_mutable_flag x1),
           (copy_virtual_flag x2),
           (copy_core_type x3)))
  | From.Parsetree.Pctf_method x0 ->
      To.Parsetree.Pctf_method
        (let (x0,x1,x2,x3) = x0  in
         (x0, (copy_private_flag x1),
           (copy_virtual_flag x2),
           (copy_core_type x3)))
  | From.Parsetree.Pctf_constraint x0 ->
      To.Parsetree.Pctf_constraint
        (let (x0,x1) = x0  in
         ((copy_core_type x0),
           (copy_core_type x1)))
  | From.Parsetree.Pctf_attribute x0 ->
      To.Parsetree.Pctf_attribute
        (copy_attribute x0)
  | From.Parsetree.Pctf_extension x0 ->
      To.Parsetree.Pctf_extension
        (copy_extension x0)

and copy_extension :
  From.Parsetree.extension ->
    To.Parsetree.extension
  =
  fun x  ->
    let (x0,x1) = x  in
    ((copy_loc (fun x  -> x) x0),
      (copy_payload x1))

and copy_class_infos :
  'f0 'g0 .
    ('f0 -> 'g0) ->
      'f0 From.Parsetree.class_infos ->
        'g0 To.Parsetree.class_infos
  =
  fun f0  ->
    fun
      { From.Parsetree.pci_virt = pci_virt;
        From.Parsetree.pci_params = pci_params;
        From.Parsetree.pci_name = pci_name;
        From.Parsetree.pci_expr = pci_expr;
        From.Parsetree.pci_loc = pci_loc;
        From.Parsetree.pci_attributes = pci_attributes }
       ->
      {
        To.Parsetree.pci_virt =
          (copy_virtual_flag pci_virt);
        To.Parsetree.pci_params =
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                ((copy_core_type x0),
                  (copy_variance x1))) pci_params);
        To.Parsetree.pci_name =
          (copy_loc (fun x  -> x) pci_name);
        To.Parsetree.pci_expr = (f0 pci_expr);
        To.Parsetree.pci_loc =
          (copy_location pci_loc);
        To.Parsetree.pci_attributes =
          (copy_attributes pci_attributes)
      }

and copy_virtual_flag :
  From.Asttypes.virtual_flag ->
    To.Asttypes.virtual_flag
  =
  function
  | From.Asttypes.Virtual  -> To.Asttypes.Virtual
  | From.Asttypes.Concrete  -> To.Asttypes.Concrete

and copy_include_description :
  From.Parsetree.include_description ->
    To.Parsetree.include_description
  =
  fun x  ->
    copy_include_infos
      copy_module_type x

and copy_include_infos :
  'f0 'g0 .
    ('f0 -> 'g0) ->
      'f0 From.Parsetree.include_infos ->
        'g0 To.Parsetree.include_infos
  =
  fun f0  ->
    fun
      { From.Parsetree.pincl_mod = pincl_mod;
        From.Parsetree.pincl_loc = pincl_loc;
        From.Parsetree.pincl_attributes = pincl_attributes }
       ->
      {
        To.Parsetree.pincl_mod = (f0 pincl_mod);
        To.Parsetree.pincl_loc =
          (copy_location pincl_loc);
        To.Parsetree.pincl_attributes =
          (copy_attributes pincl_attributes)
      }

and copy_open_description :
  From.Parsetree.open_description ->
    To.Parsetree.open_description
  =
  fun
    { From.Parsetree.popen_lid = popen_lid;
      From.Parsetree.popen_override = popen_override;
      From.Parsetree.popen_loc = popen_loc;
      From.Parsetree.popen_attributes = popen_attributes }
     ->
    {
      To.Parsetree.popen_lid =
        (copy_loc copy_longident
           popen_lid);
      To.Parsetree.popen_override =
        (copy_override_flag popen_override);
      To.Parsetree.popen_loc =
        (copy_location popen_loc);
      To.Parsetree.popen_attributes =
        (copy_attributes popen_attributes)
    }

and copy_override_flag :
  From.Asttypes.override_flag ->
    To.Asttypes.override_flag
  =
  function
  | From.Asttypes.Override  -> To.Asttypes.Override
  | From.Asttypes.Fresh  -> To.Asttypes.Fresh

and copy_module_type_declaration :
  From.Parsetree.module_type_declaration ->
    To.Parsetree.module_type_declaration
  =
  fun
    { From.Parsetree.pmtd_name = pmtd_name;
      From.Parsetree.pmtd_type = pmtd_type;
      From.Parsetree.pmtd_attributes = pmtd_attributes;
      From.Parsetree.pmtd_loc = pmtd_loc }
     ->
    {
      To.Parsetree.pmtd_name =
        (copy_loc (fun x  -> x) pmtd_name);
      To.Parsetree.pmtd_type =
        (copy_option copy_module_type pmtd_type);
      To.Parsetree.pmtd_attributes =
        (copy_attributes pmtd_attributes);
      To.Parsetree.pmtd_loc =
        (copy_location pmtd_loc)
    }

and copy_module_declaration :
  From.Parsetree.module_declaration ->
    To.Parsetree.module_declaration
  =
  fun
    { From.Parsetree.pmd_name = pmd_name;
      From.Parsetree.pmd_type = pmd_type;
      From.Parsetree.pmd_attributes = pmd_attributes;
      From.Parsetree.pmd_loc = pmd_loc }
     ->
    {
      To.Parsetree.pmd_name =
        (copy_loc (fun x  -> x) pmd_name);
      To.Parsetree.pmd_type =
        (copy_module_type pmd_type);
      To.Parsetree.pmd_attributes =
        (copy_attributes pmd_attributes);
      To.Parsetree.pmd_loc =
        (copy_location pmd_loc)
    }

and copy_type_extension :
  From.Parsetree.type_extension ->
    To.Parsetree.type_extension
  =
  fun
    { From.Parsetree.ptyext_path = ptyext_path;
      From.Parsetree.ptyext_params = ptyext_params;
      From.Parsetree.ptyext_constructors = ptyext_constructors;
      From.Parsetree.ptyext_private = ptyext_private;
      From.Parsetree.ptyext_attributes = ptyext_attributes }
     ->
    {
      To.Parsetree.ptyext_path =
        (copy_loc copy_longident
           ptyext_path);
      To.Parsetree.ptyext_params =
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_core_type x0),
                (copy_variance x1))) ptyext_params);
      To.Parsetree.ptyext_constructors =
        (List.map copy_extension_constructor
           ptyext_constructors);
      To.Parsetree.ptyext_private =
        (copy_private_flag ptyext_private);
      To.Parsetree.ptyext_attributes =
        (copy_attributes ptyext_attributes)
    }

and copy_extension_constructor :
  From.Parsetree.extension_constructor ->
    To.Parsetree.extension_constructor
  =
  fun
    { From.Parsetree.pext_name = pext_name;
      From.Parsetree.pext_kind = pext_kind;
      From.Parsetree.pext_loc = pext_loc;
      From.Parsetree.pext_attributes = pext_attributes }
     ->
    {
      To.Parsetree.pext_name =
        (copy_loc (fun x  -> x) pext_name);
      To.Parsetree.pext_kind =
        (copy_extension_constructor_kind pext_kind);
      To.Parsetree.pext_loc =
        (copy_location pext_loc);
      To.Parsetree.pext_attributes =
        (copy_attributes pext_attributes)
    }

and copy_extension_constructor_kind :
  From.Parsetree.extension_constructor_kind ->
    To.Parsetree.extension_constructor_kind
  =
  function
  | From.Parsetree.Pext_decl (x0,x1) ->
      To.Parsetree.Pext_decl
        ((copy_constructor_arguments x0),
          (copy_option copy_core_type x1))
  | From.Parsetree.Pext_rebind x0 ->
      To.Parsetree.Pext_rebind
        (copy_loc copy_longident
           x0)

and copy_type_declaration :
  From.Parsetree.type_declaration ->
    To.Parsetree.type_declaration
  =
  fun
    { From.Parsetree.ptype_name = ptype_name;
      From.Parsetree.ptype_params = ptype_params;
      From.Parsetree.ptype_cstrs = ptype_cstrs;
      From.Parsetree.ptype_kind = ptype_kind;
      From.Parsetree.ptype_private = ptype_private;
      From.Parsetree.ptype_manifest = ptype_manifest;
      From.Parsetree.ptype_attributes = ptype_attributes;
      From.Parsetree.ptype_loc = ptype_loc }
     ->
    {
      To.Parsetree.ptype_name =
        (copy_loc (fun x  -> x) ptype_name);
      To.Parsetree.ptype_params =
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_core_type x0),
                (copy_variance x1))) ptype_params);
      To.Parsetree.ptype_cstrs =
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              ((copy_core_type x0),
                (copy_core_type x1),
                (copy_location x2))) ptype_cstrs);
      To.Parsetree.ptype_kind =
        (copy_type_kind ptype_kind);
      To.Parsetree.ptype_private =
        (copy_private_flag ptype_private);
      To.Parsetree.ptype_manifest =
        (copy_option copy_core_type ptype_manifest);
      To.Parsetree.ptype_attributes =
        (copy_attributes ptype_attributes);
      To.Parsetree.ptype_loc =
        (copy_location ptype_loc)
    }

and copy_private_flag :
  From.Asttypes.private_flag ->
    To.Asttypes.private_flag
  =
  function
  | From.Asttypes.Private  -> To.Asttypes.Private
  | From.Asttypes.Public  -> To.Asttypes.Public

and copy_type_kind :
  From.Parsetree.type_kind ->
    To.Parsetree.type_kind
  =
  function
  | From.Parsetree.Ptype_abstract  ->
      To.Parsetree.Ptype_abstract
  | From.Parsetree.Ptype_variant x0 ->
      To.Parsetree.Ptype_variant
        (List.map copy_constructor_declaration x0)
  | From.Parsetree.Ptype_record x0 ->
      To.Parsetree.Ptype_record
        (List.map copy_label_declaration x0)
  | From.Parsetree.Ptype_open  ->
      To.Parsetree.Ptype_open

and copy_constructor_declaration :
  From.Parsetree.constructor_declaration ->
    To.Parsetree.constructor_declaration
  =
  fun
    { From.Parsetree.pcd_name = pcd_name;
      From.Parsetree.pcd_args = pcd_args;
      From.Parsetree.pcd_res = pcd_res;
      From.Parsetree.pcd_loc = pcd_loc;
      From.Parsetree.pcd_attributes = pcd_attributes }
     ->
    {
      To.Parsetree.pcd_name =
        (copy_loc (fun x  -> x) pcd_name);
      To.Parsetree.pcd_args =
        (copy_constructor_arguments pcd_args);
      To.Parsetree.pcd_res =
        (copy_option copy_core_type pcd_res);
      To.Parsetree.pcd_loc =
        (copy_location pcd_loc);
      To.Parsetree.pcd_attributes =
        (copy_attributes pcd_attributes)
    }

and copy_constructor_arguments :
  From.Parsetree.constructor_arguments ->
    To.Parsetree.constructor_arguments
  =
  function
  | From.Parsetree.Pcstr_tuple x0 ->
      To.Parsetree.Pcstr_tuple
        (List.map copy_core_type x0)
  | From.Parsetree.Pcstr_record x0 ->
      To.Parsetree.Pcstr_record
        (List.map copy_label_declaration x0)

and copy_label_declaration :
  From.Parsetree.label_declaration ->
    To.Parsetree.label_declaration
  =
  fun
    { From.Parsetree.pld_name = pld_name;
      From.Parsetree.pld_mutable = pld_mutable;
      From.Parsetree.pld_type = pld_type;
      From.Parsetree.pld_loc = pld_loc;
      From.Parsetree.pld_attributes = pld_attributes }
     ->
    {
      To.Parsetree.pld_name =
        (copy_loc (fun x  -> x) pld_name);
      To.Parsetree.pld_mutable =
        (copy_mutable_flag pld_mutable);
      To.Parsetree.pld_type =
        (copy_core_type pld_type);
      To.Parsetree.pld_loc =
        (copy_location pld_loc);
      To.Parsetree.pld_attributes =
        (copy_attributes pld_attributes)
    }

and copy_mutable_flag :
  From.Asttypes.mutable_flag ->
    To.Asttypes.mutable_flag
  =
  function
  | From.Asttypes.Immutable  ->
      To.Asttypes.Immutable
  | From.Asttypes.Mutable  -> To.Asttypes.Mutable

and copy_variance :
  From.Asttypes.variance -> To.Asttypes.variance =
  function
  | From.Asttypes.Covariant  ->
      To.Asttypes.Covariant
  | From.Asttypes.Contravariant  ->
      To.Asttypes.Contravariant
  | From.Asttypes.Invariant  ->
      To.Asttypes.Invariant

and copy_value_description :
  From.Parsetree.value_description ->
    To.Parsetree.value_description
  =
  fun
    { From.Parsetree.pval_name = pval_name;
      From.Parsetree.pval_type = pval_type;
      From.Parsetree.pval_prim = pval_prim;
      From.Parsetree.pval_attributes = pval_attributes;
      From.Parsetree.pval_loc = pval_loc }
     ->
    {
      To.Parsetree.pval_name =
        (copy_loc (fun x  -> x) pval_name);
      To.Parsetree.pval_type =
        (copy_core_type pval_type);
      To.Parsetree.pval_prim =
        (List.map (fun x  -> x) pval_prim);
      To.Parsetree.pval_attributes =
        (copy_attributes pval_attributes);
      To.Parsetree.pval_loc =
        (copy_location pval_loc)
    }

and copy_arg_label :
  From.Asttypes.arg_label -> To.Asttypes.arg_label
  =
  function
  | From.Asttypes.Nolabel  -> To.Asttypes.Nolabel
  | From.Asttypes.Labelled x0 ->
      To.Asttypes.Labelled x0
  | From.Asttypes.Optional x0 ->
      To.Asttypes.Optional x0

and copy_closed_flag :
  From.Asttypes.closed_flag ->
    To.Asttypes.closed_flag
  =
  function
  | From.Asttypes.Closed  -> To.Asttypes.Closed
  | From.Asttypes.Open  -> To.Asttypes.Open

and copy_label :
  From.Asttypes.label -> To.Asttypes.label =
  fun x  -> x

and copy_rec_flag :
  From.Asttypes.rec_flag -> To.Asttypes.rec_flag =
  function
  | From.Asttypes.Nonrecursive  ->
      To.Asttypes.Nonrecursive
  | From.Asttypes.Recursive  ->
      To.Asttypes.Recursive

and copy_constant :
  From.Parsetree.constant -> To.Parsetree.constant
  =
  function
  | From.Parsetree.Pconst_integer (x0,x1) ->
      To.Parsetree.Pconst_integer
        (x0, (copy_option (fun x  -> x) x1))
  | From.Parsetree.Pconst_char x0 ->
      To.Parsetree.Pconst_char x0
  | From.Parsetree.Pconst_string (x0,x1) ->
      To.Parsetree.Pconst_string
        (x0, (copy_option (fun x  -> x) x1))
  | From.Parsetree.Pconst_float (x0,x1) ->
      To.Parsetree.Pconst_float
        (x0, (copy_option (fun x  -> x) x1))

and copy_option : 'f0 'g0 . ('f0 -> 'g0) -> 'f0 option -> 'g0 option =
  fun f0  -> function | None  -> None | Some x0 -> Some (f0 x0)

and copy_longident :
  From.Longident.t -> To.Longident.t =
  function
  | From.Longident.Lident x0 ->
      To.Longident.Lident x0
  | From.Longident.Ldot (x0,x1) ->
      To.Longident.Ldot
        ((copy_longident x0), x1)
  | From.Longident.Lapply (x0,x1) ->
      To.Longident.Lapply
        ((copy_longident x0), (copy_longident x1))

and copy_loc :
  'f0 'g0 .
    ('f0 -> 'g0) ->
      'f0 From.Asttypes.loc -> 'g0 To.Asttypes.loc
  =
  fun f0  ->
    fun
      { From.Asttypes.txt = txt;
        From.Asttypes.loc = loc }
       ->
      {
        To.Asttypes.txt = (f0 txt);
        To.Asttypes.loc = (copy_location loc)
      }

and copy_location :
  From.Location.t -> To.Location.t =
  fun
    { From.Location.loc_start = loc_start;
      From.Location.loc_end = loc_end;
      From.Location.loc_ghost = loc_ghost }
     ->
    {
      To.Location.loc_start = (copy_Lexing_position loc_start);
      To.Location.loc_end = (copy_Lexing_position loc_end);
      To.Location.loc_ghost = (copy_bool loc_ghost)
    }

and copy_bool : bool -> bool = function | false  -> false | true  -> true

and copy_Lexing_position : Lexing.position -> Lexing.position =
  fun
    { Lexing.pos_fname = pos_fname; Lexing.pos_lnum = pos_lnum;
      Lexing.pos_bol = pos_bol; Lexing.pos_cnum = pos_cnum }
     ->
    {
      Lexing.pos_fname = pos_fname;
      Lexing.pos_lnum = pos_lnum;
      Lexing.pos_bol = pos_bol;
      Lexing.pos_cnum = pos_cnum
    }

let rec copy_out_phrase :
  From.Outcometree.out_phrase -> To.Outcometree.out_phrase =
  function
  | From.Outcometree.Ophr_eval (x0,x1) ->
      To.Outcometree.Ophr_eval
        ((copy_out_value x0),
          (copy_out_type x1))
  | From.Outcometree.Ophr_signature x0 ->
      To.Outcometree.Ophr_signature
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_out_sig_item x0),
                (copy_option copy_out_value x1))) x0)
  | From.Outcometree.Ophr_exception x0 ->
      To.Outcometree.Ophr_exception
        (let (x0,x1) = x0  in
         ((copy_exn x0), (copy_out_value x1)))

and copy_exn : exn -> exn = fun x  -> x

and copy_out_sig_item :
  From.Outcometree.out_sig_item -> To.Outcometree.out_sig_item =
  function
  | From.Outcometree.Osig_class (x0,x1,x2,x3,x4) ->
      To.Outcometree.Osig_class
        ((copy_bool x0), x1,
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                (x0, (let (x0,x1) = x1  in ((copy_bool x0), (copy_bool x1)))))
             x2), (copy_out_class_type x3),
          (copy_out_rec_status x4))
  | From.Outcometree.Osig_class_type (x0,x1,x2,x3,x4) ->
      To.Outcometree.Osig_class_type
        ((copy_bool x0), x1,
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                (x0, (let (x0,x1) = x1  in ((copy_bool x0), (copy_bool x1)))))
             x2), (copy_out_class_type x3),
          (copy_out_rec_status x4))
  | From.Outcometree.Osig_typext (x0,x1) ->
      To.Outcometree.Osig_typext
        ((copy_out_extension_constructor x0),
          (copy_out_ext_status x1))
  | From.Outcometree.Osig_modtype (x0,x1) ->
      To.Outcometree.Osig_modtype
        (x0, (copy_out_module_type x1))
  | From.Outcometree.Osig_module (x0,x1,x2) ->
      To.Outcometree.Osig_module
        (x0, (copy_out_module_type x1),
          (copy_out_rec_status x2))
  | From.Outcometree.Osig_type (x0,x1) ->
      To.Outcometree.Osig_type
        ((copy_out_type_decl x0),
          (copy_out_rec_status x1))
  | From.Outcometree.Osig_value x0 ->
      To.Outcometree.Osig_value
        (copy_out_val_decl x0)
  | From.Outcometree.Osig_ellipsis  -> To.Outcometree.Osig_ellipsis

and copy_out_val_decl :
  From.Outcometree.out_val_decl -> To.Outcometree.out_val_decl =
  fun
    { From.Outcometree.oval_name = oval_name;
      From.Outcometree.oval_type = oval_type;
      From.Outcometree.oval_prims = oval_prims;
      From.Outcometree.oval_attributes = oval_attributes }
     ->
    {
      To.Outcometree.oval_name = oval_name;
      To.Outcometree.oval_type =
        (copy_out_type oval_type);
      To.Outcometree.oval_prims = (List.map (fun x  -> x) oval_prims);
      To.Outcometree.oval_attributes =
        (List.map copy_out_attribute oval_attributes)
    }

and copy_out_type_decl :
  From.Outcometree.out_type_decl -> To.Outcometree.out_type_decl =
  fun
    { From.Outcometree.otype_name = otype_name;
      From.Outcometree.otype_params = otype_params;
      From.Outcometree.otype_type = otype_type;
      From.Outcometree.otype_private = otype_private;
      From.Outcometree.otype_immediate = otype_immediate;
      From.Outcometree.otype_cstrs = otype_cstrs }
     ->
    {
      To.Outcometree.otype_name = otype_name;
      To.Outcometree.otype_params =
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              (x0, (let (x0,x1) = x1  in ((copy_bool x0), (copy_bool x1)))))
           otype_params);
      To.Outcometree.otype_type =
        (copy_out_type otype_type);
      To.Outcometree.otype_private =
        (copy_From_Asttypes_private_flag otype_private);
      To.Outcometree.otype_immediate = (copy_bool otype_immediate);
      To.Outcometree.otype_unboxed = false;
      To.Outcometree.otype_cstrs =
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_out_type x0),
                (copy_out_type x1))) otype_cstrs)
    }

and copy_out_module_type :
  From.Outcometree.out_module_type -> To.Outcometree.out_module_type
  =
  function
  | From.Outcometree.Omty_abstract  -> To.Outcometree.Omty_abstract
  | From.Outcometree.Omty_functor (x0,x1,x2) ->
      To.Outcometree.Omty_functor
        (x0, (copy_option copy_out_module_type x1),
          (copy_out_module_type x2))
  | From.Outcometree.Omty_ident x0 ->
      To.Outcometree.Omty_ident (copy_out_ident x0)
  | From.Outcometree.Omty_signature x0 ->
      To.Outcometree.Omty_signature
        (List.map copy_out_sig_item x0)
  | From.Outcometree.Omty_alias x0 ->
      To.Outcometree.Omty_alias (copy_out_ident x0)

and copy_out_ext_status :
  From.Outcometree.out_ext_status -> To.Outcometree.out_ext_status =
  function
  | From.Outcometree.Oext_first  -> To.Outcometree.Oext_first
  | From.Outcometree.Oext_next  -> To.Outcometree.Oext_next
  | From.Outcometree.Oext_exception  -> To.Outcometree.Oext_exception

and copy_out_extension_constructor :
  From.Outcometree.out_extension_constructor ->
    To.Outcometree.out_extension_constructor
  =
  fun
    { From.Outcometree.oext_name = oext_name;
      From.Outcometree.oext_type_name = oext_type_name;
      From.Outcometree.oext_type_params = oext_type_params;
      From.Outcometree.oext_args = oext_args;
      From.Outcometree.oext_ret_type = oext_ret_type;
      From.Outcometree.oext_private = oext_private }
     ->
    {
      To.Outcometree.oext_name = oext_name;
      To.Outcometree.oext_type_name = oext_type_name;
      To.Outcometree.oext_type_params =
        (List.map (fun x  -> x) oext_type_params);
      To.Outcometree.oext_args =
        (List.map copy_out_type oext_args);
      To.Outcometree.oext_ret_type =
        (copy_option copy_out_type oext_ret_type);
      To.Outcometree.oext_private =
        (copy_From_Asttypes_private_flag oext_private)
    }

and copy_From_Asttypes_private_flag :
  From.Asttypes.private_flag -> To.Asttypes.private_flag =
  function
  | From.Asttypes.Private  -> To.Asttypes.Private
  | From.Asttypes.Public  -> To.Asttypes.Public

and copy_out_rec_status :
  From.Outcometree.out_rec_status -> To.Outcometree.out_rec_status =
  function
  | From.Outcometree.Orec_not  -> To.Outcometree.Orec_not
  | From.Outcometree.Orec_first  -> To.Outcometree.Orec_first
  | From.Outcometree.Orec_next  -> To.Outcometree.Orec_next

and copy_out_class_type :
  From.Outcometree.out_class_type -> To.Outcometree.out_class_type =
  function
  | From.Outcometree.Octy_constr (x0,x1) ->
      To.Outcometree.Octy_constr
        ((copy_out_ident x0),
          (List.map copy_out_type x1))
  | From.Outcometree.Octy_arrow (x0,x1,x2) ->
      To.Outcometree.Octy_arrow
        (x0, (copy_out_type x1),
          (copy_out_class_type x2))
  | From.Outcometree.Octy_signature (x0,x1) ->
      To.Outcometree.Octy_signature
        ((copy_option copy_out_type x0),
          (List.map copy_out_class_sig_item x1))

and copy_out_class_sig_item :
  From.Outcometree.out_class_sig_item ->
    To.Outcometree.out_class_sig_item
  =
  function
  | From.Outcometree.Ocsg_constraint (x0,x1) ->
      To.Outcometree.Ocsg_constraint
        ((copy_out_type x0),
          (copy_out_type x1))
  | From.Outcometree.Ocsg_method (x0,x1,x2,x3) ->
      To.Outcometree.Ocsg_method
        (x0, (copy_bool x1), (copy_bool x2),
          (copy_out_type x3))
  | From.Outcometree.Ocsg_value (x0,x1,x2,x3) ->
      To.Outcometree.Ocsg_value
        (x0, (copy_bool x1), (copy_bool x2),
          (copy_out_type x3))

and copy_out_type :
  From.Outcometree.out_type -> To.Outcometree.out_type =
  function
  | From.Outcometree.Otyp_abstract  -> To.Outcometree.Otyp_abstract
  | From.Outcometree.Otyp_open  -> To.Outcometree.Otyp_open
  | From.Outcometree.Otyp_alias (x0,x1) ->
      To.Outcometree.Otyp_alias
        ((copy_out_type x0), x1)
  | From.Outcometree.Otyp_arrow (x0,x1,x2) ->
      To.Outcometree.Otyp_arrow
        (x0, (copy_out_type x1),
          (copy_out_type x2))
  | From.Outcometree.Otyp_class (x0,x1,x2) ->
      To.Outcometree.Otyp_class
        ((copy_bool x0), (copy_out_ident x1),
          (List.map copy_out_type x2))
  | From.Outcometree.Otyp_constr (x0,x1) ->
      To.Outcometree.Otyp_constr
        ((copy_out_ident x0),
          (List.map copy_out_type x1))
  | From.Outcometree.Otyp_manifest (x0,x1) ->
      To.Outcometree.Otyp_manifest
        ((copy_out_type x0),
          (copy_out_type x1))
  | From.Outcometree.Otyp_object (x0,x1) ->
      To.Outcometree.Otyp_object
        ((List.map
            (fun x  ->
               let (x0,x1) = x  in
               (x0, (copy_out_type x1))) x0),
          (copy_option copy_bool x1))
  | From.Outcometree.Otyp_record x0 ->
      To.Outcometree.Otyp_record
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              (x0, (copy_bool x1), (copy_out_type x2)))
           x0)
  | From.Outcometree.Otyp_stuff x0 -> To.Outcometree.Otyp_stuff x0
  | From.Outcometree.Otyp_sum x0 ->
      To.Outcometree.Otyp_sum
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              (x0, (List.map copy_out_type x1),
                (copy_option copy_out_type x2))) x0)
  | From.Outcometree.Otyp_tuple x0 ->
      To.Outcometree.Otyp_tuple
        (List.map copy_out_type x0)
  | From.Outcometree.Otyp_var (x0,x1) ->
      To.Outcometree.Otyp_var ((copy_bool x0), x1)
  | From.Outcometree.Otyp_variant (x0,x1,x2,x3) ->
      To.Outcometree.Otyp_variant
        ((copy_bool x0), (copy_out_variant x1),
          (copy_bool x2),
          (copy_option (fun x  -> List.map (fun x  -> x) x) x3))
  | From.Outcometree.Otyp_poly (x0,x1) ->
      To.Outcometree.Otyp_poly
        ((List.map (fun x  -> x) x0), (copy_out_type x1))
  | From.Outcometree.Otyp_module (x0,x1,x2) ->
      To.Outcometree.Otyp_module
        (x0, (List.map (fun x  -> x) x1),
          (List.map copy_out_type x2))
  | From.Outcometree.Otyp_attribute (x0,x1) ->
      To.Outcometree.Otyp_attribute
        ((copy_out_type x0),
          (copy_out_attribute x1))

and copy_out_attribute :
  From.Outcometree.out_attribute -> To.Outcometree.out_attribute =
  fun { From.Outcometree.oattr_name = oattr_name }  ->
    { To.Outcometree.oattr_name = oattr_name }

and copy_out_variant :
  From.Outcometree.out_variant -> To.Outcometree.out_variant =
  function
  | From.Outcometree.Ovar_fields x0 ->
      To.Outcometree.Ovar_fields
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              (x0, (copy_bool x1),
                (List.map copy_out_type x2))) x0)
  | From.Outcometree.Ovar_name (x0,x1) ->
      To.Outcometree.Ovar_name
        ((copy_out_ident x0),
          (List.map copy_out_type x1))

and copy_out_value :
  From.Outcometree.out_value -> To.Outcometree.out_value =
  function
  | From.Outcometree.Oval_array x0 ->
      To.Outcometree.Oval_array
        (List.map copy_out_value x0)
  | From.Outcometree.Oval_char x0 -> To.Outcometree.Oval_char x0
  | From.Outcometree.Oval_constr (x0,x1) ->
      To.Outcometree.Oval_constr
        ((copy_out_ident x0),
          (List.map copy_out_value x1))
  | From.Outcometree.Oval_ellipsis  -> To.Outcometree.Oval_ellipsis
  | From.Outcometree.Oval_float x0 ->
      To.Outcometree.Oval_float (copy_float x0)
  | From.Outcometree.Oval_int x0 -> To.Outcometree.Oval_int x0
  | From.Outcometree.Oval_int32 x0 -> To.Outcometree.Oval_int32 x0
  | From.Outcometree.Oval_int64 x0 -> To.Outcometree.Oval_int64 x0
  | From.Outcometree.Oval_nativeint x0 ->
      To.Outcometree.Oval_nativeint x0
  | From.Outcometree.Oval_list x0 ->
      To.Outcometree.Oval_list
        (List.map copy_out_value x0)
  | From.Outcometree.Oval_printer x0 ->
      To.Outcometree.Oval_printer x0
  | From.Outcometree.Oval_record x0 ->
      To.Outcometree.Oval_record
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_out_ident x0),
                (copy_out_value x1))) x0)
  | From.Outcometree.Oval_string x0 -> To.Outcometree.Oval_string x0
  | From.Outcometree.Oval_stuff x0 -> To.Outcometree.Oval_stuff x0
  | From.Outcometree.Oval_tuple x0 ->
      To.Outcometree.Oval_tuple
        (List.map copy_out_value x0)
  | From.Outcometree.Oval_variant (x0,x1) ->
      To.Outcometree.Oval_variant
        (x0, (copy_option copy_out_value x1))

and copy_float : float -> float = fun x  -> x

and copy_out_ident :
  From.Outcometree.out_ident -> To.Outcometree.out_ident =
  function
  | From.Outcometree.Oide_apply (x0,x1) ->
      To.Outcometree.Oide_apply ((copy_out_ident x0), (copy_out_ident x1))
  | From.Outcometree.Oide_dot (x0,x1) ->
      To.Outcometree.Oide_dot ((copy_out_ident x0), x1)
  | From.Outcometree.Oide_ident x0 -> To.Outcometree.Oide_ident x0

let rec copy_toplevel_phrase :
  From.Parsetree.toplevel_phrase -> To.Parsetree.toplevel_phrase =
  function
  | From.Parsetree.Ptop_def x0 ->
      To.Parsetree.Ptop_def (copy_structure x0)
  | From.Parsetree.Ptop_dir (x0,x1) ->
      To.Parsetree.Ptop_dir (x0, copy_directive_argument x1)

and copy_directive_argument :
  From.Parsetree.directive_argument -> To.Parsetree.directive_argument =
  function
  | From.Parsetree.Pdir_none  -> To.Parsetree.Pdir_none
  | From.Parsetree.Pdir_string x0 -> To.Parsetree.Pdir_string x0
  | From.Parsetree.Pdir_int (x0,x1) ->
      To.Parsetree.Pdir_int (x0, copy_option (fun x  -> x) x1)
  | From.Parsetree.Pdir_ident x0 ->
      To.Parsetree.Pdir_ident (copy_longident x0)
  | From.Parsetree.Pdir_bool x0 ->
      To.Parsetree.Pdir_bool (copy_bool x0)

let copy_out_type_extension :
  From.Outcometree.out_type_extension -> To.Outcometree.out_type_extension =
  fun
    { From.Outcometree.otyext_name = otyext_name;
      From.Outcometree.otyext_params = otyext_params;
      From.Outcometree.otyext_constructors = otyext_constructors;
      From.Outcometree.otyext_private = otyext_private }
     ->
    {
      To.Outcometree.otyext_name = otyext_name;
      To.Outcometree.otyext_params =
        (List.map (fun x  -> x) otyext_params);
      To.Outcometree.otyext_constructors =
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              (x0, (List.map copy_out_type x1),
                (copy_option copy_out_type x2)))
           otyext_constructors);
      To.Outcometree.otyext_private =
        (copy_private_flag otyext_private)
    }

let copy_cases x = List.map copy_case x
let copy_pat = copy_pattern
let copy_expr = copy_expression
let copy_typ = copy_core_type

end
module Migrate_parsetree_404_403_migrate
= struct
#1 "migrate_parsetree_404_403_migrate.ml"
# 1 "src/migrate_parsetree_404_403_migrate.ml"
(**************************************************************************)
(*                                                                        *)
(*                         OCaml Migrate Parsetree                        *)
(*                                                                        *)
(*                             Frédéric Bour                              *)
(*                         Alain Frisch, LexiFi                           *)
(*                                                                        *)
(*   Copyright 2017 Institut National de Recherche en Informatique et     *)
(*     en Automatique (INRIA).                                            *)
(*                                                                        *)
(*   All rights reserved.  This file is distributed under the terms of    *)
(*   the GNU Lesser General Public License version 2.1, with the          *)
(*   special exception on linking described in the file LICENSE.          *)
(*                                                                        *)
(**************************************************************************)

module Def = Migrate_parsetree_def
module From = Ast_404
module To = Ast_403

let from_loc {From.Location. txt = _; loc} = loc

let migration_error location feature =
  raise (Def.Migration_error (feature, location))

let rec copy_expression :
  From.Parsetree.expression ->
    To.Parsetree.expression
  =
  fun
    { From.Parsetree.pexp_desc = pexp_desc;
      From.Parsetree.pexp_loc = pexp_loc;
      From.Parsetree.pexp_attributes = pexp_attributes }
     ->
    {
      To.Parsetree.pexp_desc =
        (copy_expression_desc pexp_loc pexp_desc);
      To.Parsetree.pexp_loc =
        (copy_location pexp_loc);
      To.Parsetree.pexp_attributes =
        (copy_attributes pexp_attributes)
    }

and copy_expression_desc loc :
  From.Parsetree.expression_desc ->
    To.Parsetree.expression_desc
  =
  function
  | From.Parsetree.Pexp_ident x0 ->
      To.Parsetree.Pexp_ident
        (copy_loc copy_longident
           x0)
  | From.Parsetree.Pexp_constant x0 ->
      To.Parsetree.Pexp_constant
        (copy_constant x0)
  | From.Parsetree.Pexp_let (x0,x1,x2) ->
      To.Parsetree.Pexp_let
        ((copy_rec_flag x0),
          (List.map copy_value_binding x1),
          (copy_expression x2))
  | From.Parsetree.Pexp_function x0 ->
      To.Parsetree.Pexp_function
        (List.map copy_case x0)
  | From.Parsetree.Pexp_fun (x0,x1,x2,x3) ->
      To.Parsetree.Pexp_fun
        ((copy_arg_label x0),
          (copy_option copy_expression x1),
          (copy_pattern x2),
          (copy_expression x3))
  | From.Parsetree.Pexp_apply (x0,x1) ->
      To.Parsetree.Pexp_apply
        ((copy_expression x0),
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                ((copy_arg_label x0),
                  (copy_expression x1))) x1))
  | From.Parsetree.Pexp_match (x0,x1) ->
      To.Parsetree.Pexp_match
        ((copy_expression x0),
          (List.map copy_case x1))
  | From.Parsetree.Pexp_try (x0,x1) ->
      To.Parsetree.Pexp_try
        ((copy_expression x0),
          (List.map copy_case x1))
  | From.Parsetree.Pexp_tuple x0 ->
      To.Parsetree.Pexp_tuple
        (List.map copy_expression x0)
  | From.Parsetree.Pexp_construct (x0,x1) ->
      To.Parsetree.Pexp_construct
        ((copy_loc
            copy_longident x0),
          (copy_option copy_expression x1))
  | From.Parsetree.Pexp_variant (x0,x1) ->
      To.Parsetree.Pexp_variant
        ((copy_label x0),
          (copy_option copy_expression x1))
  | From.Parsetree.Pexp_record (x0,x1) ->
      To.Parsetree.Pexp_record
        ((List.map
            (fun x  ->
               let (x0,x1) = x  in
               ((copy_loc
                   copy_longident x0),
                 (copy_expression x1))) x0),
          (copy_option copy_expression x1))
  | From.Parsetree.Pexp_field (x0,x1) ->
      To.Parsetree.Pexp_field
        ((copy_expression x0),
          (copy_loc
             copy_longident x1))
  | From.Parsetree.Pexp_setfield (x0,x1,x2) ->
      To.Parsetree.Pexp_setfield
        ((copy_expression x0),
          (copy_loc
             copy_longident x1),
          (copy_expression x2))
  | From.Parsetree.Pexp_array x0 ->
      To.Parsetree.Pexp_array
        (List.map copy_expression x0)
  | From.Parsetree.Pexp_ifthenelse (x0,x1,x2) ->
      To.Parsetree.Pexp_ifthenelse
        ((copy_expression x0),
          (copy_expression x1),
          (copy_option copy_expression x2))
  | From.Parsetree.Pexp_sequence (x0,x1) ->
      To.Parsetree.Pexp_sequence
        ((copy_expression x0),
          (copy_expression x1))
  | From.Parsetree.Pexp_while (x0,x1) ->
      To.Parsetree.Pexp_while
        ((copy_expression x0),
          (copy_expression x1))
  | From.Parsetree.Pexp_for (x0,x1,x2,x3,x4) ->
      To.Parsetree.Pexp_for
        ((copy_pattern x0),
          (copy_expression x1),
          (copy_expression x2),
          (copy_direction_flag x3),
          (copy_expression x4))
  | From.Parsetree.Pexp_constraint (x0,x1) ->
      To.Parsetree.Pexp_constraint
        ((copy_expression x0),
          (copy_core_type x1))
  | From.Parsetree.Pexp_coerce (x0,x1,x2) ->
      To.Parsetree.Pexp_coerce
        ((copy_expression x0),
          (copy_option copy_core_type x1),
          (copy_core_type x2))
  | From.Parsetree.Pexp_send (x0,x1) ->
      To.Parsetree.Pexp_send
        ((copy_expression x0), x1)
  | From.Parsetree.Pexp_new x0 ->
      To.Parsetree.Pexp_new
        (copy_loc copy_longident
           x0)
  | From.Parsetree.Pexp_setinstvar (x0,x1) ->
      To.Parsetree.Pexp_setinstvar
        ((copy_loc (fun x  -> x) x0),
          (copy_expression x1))
  | From.Parsetree.Pexp_override x0 ->
      To.Parsetree.Pexp_override
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_loc (fun x  -> x) x0),
                (copy_expression x1))) x0)
  | From.Parsetree.Pexp_letmodule (x0,x1,x2) ->
      To.Parsetree.Pexp_letmodule
        ((copy_loc (fun x  -> x) x0),
          (copy_module_expr x1),
          (copy_expression x2))
  | From.Parsetree.Pexp_letexception _ ->
      migration_error loc Def.Pexp_letexception
  | From.Parsetree.Pexp_assert x0 ->
      To.Parsetree.Pexp_assert
        (copy_expression x0)
  | From.Parsetree.Pexp_lazy x0 ->
      To.Parsetree.Pexp_lazy
        (copy_expression x0)
  | From.Parsetree.Pexp_poly (x0,x1) ->
      To.Parsetree.Pexp_poly
        ((copy_expression x0),
          (copy_option copy_core_type x1))
  | From.Parsetree.Pexp_object x0 ->
      To.Parsetree.Pexp_object
        (copy_class_structure x0)
  | From.Parsetree.Pexp_newtype (x0,x1) ->
      To.Parsetree.Pexp_newtype
        (x0, (copy_expression x1))
  | From.Parsetree.Pexp_pack x0 ->
      To.Parsetree.Pexp_pack
        (copy_module_expr x0)
  | From.Parsetree.Pexp_open (x0,x1,x2) ->
      To.Parsetree.Pexp_open
        ((copy_override_flag x0),
          (copy_loc
             copy_longident x1),
          (copy_expression x2))
  | From.Parsetree.Pexp_extension x0 ->
      To.Parsetree.Pexp_extension
        (copy_extension x0)
  | From.Parsetree.Pexp_unreachable  ->
      To.Parsetree.Pexp_unreachable

and copy_direction_flag :
  From.Asttypes.direction_flag ->
    To.Asttypes.direction_flag
  =
  function
  | From.Asttypes.Upto  -> To.Asttypes.Upto
  | From.Asttypes.Downto  -> To.Asttypes.Downto

and copy_case :
  From.Parsetree.case -> To.Parsetree.case =
  fun
    { From.Parsetree.pc_lhs = pc_lhs;
      From.Parsetree.pc_guard = pc_guard;
      From.Parsetree.pc_rhs = pc_rhs }
     ->
    {
      To.Parsetree.pc_lhs =
        (copy_pattern pc_lhs);
      To.Parsetree.pc_guard =
        (copy_option copy_expression pc_guard);
      To.Parsetree.pc_rhs =
        (copy_expression pc_rhs)
    }

and copy_value_binding :
  From.Parsetree.value_binding ->
    To.Parsetree.value_binding
  =
  fun
    { From.Parsetree.pvb_pat = pvb_pat;
      From.Parsetree.pvb_expr = pvb_expr;
      From.Parsetree.pvb_attributes = pvb_attributes;
      From.Parsetree.pvb_loc = pvb_loc }
     ->
    {
      To.Parsetree.pvb_pat =
        (copy_pattern pvb_pat);
      To.Parsetree.pvb_expr =
        (copy_expression pvb_expr);
      To.Parsetree.pvb_attributes =
        (copy_attributes pvb_attributes);
      To.Parsetree.pvb_loc =
        (copy_location pvb_loc)
    }

and copy_pattern :
  From.Parsetree.pattern -> To.Parsetree.pattern =
  fun
    { From.Parsetree.ppat_desc = ppat_desc;
      From.Parsetree.ppat_loc = ppat_loc;
      From.Parsetree.ppat_attributes = ppat_attributes }
     ->
    {
      To.Parsetree.ppat_desc =
        (copy_pattern_desc ppat_loc ppat_desc);
      To.Parsetree.ppat_loc =
        (copy_location ppat_loc);
      To.Parsetree.ppat_attributes =
        (copy_attributes ppat_attributes)
    }

and copy_pattern_desc loc :
  From.Parsetree.pattern_desc ->
    To.Parsetree.pattern_desc
  =
  function
  | From.Parsetree.Ppat_any  ->
      To.Parsetree.Ppat_any
  | From.Parsetree.Ppat_var x0 ->
      To.Parsetree.Ppat_var
        (copy_loc (fun x  -> x) x0)
  | From.Parsetree.Ppat_alias (x0,x1) ->
      To.Parsetree.Ppat_alias
        ((copy_pattern x0),
          (copy_loc (fun x  -> x) x1))
  | From.Parsetree.Ppat_constant x0 ->
      To.Parsetree.Ppat_constant
        (copy_constant x0)
  | From.Parsetree.Ppat_interval (x0,x1) ->
      To.Parsetree.Ppat_interval
        ((copy_constant x0),
          (copy_constant x1))
  | From.Parsetree.Ppat_tuple x0 ->
      To.Parsetree.Ppat_tuple
        (List.map copy_pattern x0)
  | From.Parsetree.Ppat_construct (x0,x1) ->
      To.Parsetree.Ppat_construct
        ((copy_loc
            copy_longident x0),
          (copy_option copy_pattern x1))
  | From.Parsetree.Ppat_variant (x0,x1) ->
      To.Parsetree.Ppat_variant
        ((copy_label x0),
          (copy_option copy_pattern x1))
  | From.Parsetree.Ppat_record (x0,x1) ->
      To.Parsetree.Ppat_record
        ((List.map
            (fun x  ->
               let (x0,x1) = x  in
               ((copy_loc
                   copy_longident x0),
                 (copy_pattern x1))) x0),
          (copy_closed_flag x1))
  | From.Parsetree.Ppat_array x0 ->
      To.Parsetree.Ppat_array
        (List.map copy_pattern x0)
  | From.Parsetree.Ppat_or (x0,x1) ->
      To.Parsetree.Ppat_or
        ((copy_pattern x0),
          (copy_pattern x1))
  | From.Parsetree.Ppat_constraint (x0,x1) ->
      To.Parsetree.Ppat_constraint
        ((copy_pattern x0),
          (copy_core_type x1))
  | From.Parsetree.Ppat_type x0 ->
      To.Parsetree.Ppat_type
        (copy_loc copy_longident
           x0)
  | From.Parsetree.Ppat_lazy x0 ->
      To.Parsetree.Ppat_lazy
        (copy_pattern x0)
  | From.Parsetree.Ppat_unpack x0 ->
      To.Parsetree.Ppat_unpack
        (copy_loc (fun x  -> x) x0)
  | From.Parsetree.Ppat_exception x0 ->
      To.Parsetree.Ppat_exception
        (copy_pattern x0)
  | From.Parsetree.Ppat_extension x0 ->
      To.Parsetree.Ppat_extension
        (copy_extension x0)
  | From.Parsetree.Ppat_open _ ->
      migration_error loc Def.Ppat_open
and copy_core_type :
  From.Parsetree.core_type ->
    To.Parsetree.core_type
  =
  fun
    { From.Parsetree.ptyp_desc = ptyp_desc;
      From.Parsetree.ptyp_loc = ptyp_loc;
      From.Parsetree.ptyp_attributes = ptyp_attributes }
     ->
    {
      To.Parsetree.ptyp_desc =
        (copy_core_type_desc ptyp_desc);
      To.Parsetree.ptyp_loc =
        (copy_location ptyp_loc);
      To.Parsetree.ptyp_attributes =
        (copy_attributes ptyp_attributes)
    }

and copy_core_type_desc :
  From.Parsetree.core_type_desc ->
    To.Parsetree.core_type_desc
  =
  function
  | From.Parsetree.Ptyp_any  ->
      To.Parsetree.Ptyp_any
  | From.Parsetree.Ptyp_var x0 ->
      To.Parsetree.Ptyp_var x0
  | From.Parsetree.Ptyp_arrow (x0,x1,x2) ->
      To.Parsetree.Ptyp_arrow
        ((copy_arg_label x0),
          (copy_core_type x1),
          (copy_core_type x2))
  | From.Parsetree.Ptyp_tuple x0 ->
      To.Parsetree.Ptyp_tuple
        (List.map copy_core_type x0)
  | From.Parsetree.Ptyp_constr (x0,x1) ->
      To.Parsetree.Ptyp_constr
        ((copy_loc
            copy_longident x0),
          (List.map copy_core_type x1))
  | From.Parsetree.Ptyp_object (x0,x1) ->
      To.Parsetree.Ptyp_object
        ((List.map
            (fun x  ->
               let (x0,x1,x2) = x  in
               (x0, (copy_attributes x1),
                 (copy_core_type x2))) x0),
          (copy_closed_flag x1))
  | From.Parsetree.Ptyp_class (x0,x1) ->
      To.Parsetree.Ptyp_class
        ((copy_loc
            copy_longident x0),
          (List.map copy_core_type x1))
  | From.Parsetree.Ptyp_alias (x0,x1) ->
      To.Parsetree.Ptyp_alias
        ((copy_core_type x0), x1)
  | From.Parsetree.Ptyp_variant (x0,x1,x2) ->
      To.Parsetree.Ptyp_variant
        ((List.map copy_row_field x0),
          (copy_closed_flag x1),
          (copy_option
             (fun x  -> List.map copy_label x) x2))
  | From.Parsetree.Ptyp_poly (x0,x1) ->
      To.Parsetree.Ptyp_poly
        ((List.map (fun x  -> x) x0),
          (copy_core_type x1))
  | From.Parsetree.Ptyp_package x0 ->
      To.Parsetree.Ptyp_package
        (copy_package_type x0)
  | From.Parsetree.Ptyp_extension x0 ->
      To.Parsetree.Ptyp_extension
        (copy_extension x0)

and copy_package_type :
  From.Parsetree.package_type ->
    To.Parsetree.package_type
  =
  fun x  ->
    let (x0,x1) = x  in
    ((copy_loc copy_longident x0),
      (List.map
         (fun x  ->
            let (x0,x1) = x  in
            ((copy_loc
                copy_longident x0),
              (copy_core_type x1))) x1))

and copy_row_field :
  From.Parsetree.row_field ->
    To.Parsetree.row_field
  =
  function
  | From.Parsetree.Rtag (x0,x1,x2,x3) ->
      To.Parsetree.Rtag
        ((copy_label x0),
          (copy_attributes x1), (copy_bool x2),
          (List.map copy_core_type x3))
  | From.Parsetree.Rinherit x0 ->
      To.Parsetree.Rinherit
        (copy_core_type x0)

and copy_attributes :
  From.Parsetree.attributes ->
    To.Parsetree.attributes
  = fun x  -> List.map copy_attribute x

and copy_attribute :
  From.Parsetree.attribute ->
    To.Parsetree.attribute
  =
  fun x  ->
    let (x0,x1) = x  in
    ((copy_loc (fun x  -> x) x0),
      (copy_payload x1))

and copy_payload :
  From.Parsetree.payload -> To.Parsetree.payload =
  function
  | From.Parsetree.PStr x0 ->
      To.Parsetree.PStr
        (copy_structure x0)
  | From.Parsetree.PSig x0 ->
      To.Parsetree.PSig
        (copy_signature x0)
  | From.Parsetree.PTyp x0 ->
      To.Parsetree.PTyp
        (copy_core_type x0)
  | From.Parsetree.PPat (x0,x1) ->
      To.Parsetree.PPat
        ((copy_pattern x0),
          (copy_option copy_expression x1))

and copy_structure :
  From.Parsetree.structure ->
    To.Parsetree.structure
  = fun x  -> List.map copy_structure_item x

and copy_structure_item :
  From.Parsetree.structure_item ->
    To.Parsetree.structure_item
  =
  fun
    { From.Parsetree.pstr_desc = pstr_desc;
      From.Parsetree.pstr_loc = pstr_loc }
     ->
    {
      To.Parsetree.pstr_desc =
        (copy_structure_item_desc pstr_desc);
      To.Parsetree.pstr_loc =
        (copy_location pstr_loc)
    }

and copy_structure_item_desc :
  From.Parsetree.structure_item_desc ->
    To.Parsetree.structure_item_desc
  =
  function
  | From.Parsetree.Pstr_eval (x0,x1) ->
      To.Parsetree.Pstr_eval
        ((copy_expression x0),
          (copy_attributes x1))
  | From.Parsetree.Pstr_value (x0,x1) ->
      To.Parsetree.Pstr_value
        ((copy_rec_flag x0),
          (List.map copy_value_binding x1))
  | From.Parsetree.Pstr_primitive x0 ->
      To.Parsetree.Pstr_primitive
        (copy_value_description x0)
  | From.Parsetree.Pstr_type (x0,x1) ->
      To.Parsetree.Pstr_type
        ((copy_rec_flag x0),
          (List.map copy_type_declaration x1))
  | From.Parsetree.Pstr_typext x0 ->
      To.Parsetree.Pstr_typext
        (copy_type_extension x0)
  | From.Parsetree.Pstr_exception x0 ->
      To.Parsetree.Pstr_exception
        (copy_extension_constructor x0)
  | From.Parsetree.Pstr_module x0 ->
      To.Parsetree.Pstr_module
        (copy_module_binding x0)
  | From.Parsetree.Pstr_recmodule x0 ->
      To.Parsetree.Pstr_recmodule
        (List.map copy_module_binding x0)
  | From.Parsetree.Pstr_modtype x0 ->
      To.Parsetree.Pstr_modtype
        (copy_module_type_declaration x0)
  | From.Parsetree.Pstr_open x0 ->
      To.Parsetree.Pstr_open
        (copy_open_description x0)
  | From.Parsetree.Pstr_class x0 ->
      To.Parsetree.Pstr_class
        (List.map copy_class_declaration x0)
  | From.Parsetree.Pstr_class_type x0 ->
      To.Parsetree.Pstr_class_type
        (List.map copy_class_type_declaration x0)
  | From.Parsetree.Pstr_include x0 ->
      To.Parsetree.Pstr_include
        (copy_include_declaration x0)
  | From.Parsetree.Pstr_attribute x0 ->
      To.Parsetree.Pstr_attribute
        (copy_attribute x0)
  | From.Parsetree.Pstr_extension (x0,x1) ->
      To.Parsetree.Pstr_extension
        ((copy_extension x0),
          (copy_attributes x1))

and copy_include_declaration :
  From.Parsetree.include_declaration ->
    To.Parsetree.include_declaration
  =
  fun x  ->
    copy_include_infos
      copy_module_expr x

and copy_class_declaration :
  From.Parsetree.class_declaration ->
    To.Parsetree.class_declaration
  =
  fun x  ->
    copy_class_infos
      copy_class_expr x

and copy_class_expr :
  From.Parsetree.class_expr ->
    To.Parsetree.class_expr
  =
  fun
    { From.Parsetree.pcl_desc = pcl_desc;
      From.Parsetree.pcl_loc = pcl_loc;
      From.Parsetree.pcl_attributes = pcl_attributes }
     ->
    {
      To.Parsetree.pcl_desc =
        (copy_class_expr_desc pcl_desc);
      To.Parsetree.pcl_loc =
        (copy_location pcl_loc);
      To.Parsetree.pcl_attributes =
        (copy_attributes pcl_attributes)
    }

and copy_class_expr_desc :
  From.Parsetree.class_expr_desc ->
    To.Parsetree.class_expr_desc
  =
  function
  | From.Parsetree.Pcl_constr (x0,x1) ->
      To.Parsetree.Pcl_constr
        ((copy_loc
            copy_longident x0),
          (List.map copy_core_type x1))
  | From.Parsetree.Pcl_structure x0 ->
      To.Parsetree.Pcl_structure
        (copy_class_structure x0)
  | From.Parsetree.Pcl_fun (x0,x1,x2,x3) ->
      To.Parsetree.Pcl_fun
        ((copy_arg_label x0),
          (copy_option copy_expression x1),
          (copy_pattern x2),
          (copy_class_expr x3))
  | From.Parsetree.Pcl_apply (x0,x1) ->
      To.Parsetree.Pcl_apply
        ((copy_class_expr x0),
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                ((copy_arg_label x0),
                  (copy_expression x1))) x1))
  | From.Parsetree.Pcl_let (x0,x1,x2) ->
      To.Parsetree.Pcl_let
        ((copy_rec_flag x0),
          (List.map copy_value_binding x1),
          (copy_class_expr x2))
  | From.Parsetree.Pcl_constraint (x0,x1) ->
      To.Parsetree.Pcl_constraint
        ((copy_class_expr x0),
          (copy_class_type x1))
  | From.Parsetree.Pcl_extension x0 ->
      To.Parsetree.Pcl_extension
        (copy_extension x0)

and copy_class_structure :
  From.Parsetree.class_structure ->
    To.Parsetree.class_structure
  =
  fun
    { From.Parsetree.pcstr_self = pcstr_self;
      From.Parsetree.pcstr_fields = pcstr_fields }
     ->
    {
      To.Parsetree.pcstr_self =
        (copy_pattern pcstr_self);
      To.Parsetree.pcstr_fields =
        (List.map copy_class_field pcstr_fields)
    }

and copy_class_field :
  From.Parsetree.class_field ->
    To.Parsetree.class_field
  =
  fun
    { From.Parsetree.pcf_desc = pcf_desc;
      From.Parsetree.pcf_loc = pcf_loc;
      From.Parsetree.pcf_attributes = pcf_attributes }
     ->
    {
      To.Parsetree.pcf_desc =
        (copy_class_field_desc pcf_desc);
      To.Parsetree.pcf_loc =
        (copy_location pcf_loc);
      To.Parsetree.pcf_attributes =
        (copy_attributes pcf_attributes)
    }

and copy_class_field_desc :
  From.Parsetree.class_field_desc ->
    To.Parsetree.class_field_desc
  =
  function
  | From.Parsetree.Pcf_inherit (x0,x1,x2) ->
      To.Parsetree.Pcf_inherit
        ((copy_override_flag x0),
          (copy_class_expr x1),
          (copy_option (fun x  -> x) x2))
  | From.Parsetree.Pcf_val x0 ->
      To.Parsetree.Pcf_val
        (let (x0,x1,x2) = x0  in
         ((copy_loc (fun x  -> x) x0),
           (copy_mutable_flag x1),
           (copy_class_field_kind x2)))
  | From.Parsetree.Pcf_method x0 ->
      To.Parsetree.Pcf_method
        (let (x0,x1,x2) = x0  in
         ((copy_loc (fun x  -> x) x0),
           (copy_private_flag x1),
           (copy_class_field_kind x2)))
  | From.Parsetree.Pcf_constraint x0 ->
      To.Parsetree.Pcf_constraint
        (let (x0,x1) = x0  in
         ((copy_core_type x0),
           (copy_core_type x1)))
  | From.Parsetree.Pcf_initializer x0 ->
      To.Parsetree.Pcf_initializer
        (copy_expression x0)
  | From.Parsetree.Pcf_attribute x0 ->
      To.Parsetree.Pcf_attribute
        (copy_attribute x0)
  | From.Parsetree.Pcf_extension x0 ->
      To.Parsetree.Pcf_extension
        (copy_extension x0)

and copy_class_field_kind :
  From.Parsetree.class_field_kind ->
    To.Parsetree.class_field_kind
  =
  function
  | From.Parsetree.Cfk_virtual x0 ->
      To.Parsetree.Cfk_virtual
        (copy_core_type x0)
  | From.Parsetree.Cfk_concrete (x0,x1) ->
      To.Parsetree.Cfk_concrete
        ((copy_override_flag x0),
          (copy_expression x1))

and copy_module_binding :
  From.Parsetree.module_binding ->
    To.Parsetree.module_binding
  =
  fun
    { From.Parsetree.pmb_name = pmb_name;
      From.Parsetree.pmb_expr = pmb_expr;
      From.Parsetree.pmb_attributes = pmb_attributes;
      From.Parsetree.pmb_loc = pmb_loc }
     ->
    {
      To.Parsetree.pmb_name =
        (copy_loc (fun x  -> x) pmb_name);
      To.Parsetree.pmb_expr =
        (copy_module_expr pmb_expr);
      To.Parsetree.pmb_attributes =
        (copy_attributes pmb_attributes);
      To.Parsetree.pmb_loc =
        (copy_location pmb_loc)
    }

and copy_module_expr :
  From.Parsetree.module_expr ->
    To.Parsetree.module_expr
  =
  fun
    { From.Parsetree.pmod_desc = pmod_desc;
      From.Parsetree.pmod_loc = pmod_loc;
      From.Parsetree.pmod_attributes = pmod_attributes }
     ->
    {
      To.Parsetree.pmod_desc =
        (copy_module_expr_desc pmod_desc);
      To.Parsetree.pmod_loc =
        (copy_location pmod_loc);
      To.Parsetree.pmod_attributes =
        (copy_attributes pmod_attributes)
    }

and copy_module_expr_desc :
  From.Parsetree.module_expr_desc ->
    To.Parsetree.module_expr_desc
  =
  function
  | From.Parsetree.Pmod_ident x0 ->
      To.Parsetree.Pmod_ident
        (copy_loc copy_longident
           x0)
  | From.Parsetree.Pmod_structure x0 ->
      To.Parsetree.Pmod_structure
        (copy_structure x0)
  | From.Parsetree.Pmod_functor (x0,x1,x2) ->
      To.Parsetree.Pmod_functor
        ((copy_loc (fun x  -> x) x0),
          (copy_option copy_module_type x1),
          (copy_module_expr x2))
  | From.Parsetree.Pmod_apply (x0,x1) ->
      To.Parsetree.Pmod_apply
        ((copy_module_expr x0),
          (copy_module_expr x1))
  | From.Parsetree.Pmod_constraint (x0,x1) ->
      To.Parsetree.Pmod_constraint
        ((copy_module_expr x0),
          (copy_module_type x1))
  | From.Parsetree.Pmod_unpack x0 ->
      To.Parsetree.Pmod_unpack
        (copy_expression x0)
  | From.Parsetree.Pmod_extension x0 ->
      To.Parsetree.Pmod_extension
        (copy_extension x0)

and copy_module_type :
  From.Parsetree.module_type ->
    To.Parsetree.module_type
  =
  fun
    { From.Parsetree.pmty_desc = pmty_desc;
      From.Parsetree.pmty_loc = pmty_loc;
      From.Parsetree.pmty_attributes = pmty_attributes }
     ->
    {
      To.Parsetree.pmty_desc =
        (copy_module_type_desc pmty_desc);
      To.Parsetree.pmty_loc =
        (copy_location pmty_loc);
      To.Parsetree.pmty_attributes =
        (copy_attributes pmty_attributes)
    }

and copy_module_type_desc :
  From.Parsetree.module_type_desc ->
    To.Parsetree.module_type_desc
  =
  function
  | From.Parsetree.Pmty_ident x0 ->
      To.Parsetree.Pmty_ident
        (copy_loc copy_longident
           x0)
  | From.Parsetree.Pmty_signature x0 ->
      To.Parsetree.Pmty_signature
        (copy_signature x0)
  | From.Parsetree.Pmty_functor (x0,x1,x2) ->
      To.Parsetree.Pmty_functor
        ((copy_loc (fun x  -> x) x0),
          (copy_option copy_module_type x1),
          (copy_module_type x2))
  | From.Parsetree.Pmty_with (x0,x1) ->
      To.Parsetree.Pmty_with
        ((copy_module_type x0),
          (List.map copy_with_constraint x1))
  | From.Parsetree.Pmty_typeof x0 ->
      To.Parsetree.Pmty_typeof
        (copy_module_expr x0)
  | From.Parsetree.Pmty_extension x0 ->
      To.Parsetree.Pmty_extension
        (copy_extension x0)
  | From.Parsetree.Pmty_alias x0 ->
      To.Parsetree.Pmty_alias
        (copy_loc copy_longident
           x0)

and copy_with_constraint :
  From.Parsetree.with_constraint ->
    To.Parsetree.with_constraint
  =
  function
  | From.Parsetree.Pwith_type (x0,x1) ->
      To.Parsetree.Pwith_type
        ((copy_loc
            copy_longident x0),
          (copy_type_declaration x1))
  | From.Parsetree.Pwith_module (x0,x1) ->
      To.Parsetree.Pwith_module
        ((copy_loc
            copy_longident x0),
          (copy_loc
             copy_longident x1))
  | From.Parsetree.Pwith_typesubst x0 ->
      To.Parsetree.Pwith_typesubst
        (copy_type_declaration x0)
  | From.Parsetree.Pwith_modsubst (x0,x1) ->
      To.Parsetree.Pwith_modsubst
        ((copy_loc (fun x  -> x) x0),
          (copy_loc
             copy_longident x1))

and copy_signature :
  From.Parsetree.signature ->
    To.Parsetree.signature
  = fun x  -> List.map copy_signature_item x

and copy_signature_item :
  From.Parsetree.signature_item ->
    To.Parsetree.signature_item
  =
  fun
    { From.Parsetree.psig_desc = psig_desc;
      From.Parsetree.psig_loc = psig_loc }
     ->
    {
      To.Parsetree.psig_desc =
        (copy_signature_item_desc psig_desc);
      To.Parsetree.psig_loc =
        (copy_location psig_loc)
    }

and copy_signature_item_desc :
  From.Parsetree.signature_item_desc ->
    To.Parsetree.signature_item_desc
  =
  function
  | From.Parsetree.Psig_value x0 ->
      To.Parsetree.Psig_value
        (copy_value_description x0)
  | From.Parsetree.Psig_type (x0,x1) ->
      To.Parsetree.Psig_type
        ((copy_rec_flag x0),
          (List.map copy_type_declaration x1))
  | From.Parsetree.Psig_typext x0 ->
      To.Parsetree.Psig_typext
        (copy_type_extension x0)
  | From.Parsetree.Psig_exception x0 ->
      To.Parsetree.Psig_exception
        (copy_extension_constructor x0)
  | From.Parsetree.Psig_module x0 ->
      To.Parsetree.Psig_module
        (copy_module_declaration x0)
  | From.Parsetree.Psig_recmodule x0 ->
      To.Parsetree.Psig_recmodule
        (List.map copy_module_declaration x0)
  | From.Parsetree.Psig_modtype x0 ->
      To.Parsetree.Psig_modtype
        (copy_module_type_declaration x0)
  | From.Parsetree.Psig_open x0 ->
      To.Parsetree.Psig_open
        (copy_open_description x0)
  | From.Parsetree.Psig_include x0 ->
      To.Parsetree.Psig_include
        (copy_include_description x0)
  | From.Parsetree.Psig_class x0 ->
      To.Parsetree.Psig_class
        (List.map copy_class_description x0)
  | From.Parsetree.Psig_class_type x0 ->
      To.Parsetree.Psig_class_type
        (List.map copy_class_type_declaration x0)
  | From.Parsetree.Psig_attribute x0 ->
      To.Parsetree.Psig_attribute
        (copy_attribute x0)
  | From.Parsetree.Psig_extension (x0,x1) ->
      To.Parsetree.Psig_extension
        ((copy_extension x0),
          (copy_attributes x1))

and copy_class_type_declaration :
  From.Parsetree.class_type_declaration ->
    To.Parsetree.class_type_declaration
  =
  fun x  ->
    copy_class_infos
      copy_class_type x

and copy_class_description :
  From.Parsetree.class_description ->
    To.Parsetree.class_description
  =
  fun x  ->
    copy_class_infos
      copy_class_type x

and copy_class_type :
  From.Parsetree.class_type ->
    To.Parsetree.class_type
  =
  fun
    { From.Parsetree.pcty_desc = pcty_desc;
      From.Parsetree.pcty_loc = pcty_loc;
      From.Parsetree.pcty_attributes = pcty_attributes }
     ->
    {
      To.Parsetree.pcty_desc =
        (copy_class_type_desc pcty_desc);
      To.Parsetree.pcty_loc =
        (copy_location pcty_loc);
      To.Parsetree.pcty_attributes =
        (copy_attributes pcty_attributes)
    }

and copy_class_type_desc :
  From.Parsetree.class_type_desc ->
    To.Parsetree.class_type_desc
  =
  function
  | From.Parsetree.Pcty_constr (x0,x1) ->
      To.Parsetree.Pcty_constr
        ((copy_loc
            copy_longident x0),
          (List.map copy_core_type x1))
  | From.Parsetree.Pcty_signature x0 ->
      To.Parsetree.Pcty_signature
        (copy_class_signature x0)
  | From.Parsetree.Pcty_arrow (x0,x1,x2) ->
      To.Parsetree.Pcty_arrow
        ((copy_arg_label x0),
          (copy_core_type x1),
          (copy_class_type x2))
  | From.Parsetree.Pcty_extension x0 ->
      To.Parsetree.Pcty_extension
        (copy_extension x0)

and copy_class_signature :
  From.Parsetree.class_signature ->
    To.Parsetree.class_signature
  =
  fun
    { From.Parsetree.pcsig_self = pcsig_self;
      From.Parsetree.pcsig_fields = pcsig_fields }
     ->
    {
      To.Parsetree.pcsig_self =
        (copy_core_type pcsig_self);
      To.Parsetree.pcsig_fields =
        (List.map copy_class_type_field
           pcsig_fields)
    }

and copy_class_type_field :
  From.Parsetree.class_type_field ->
    To.Parsetree.class_type_field
  =
  fun
    { From.Parsetree.pctf_desc = pctf_desc;
      From.Parsetree.pctf_loc = pctf_loc;
      From.Parsetree.pctf_attributes = pctf_attributes }
     ->
    {
      To.Parsetree.pctf_desc =
        (copy_class_type_field_desc pctf_desc);
      To.Parsetree.pctf_loc =
        (copy_location pctf_loc);
      To.Parsetree.pctf_attributes =
        (copy_attributes pctf_attributes)
    }

and copy_class_type_field_desc :
  From.Parsetree.class_type_field_desc ->
    To.Parsetree.class_type_field_desc
  =
  function
  | From.Parsetree.Pctf_inherit x0 ->
      To.Parsetree.Pctf_inherit
        (copy_class_type x0)
  | From.Parsetree.Pctf_val x0 ->
      To.Parsetree.Pctf_val
        (let (x0,x1,x2,x3) = x0  in
         (x0, (copy_mutable_flag x1),
           (copy_virtual_flag x2),
           (copy_core_type x3)))
  | From.Parsetree.Pctf_method x0 ->
      To.Parsetree.Pctf_method
        (let (x0,x1,x2,x3) = x0  in
         (x0, (copy_private_flag x1),
           (copy_virtual_flag x2),
           (copy_core_type x3)))
  | From.Parsetree.Pctf_constraint x0 ->
      To.Parsetree.Pctf_constraint
        (let (x0,x1) = x0  in
         ((copy_core_type x0),
           (copy_core_type x1)))
  | From.Parsetree.Pctf_attribute x0 ->
      To.Parsetree.Pctf_attribute
        (copy_attribute x0)
  | From.Parsetree.Pctf_extension x0 ->
      To.Parsetree.Pctf_extension
        (copy_extension x0)

and copy_extension :
  From.Parsetree.extension ->
    To.Parsetree.extension
  =
  fun x  ->
    let (x0,x1) = x  in
    ((copy_loc (fun x  -> x) x0),
      (copy_payload x1))

and copy_class_infos :
  'f0 'g0 .
    ('f0 -> 'g0) ->
      'f0 From.Parsetree.class_infos ->
        'g0 To.Parsetree.class_infos
  =
  fun f0  ->
    fun
      { From.Parsetree.pci_virt = pci_virt;
        From.Parsetree.pci_params = pci_params;
        From.Parsetree.pci_name = pci_name;
        From.Parsetree.pci_expr = pci_expr;
        From.Parsetree.pci_loc = pci_loc;
        From.Parsetree.pci_attributes = pci_attributes }
       ->
      {
        To.Parsetree.pci_virt =
          (copy_virtual_flag pci_virt);
        To.Parsetree.pci_params =
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                ((copy_core_type x0),
                  (copy_variance x1))) pci_params);
        To.Parsetree.pci_name =
          (copy_loc (fun x  -> x) pci_name);
        To.Parsetree.pci_expr = (f0 pci_expr);
        To.Parsetree.pci_loc =
          (copy_location pci_loc);
        To.Parsetree.pci_attributes =
          (copy_attributes pci_attributes)
      }

and copy_virtual_flag :
  From.Asttypes.virtual_flag ->
    To.Asttypes.virtual_flag
  =
  function
  | From.Asttypes.Virtual  -> To.Asttypes.Virtual
  | From.Asttypes.Concrete  -> To.Asttypes.Concrete

and copy_include_description :
  From.Parsetree.include_description ->
    To.Parsetree.include_description
  =
  fun x  ->
    copy_include_infos
      copy_module_type x

and copy_include_infos :
  'f0 'g0 .
    ('f0 -> 'g0) ->
      'f0 From.Parsetree.include_infos ->
        'g0 To.Parsetree.include_infos
  =
  fun f0  ->
    fun
      { From.Parsetree.pincl_mod = pincl_mod;
        From.Parsetree.pincl_loc = pincl_loc;
        From.Parsetree.pincl_attributes = pincl_attributes }
       ->
      {
        To.Parsetree.pincl_mod = (f0 pincl_mod);
        To.Parsetree.pincl_loc =
          (copy_location pincl_loc);
        To.Parsetree.pincl_attributes =
          (copy_attributes pincl_attributes)
      }

and copy_open_description :
  From.Parsetree.open_description ->
    To.Parsetree.open_description
  =
  fun
    { From.Parsetree.popen_lid = popen_lid;
      From.Parsetree.popen_override = popen_override;
      From.Parsetree.popen_loc = popen_loc;
      From.Parsetree.popen_attributes = popen_attributes }
     ->
    {
      To.Parsetree.popen_lid =
        (copy_loc copy_longident
           popen_lid);
      To.Parsetree.popen_override =
        (copy_override_flag popen_override);
      To.Parsetree.popen_loc =
        (copy_location popen_loc);
      To.Parsetree.popen_attributes =
        (copy_attributes popen_attributes)
    }

and copy_override_flag :
  From.Asttypes.override_flag ->
    To.Asttypes.override_flag
  =
  function
  | From.Asttypes.Override  -> To.Asttypes.Override
  | From.Asttypes.Fresh  -> To.Asttypes.Fresh

and copy_module_type_declaration :
  From.Parsetree.module_type_declaration ->
    To.Parsetree.module_type_declaration
  =
  fun
    { From.Parsetree.pmtd_name = pmtd_name;
      From.Parsetree.pmtd_type = pmtd_type;
      From.Parsetree.pmtd_attributes = pmtd_attributes;
      From.Parsetree.pmtd_loc = pmtd_loc }
     ->
    {
      To.Parsetree.pmtd_name =
        (copy_loc (fun x  -> x) pmtd_name);
      To.Parsetree.pmtd_type =
        (copy_option copy_module_type pmtd_type);
      To.Parsetree.pmtd_attributes =
        (copy_attributes pmtd_attributes);
      To.Parsetree.pmtd_loc =
        (copy_location pmtd_loc)
    }

and copy_module_declaration :
  From.Parsetree.module_declaration ->
    To.Parsetree.module_declaration
  =
  fun
    { From.Parsetree.pmd_name = pmd_name;
      From.Parsetree.pmd_type = pmd_type;
      From.Parsetree.pmd_attributes = pmd_attributes;
      From.Parsetree.pmd_loc = pmd_loc }
     ->
    {
      To.Parsetree.pmd_name =
        (copy_loc (fun x  -> x) pmd_name);
      To.Parsetree.pmd_type =
        (copy_module_type pmd_type);
      To.Parsetree.pmd_attributes =
        (copy_attributes pmd_attributes);
      To.Parsetree.pmd_loc =
        (copy_location pmd_loc)
    }

and copy_type_extension :
  From.Parsetree.type_extension ->
    To.Parsetree.type_extension
  =
  fun
    { From.Parsetree.ptyext_path = ptyext_path;
      From.Parsetree.ptyext_params = ptyext_params;
      From.Parsetree.ptyext_constructors = ptyext_constructors;
      From.Parsetree.ptyext_private = ptyext_private;
      From.Parsetree.ptyext_attributes = ptyext_attributes }
     ->
    {
      To.Parsetree.ptyext_path =
        (copy_loc copy_longident
           ptyext_path);
      To.Parsetree.ptyext_params =
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_core_type x0),
                (copy_variance x1))) ptyext_params);
      To.Parsetree.ptyext_constructors =
        (List.map copy_extension_constructor
           ptyext_constructors);
      To.Parsetree.ptyext_private =
        (copy_private_flag ptyext_private);
      To.Parsetree.ptyext_attributes =
        (copy_attributes ptyext_attributes)
    }

and copy_extension_constructor :
  From.Parsetree.extension_constructor ->
    To.Parsetree.extension_constructor
  =
  fun
    { From.Parsetree.pext_name = pext_name;
      From.Parsetree.pext_kind = pext_kind;
      From.Parsetree.pext_loc = pext_loc;
      From.Parsetree.pext_attributes = pext_attributes }
     ->
    {
      To.Parsetree.pext_name =
        (copy_loc (fun x  -> x) pext_name);
      To.Parsetree.pext_kind =
        (copy_extension_constructor_kind pext_kind);
      To.Parsetree.pext_loc =
        (copy_location pext_loc);
      To.Parsetree.pext_attributes =
        (copy_attributes pext_attributes)
    }

and copy_extension_constructor_kind :
  From.Parsetree.extension_constructor_kind ->
    To.Parsetree.extension_constructor_kind
  =
  function
  | From.Parsetree.Pext_decl (x0,x1) ->
      To.Parsetree.Pext_decl
        ((copy_constructor_arguments x0),
          (copy_option copy_core_type x1))
  | From.Parsetree.Pext_rebind x0 ->
      To.Parsetree.Pext_rebind
        (copy_loc copy_longident
           x0)

and copy_type_declaration :
  From.Parsetree.type_declaration ->
    To.Parsetree.type_declaration
  =
  fun
    { From.Parsetree.ptype_name = ptype_name;
      From.Parsetree.ptype_params = ptype_params;
      From.Parsetree.ptype_cstrs = ptype_cstrs;
      From.Parsetree.ptype_kind = ptype_kind;
      From.Parsetree.ptype_private = ptype_private;
      From.Parsetree.ptype_manifest = ptype_manifest;
      From.Parsetree.ptype_attributes = ptype_attributes;
      From.Parsetree.ptype_loc = ptype_loc }
     ->
    {
      To.Parsetree.ptype_name =
        (copy_loc (fun x  -> x) ptype_name);
      To.Parsetree.ptype_params =
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_core_type x0),
                (copy_variance x1))) ptype_params);
      To.Parsetree.ptype_cstrs =
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              ((copy_core_type x0),
                (copy_core_type x1),
                (copy_location x2))) ptype_cstrs);
      To.Parsetree.ptype_kind =
        (copy_type_kind ptype_kind);
      To.Parsetree.ptype_private =
        (copy_private_flag ptype_private);
      To.Parsetree.ptype_manifest =
        (copy_option copy_core_type ptype_manifest);
      To.Parsetree.ptype_attributes =
        (copy_attributes ptype_attributes);
      To.Parsetree.ptype_loc =
        (copy_location ptype_loc)
    }

and copy_private_flag :
  From.Asttypes.private_flag ->
    To.Asttypes.private_flag
  =
  function
  | From.Asttypes.Private  -> To.Asttypes.Private
  | From.Asttypes.Public  -> To.Asttypes.Public

and copy_type_kind :
  From.Parsetree.type_kind ->
    To.Parsetree.type_kind
  =
  function
  | From.Parsetree.Ptype_abstract  ->
      To.Parsetree.Ptype_abstract
  | From.Parsetree.Ptype_variant x0 ->
      To.Parsetree.Ptype_variant
        (List.map copy_constructor_declaration x0)
  | From.Parsetree.Ptype_record x0 ->
      To.Parsetree.Ptype_record
        (List.map copy_label_declaration x0)
  | From.Parsetree.Ptype_open  ->
      To.Parsetree.Ptype_open

and copy_constructor_declaration :
  From.Parsetree.constructor_declaration ->
    To.Parsetree.constructor_declaration
  =
  fun
    { From.Parsetree.pcd_name = pcd_name;
      From.Parsetree.pcd_args = pcd_args;
      From.Parsetree.pcd_res = pcd_res;
      From.Parsetree.pcd_loc = pcd_loc;
      From.Parsetree.pcd_attributes = pcd_attributes }
     ->
    {
      To.Parsetree.pcd_name =
        (copy_loc (fun x  -> x) pcd_name);
      To.Parsetree.pcd_args =
        (copy_constructor_arguments pcd_args);
      To.Parsetree.pcd_res =
        (copy_option copy_core_type pcd_res);
      To.Parsetree.pcd_loc =
        (copy_location pcd_loc);
      To.Parsetree.pcd_attributes =
        (copy_attributes pcd_attributes)
    }

and copy_constructor_arguments :
  From.Parsetree.constructor_arguments ->
    To.Parsetree.constructor_arguments
  =
  function
  | From.Parsetree.Pcstr_tuple x0 ->
      To.Parsetree.Pcstr_tuple
        (List.map copy_core_type x0)
  | From.Parsetree.Pcstr_record x0 ->
      To.Parsetree.Pcstr_record
        (List.map copy_label_declaration x0)

and copy_label_declaration :
  From.Parsetree.label_declaration ->
    To.Parsetree.label_declaration
  =
  fun
    { From.Parsetree.pld_name = pld_name;
      From.Parsetree.pld_mutable = pld_mutable;
      From.Parsetree.pld_type = pld_type;
      From.Parsetree.pld_loc = pld_loc;
      From.Parsetree.pld_attributes = pld_attributes }
     ->
    {
      To.Parsetree.pld_name =
        (copy_loc (fun x  -> x) pld_name);
      To.Parsetree.pld_mutable =
        (copy_mutable_flag pld_mutable);
      To.Parsetree.pld_type =
        (copy_core_type pld_type);
      To.Parsetree.pld_loc =
        (copy_location pld_loc);
      To.Parsetree.pld_attributes =
        (copy_attributes pld_attributes)
    }

and copy_mutable_flag :
  From.Asttypes.mutable_flag ->
    To.Asttypes.mutable_flag
  =
  function
  | From.Asttypes.Immutable  ->
      To.Asttypes.Immutable
  | From.Asttypes.Mutable  -> To.Asttypes.Mutable

and copy_variance :
  From.Asttypes.variance -> To.Asttypes.variance =
  function
  | From.Asttypes.Covariant  ->
      To.Asttypes.Covariant
  | From.Asttypes.Contravariant  ->
      To.Asttypes.Contravariant
  | From.Asttypes.Invariant  ->
      To.Asttypes.Invariant

and copy_value_description :
  From.Parsetree.value_description ->
    To.Parsetree.value_description
  =
  fun
    { From.Parsetree.pval_name = pval_name;
      From.Parsetree.pval_type = pval_type;
      From.Parsetree.pval_prim = pval_prim;
      From.Parsetree.pval_attributes = pval_attributes;
      From.Parsetree.pval_loc = pval_loc }
     ->
    {
      To.Parsetree.pval_name =
        (copy_loc (fun x  -> x) pval_name);
      To.Parsetree.pval_type =
        (copy_core_type pval_type);
      To.Parsetree.pval_prim =
        (List.map (fun x  -> x) pval_prim);
      To.Parsetree.pval_attributes =
        (copy_attributes pval_attributes);
      To.Parsetree.pval_loc =
        (copy_location pval_loc)
    }

and copy_arg_label :
  From.Asttypes.arg_label -> To.Asttypes.arg_label
  =
  function
  | From.Asttypes.Nolabel  -> To.Asttypes.Nolabel
  | From.Asttypes.Labelled x0 ->
      To.Asttypes.Labelled x0
  | From.Asttypes.Optional x0 ->
      To.Asttypes.Optional x0

and copy_closed_flag :
  From.Asttypes.closed_flag ->
    To.Asttypes.closed_flag
  =
  function
  | From.Asttypes.Closed  -> To.Asttypes.Closed
  | From.Asttypes.Open  -> To.Asttypes.Open

and copy_label :
  From.Asttypes.label -> To.Asttypes.label =
  fun x  -> x

and copy_rec_flag :
  From.Asttypes.rec_flag -> To.Asttypes.rec_flag =
  function
  | From.Asttypes.Nonrecursive  ->
      To.Asttypes.Nonrecursive
  | From.Asttypes.Recursive  ->
      To.Asttypes.Recursive

and copy_constant :
  From.Parsetree.constant -> To.Parsetree.constant
  =
  function
  | From.Parsetree.Pconst_integer (x0,x1) ->
      To.Parsetree.Pconst_integer
        (x0, (copy_option (fun x  -> x) x1))
  | From.Parsetree.Pconst_char x0 ->
      To.Parsetree.Pconst_char x0
  | From.Parsetree.Pconst_string (x0,x1) ->
      To.Parsetree.Pconst_string
        (x0, (copy_option (fun x  -> x) x1))
  | From.Parsetree.Pconst_float (x0,x1) ->
      To.Parsetree.Pconst_float
        (x0, (copy_option (fun x  -> x) x1))

and copy_option : 'f0 'g0 . ('f0 -> 'g0) -> 'f0 option -> 'g0 option =
  fun f0  -> function | None  -> None | Some x0 -> Some (f0 x0)

and copy_longident :
  From.Longident.t -> To.Longident.t =
  function
  | From.Longident.Lident x0 ->
      To.Longident.Lident x0
  | From.Longident.Ldot (x0,x1) ->
      To.Longident.Ldot
        ((copy_longident x0), x1)
  | From.Longident.Lapply (x0,x1) ->
      To.Longident.Lapply
        ((copy_longident x0), (copy_longident x1))

and copy_loc :
  'f0 'g0 .
    ('f0 -> 'g0) ->
      'f0 From.Asttypes.loc -> 'g0 To.Asttypes.loc
  =
  fun f0  ->
    fun
      { From.Asttypes.txt = txt;
        From.Asttypes.loc = loc }
       ->
      {
        To.Asttypes.txt = (f0 txt);
        To.Asttypes.loc = (copy_location loc)
      }

and copy_location :
  From.Location.t -> To.Location.t =
  fun
    { From.Location.loc_start = loc_start;
      From.Location.loc_end = loc_end;
      From.Location.loc_ghost = loc_ghost }
     ->
    {
      To.Location.loc_start = (copy_Lexing_position loc_start);
      To.Location.loc_end = (copy_Lexing_position loc_end);
      To.Location.loc_ghost = (copy_bool loc_ghost)
    }

and copy_bool : bool -> bool = function | false  -> false | true  -> true

and copy_Lexing_position : Lexing.position -> Lexing.position =
  fun
    { Lexing.pos_fname = pos_fname; Lexing.pos_lnum = pos_lnum;
      Lexing.pos_bol = pos_bol; Lexing.pos_cnum = pos_cnum }
     ->
    {
      Lexing.pos_fname = pos_fname;
      Lexing.pos_lnum = pos_lnum;
      Lexing.pos_bol = pos_bol;
      Lexing.pos_cnum = pos_cnum
    }

let rec copy_out_phrase :
  From.Outcometree.out_phrase -> To.Outcometree.out_phrase =
  function
  | From.Outcometree.Ophr_eval (x0,x1) ->
      To.Outcometree.Ophr_eval
        ((copy_out_value x0),
          (copy_out_type x1))
  | From.Outcometree.Ophr_signature x0 ->
      To.Outcometree.Ophr_signature
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_out_sig_item x0),
                (copy_option copy_out_value x1))) x0)
  | From.Outcometree.Ophr_exception x0 ->
      To.Outcometree.Ophr_exception
        (let (x0,x1) = x0  in
         ((copy_exn x0), (copy_out_value x1)))

and copy_exn : exn -> exn = fun x  -> x

and copy_out_sig_item :
  From.Outcometree.out_sig_item -> To.Outcometree.out_sig_item =
  function
  | From.Outcometree.Osig_class (x0,x1,x2,x3,x4) ->
      To.Outcometree.Osig_class
        ((copy_bool x0), x1,
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                (x0, (let (x0,x1) = x1  in ((copy_bool x0), (copy_bool x1)))))
             x2), (copy_out_class_type x3),
          (copy_out_rec_status x4))
  | From.Outcometree.Osig_class_type (x0,x1,x2,x3,x4) ->
      To.Outcometree.Osig_class_type
        ((copy_bool x0), x1,
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                (x0, (let (x0,x1) = x1  in ((copy_bool x0), (copy_bool x1)))))
             x2), (copy_out_class_type x3),
          (copy_out_rec_status x4))
  | From.Outcometree.Osig_typext (x0,x1) ->
      To.Outcometree.Osig_typext
        ((copy_out_extension_constructor x0),
          (copy_out_ext_status x1))
  | From.Outcometree.Osig_modtype (x0,x1) ->
      To.Outcometree.Osig_modtype
        (x0, (copy_out_module_type x1))
  | From.Outcometree.Osig_module (x0,x1,x2) ->
      To.Outcometree.Osig_module
        (x0, (copy_out_module_type x1),
          (copy_out_rec_status x2))
  | From.Outcometree.Osig_type (x0,x1) ->
      To.Outcometree.Osig_type
        ((copy_out_type_decl x0),
          (copy_out_rec_status x1))
  | From.Outcometree.Osig_value x0 ->
      To.Outcometree.Osig_value
        (copy_out_val_decl x0)
  | From.Outcometree.Osig_ellipsis  -> To.Outcometree.Osig_ellipsis

and copy_out_val_decl :
  From.Outcometree.out_val_decl -> To.Outcometree.out_val_decl =
  fun
    { From.Outcometree.oval_name = oval_name;
      From.Outcometree.oval_type = oval_type;
      From.Outcometree.oval_prims = oval_prims;
      From.Outcometree.oval_attributes = oval_attributes }
     ->
    {
      To.Outcometree.oval_name = oval_name;
      To.Outcometree.oval_type =
        (copy_out_type oval_type);
      To.Outcometree.oval_prims = (List.map (fun x  -> x) oval_prims);
      To.Outcometree.oval_attributes =
        (List.map copy_out_attribute oval_attributes)
    }

and copy_out_type_decl :
  From.Outcometree.out_type_decl -> To.Outcometree.out_type_decl =
  fun
    { From.Outcometree.otype_name = otype_name;
      From.Outcometree.otype_params = otype_params;
      From.Outcometree.otype_type = otype_type;
      From.Outcometree.otype_private = otype_private;
      From.Outcometree.otype_immediate = otype_immediate;
      From.Outcometree.otype_unboxed = _otype_unboxed;
      From.Outcometree.otype_cstrs = otype_cstrs }
     ->
    {
      To.Outcometree.otype_name = otype_name;
      To.Outcometree.otype_params =
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              (x0, (let (x0,x1) = x1  in ((copy_bool x0), (copy_bool x1)))))
           otype_params);
      To.Outcometree.otype_type =
        (copy_out_type otype_type);
      To.Outcometree.otype_private =
        (copy_From_Asttypes_private_flag otype_private);
      To.Outcometree.otype_immediate = (copy_bool otype_immediate);
      To.Outcometree.otype_cstrs =
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_out_type x0),
                (copy_out_type x1))) otype_cstrs)
    }

and copy_out_module_type :
  From.Outcometree.out_module_type -> To.Outcometree.out_module_type
  =
  function
  | From.Outcometree.Omty_abstract  -> To.Outcometree.Omty_abstract
  | From.Outcometree.Omty_functor (x0,x1,x2) ->
      To.Outcometree.Omty_functor
        (x0, (copy_option copy_out_module_type x1),
          (copy_out_module_type x2))
  | From.Outcometree.Omty_ident x0 ->
      To.Outcometree.Omty_ident (copy_out_ident x0)
  | From.Outcometree.Omty_signature x0 ->
      To.Outcometree.Omty_signature
        (List.map copy_out_sig_item x0)
  | From.Outcometree.Omty_alias x0 ->
      To.Outcometree.Omty_alias (copy_out_ident x0)

and copy_out_ext_status :
  From.Outcometree.out_ext_status -> To.Outcometree.out_ext_status =
  function
  | From.Outcometree.Oext_first  -> To.Outcometree.Oext_first
  | From.Outcometree.Oext_next  -> To.Outcometree.Oext_next
  | From.Outcometree.Oext_exception  -> To.Outcometree.Oext_exception

and copy_out_extension_constructor :
  From.Outcometree.out_extension_constructor ->
    To.Outcometree.out_extension_constructor
  =
  fun
    { From.Outcometree.oext_name = oext_name;
      From.Outcometree.oext_type_name = oext_type_name;
      From.Outcometree.oext_type_params = oext_type_params;
      From.Outcometree.oext_args = oext_args;
      From.Outcometree.oext_ret_type = oext_ret_type;
      From.Outcometree.oext_private = oext_private }
     ->
    {
      To.Outcometree.oext_name = oext_name;
      To.Outcometree.oext_type_name = oext_type_name;
      To.Outcometree.oext_type_params =
        (List.map (fun x  -> x) oext_type_params);
      To.Outcometree.oext_args =
        (List.map copy_out_type oext_args);
      To.Outcometree.oext_ret_type =
        (copy_option copy_out_type oext_ret_type);
      To.Outcometree.oext_private =
        (copy_From_Asttypes_private_flag oext_private)
    }

and copy_From_Asttypes_private_flag :
  From.Asttypes.private_flag -> To.Asttypes.private_flag =
  function
  | From.Asttypes.Private  -> To.Asttypes.Private
  | From.Asttypes.Public  -> To.Asttypes.Public

and copy_out_rec_status :
  From.Outcometree.out_rec_status -> To.Outcometree.out_rec_status =
  function
  | From.Outcometree.Orec_not  -> To.Outcometree.Orec_not
  | From.Outcometree.Orec_first  -> To.Outcometree.Orec_first
  | From.Outcometree.Orec_next  -> To.Outcometree.Orec_next

and copy_out_class_type :
  From.Outcometree.out_class_type -> To.Outcometree.out_class_type =
  function
  | From.Outcometree.Octy_constr (x0,x1) ->
      To.Outcometree.Octy_constr
        ((copy_out_ident x0),
          (List.map copy_out_type x1))
  | From.Outcometree.Octy_arrow (x0,x1,x2) ->
      To.Outcometree.Octy_arrow
        (x0, (copy_out_type x1),
          (copy_out_class_type x2))
  | From.Outcometree.Octy_signature (x0,x1) ->
      To.Outcometree.Octy_signature
        ((copy_option copy_out_type x0),
          (List.map copy_out_class_sig_item x1))

and copy_out_class_sig_item :
  From.Outcometree.out_class_sig_item ->
    To.Outcometree.out_class_sig_item
  =
  function
  | From.Outcometree.Ocsg_constraint (x0,x1) ->
      To.Outcometree.Ocsg_constraint
        ((copy_out_type x0),
          (copy_out_type x1))
  | From.Outcometree.Ocsg_method (x0,x1,x2,x3) ->
      To.Outcometree.Ocsg_method
        (x0, (copy_bool x1), (copy_bool x2),
          (copy_out_type x3))
  | From.Outcometree.Ocsg_value (x0,x1,x2,x3) ->
      To.Outcometree.Ocsg_value
        (x0, (copy_bool x1), (copy_bool x2),
          (copy_out_type x3))

and copy_out_type :
  From.Outcometree.out_type -> To.Outcometree.out_type =
  function
  | From.Outcometree.Otyp_abstract  -> To.Outcometree.Otyp_abstract
  | From.Outcometree.Otyp_open  -> To.Outcometree.Otyp_open
  | From.Outcometree.Otyp_alias (x0,x1) ->
      To.Outcometree.Otyp_alias
        ((copy_out_type x0), x1)
  | From.Outcometree.Otyp_arrow (x0,x1,x2) ->
      To.Outcometree.Otyp_arrow
        (x0, (copy_out_type x1),
          (copy_out_type x2))
  | From.Outcometree.Otyp_class (x0,x1,x2) ->
      To.Outcometree.Otyp_class
        ((copy_bool x0), (copy_out_ident x1),
          (List.map copy_out_type x2))
  | From.Outcometree.Otyp_constr (x0,x1) ->
      To.Outcometree.Otyp_constr
        ((copy_out_ident x0),
          (List.map copy_out_type x1))
  | From.Outcometree.Otyp_manifest (x0,x1) ->
      To.Outcometree.Otyp_manifest
        ((copy_out_type x0),
          (copy_out_type x1))
  | From.Outcometree.Otyp_object (x0,x1) ->
      To.Outcometree.Otyp_object
        ((List.map
            (fun x  ->
               let (x0,x1) = x  in
               (x0, (copy_out_type x1))) x0),
          (copy_option copy_bool x1))
  | From.Outcometree.Otyp_record x0 ->
      To.Outcometree.Otyp_record
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              (x0, (copy_bool x1), (copy_out_type x2)))
           x0)
  | From.Outcometree.Otyp_stuff x0 -> To.Outcometree.Otyp_stuff x0
  | From.Outcometree.Otyp_sum x0 ->
      To.Outcometree.Otyp_sum
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              (x0, (List.map copy_out_type x1),
                (copy_option copy_out_type x2))) x0)
  | From.Outcometree.Otyp_tuple x0 ->
      To.Outcometree.Otyp_tuple
        (List.map copy_out_type x0)
  | From.Outcometree.Otyp_var (x0,x1) ->
      To.Outcometree.Otyp_var ((copy_bool x0), x1)
  | From.Outcometree.Otyp_variant (x0,x1,x2,x3) ->
      To.Outcometree.Otyp_variant
        ((copy_bool x0), (copy_out_variant x1),
          (copy_bool x2),
          (copy_option (fun x  -> List.map (fun x  -> x) x) x3))
  | From.Outcometree.Otyp_poly (x0,x1) ->
      To.Outcometree.Otyp_poly
        ((List.map (fun x  -> x) x0), (copy_out_type x1))
  | From.Outcometree.Otyp_module (x0,x1,x2) ->
      To.Outcometree.Otyp_module
        (x0, (List.map (fun x  -> x) x1),
          (List.map copy_out_type x2))
  | From.Outcometree.Otyp_attribute (x0,x1) ->
      To.Outcometree.Otyp_attribute
        ((copy_out_type x0),
          (copy_out_attribute x1))

and copy_out_attribute :
  From.Outcometree.out_attribute -> To.Outcometree.out_attribute =
  fun { From.Outcometree.oattr_name = oattr_name }  ->
    { To.Outcometree.oattr_name = oattr_name }

and copy_out_variant :
  From.Outcometree.out_variant -> To.Outcometree.out_variant =
  function
  | From.Outcometree.Ovar_fields x0 ->
      To.Outcometree.Ovar_fields
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              (x0, (copy_bool x1),
                (List.map copy_out_type x2))) x0)
  | From.Outcometree.Ovar_name (x0,x1) ->
      To.Outcometree.Ovar_name
        ((copy_out_ident x0),
          (List.map copy_out_type x1))

and copy_out_value :
  From.Outcometree.out_value -> To.Outcometree.out_value =
  function
  | From.Outcometree.Oval_array x0 ->
      To.Outcometree.Oval_array
        (List.map copy_out_value x0)
  | From.Outcometree.Oval_char x0 -> To.Outcometree.Oval_char x0
  | From.Outcometree.Oval_constr (x0,x1) ->
      To.Outcometree.Oval_constr
        ((copy_out_ident x0),
          (List.map copy_out_value x1))
  | From.Outcometree.Oval_ellipsis  -> To.Outcometree.Oval_ellipsis
  | From.Outcometree.Oval_float x0 ->
      To.Outcometree.Oval_float (copy_float x0)
  | From.Outcometree.Oval_int x0 -> To.Outcometree.Oval_int x0
  | From.Outcometree.Oval_int32 x0 -> To.Outcometree.Oval_int32 x0
  | From.Outcometree.Oval_int64 x0 -> To.Outcometree.Oval_int64 x0
  | From.Outcometree.Oval_nativeint x0 ->
      To.Outcometree.Oval_nativeint x0
  | From.Outcometree.Oval_list x0 ->
      To.Outcometree.Oval_list
        (List.map copy_out_value x0)
  | From.Outcometree.Oval_printer x0 ->
      To.Outcometree.Oval_printer x0
  | From.Outcometree.Oval_record x0 ->
      To.Outcometree.Oval_record
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_out_ident x0),
                (copy_out_value x1))) x0)
  | From.Outcometree.Oval_string x0 -> To.Outcometree.Oval_string x0
  | From.Outcometree.Oval_stuff x0 -> To.Outcometree.Oval_stuff x0
  | From.Outcometree.Oval_tuple x0 ->
      To.Outcometree.Oval_tuple
        (List.map copy_out_value x0)
  | From.Outcometree.Oval_variant (x0,x1) ->
      To.Outcometree.Oval_variant
        (x0, (copy_option copy_out_value x1))

and copy_float : float -> float = fun x  -> x

and copy_out_ident :
  From.Outcometree.out_ident -> To.Outcometree.out_ident =
  function
  | From.Outcometree.Oide_apply (x0,x1) ->
      To.Outcometree.Oide_apply ((copy_out_ident x0), (copy_out_ident x1))
  | From.Outcometree.Oide_dot (x0,x1) ->
      To.Outcometree.Oide_dot ((copy_out_ident x0), x1)
  | From.Outcometree.Oide_ident x0 -> To.Outcometree.Oide_ident x0

let rec copy_toplevel_phrase :
  From.Parsetree.toplevel_phrase -> To.Parsetree.toplevel_phrase =
  function
  | From.Parsetree.Ptop_def x0 ->
      To.Parsetree.Ptop_def (copy_structure x0)
  | From.Parsetree.Ptop_dir (x0,x1) ->
      To.Parsetree.Ptop_dir (x0, (copy_directive_argument x1))

and copy_directive_argument :
  From.Parsetree.directive_argument -> To.Parsetree.directive_argument =
  function
  | From.Parsetree.Pdir_none  -> To.Parsetree.Pdir_none
  | From.Parsetree.Pdir_string x0 -> To.Parsetree.Pdir_string x0
  | From.Parsetree.Pdir_int (x0,x1) ->
      To.Parsetree.Pdir_int (x0, (copy_option (fun x  -> x) x1))
  | From.Parsetree.Pdir_ident x0 ->
      To.Parsetree.Pdir_ident (copy_longident x0)
  | From.Parsetree.Pdir_bool x0 ->
      To.Parsetree.Pdir_bool (copy_bool x0)

let copy_out_type_extension :
  From.Outcometree.out_type_extension -> To.Outcometree.out_type_extension =
  fun
    { From.Outcometree.otyext_name = otyext_name;
      From.Outcometree.otyext_params = otyext_params;
      From.Outcometree.otyext_constructors = otyext_constructors;
      From.Outcometree.otyext_private = otyext_private }
     ->
    {
      To.Outcometree.otyext_name = otyext_name;
      To.Outcometree.otyext_params =
        (List.map (fun x  -> x) otyext_params);
      To.Outcometree.otyext_constructors =
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              (x0, (List.map copy_out_type x1),
                (copy_option copy_out_type x2)))
           otyext_constructors);
      To.Outcometree.otyext_private =
        (copy_private_flag otyext_private)
    }

let copy_cases x = List.map copy_case x
let copy_pat = copy_pattern
let copy_expr = copy_expression
let copy_typ = copy_core_type

end
module Migrate_parsetree_403_404
= struct
#1 "migrate_parsetree_403_404.ml"
# 1 "src/migrate_parsetree_403_404.ml"
(**************************************************************************)
(*                                                                        *)
(*                         OCaml Migrate Parsetree                        *)
(*                                                                        *)
(*                             Frédéric Bour                              *)
(*                                                                        *)
(*   Copyright 2017 Institut National de Recherche en Informatique et     *)
(*     en Automatique (INRIA).                                            *)
(*                                                                        *)
(*   All rights reserved.  This file is distributed under the terms of    *)
(*   the GNU Lesser General Public License version 2.1, with the          *)
(*   special exception on linking described in the file LICENSE.          *)
(*                                                                        *)
(**************************************************************************)

include Migrate_parsetree_403_404_migrate

(*$ open Printf
    let fields = [
      "attribute"; "attributes"; "case"; "cases"; "class_declaration";
      "class_description"; "class_expr"; "class_field"; "class_signature";
      "class_structure"; "class_type"; "class_type_declaration";
      "class_type_field"; "constructor_declaration"; "expr"; "extension";
      "extension_constructor"; "include_declaration"; "include_description";
      "label_declaration"; "location"; "module_binding"; "module_declaration";
      "module_expr"; "module_type"; "module_type_declaration";
      "open_description"; "pat"; "signature"; "signature_item"; "structure";
      "structure_item"; "typ"; "type_declaration"; "type_extension";
      "type_kind"; "value_binding"; "value_description";
      "with_constraint"; "payload"
    ]
  let foreach_field f =
    printf "\n";
    List.iter f fields
*)(*$*)

let copy_mapper = fun
  ({ From.Ast_mapper.
     (*$ foreach_field (printf "%s;\n")*)
     attribute;
     attributes;
     case;
     cases;
     class_declaration;
     class_description;
     class_expr;
     class_field;
     class_signature;
     class_structure;
     class_type;
     class_type_declaration;
     class_type_field;
     constructor_declaration;
     expr;
     extension;
     extension_constructor;
     include_declaration;
     include_description;
     label_declaration;
     location;
     module_binding;
     module_declaration;
     module_expr;
     module_type;
     module_type_declaration;
     open_description;
     pat;
     signature;
     signature_item;
     structure;
     structure_item;
     typ;
     type_declaration;
     type_extension;
     type_kind;
     value_binding;
     value_description;
     with_constraint;
     payload;
     (*$*)
   } as mapper) ->
  let module R = Migrate_parsetree_404_403_migrate in
  {
    To.Ast_mapper.
    (*$ foreach_field (fun s ->
          printf
          "%s = (fun _ x -> copy_%s (%s mapper (R.copy_%s x)));\n" s s s s)
    *)
    attribute = (fun _ x -> copy_attribute (attribute mapper (R.copy_attribute x)));
    attributes = (fun _ x -> copy_attributes (attributes mapper (R.copy_attributes x)));
    case = (fun _ x -> copy_case (case mapper (R.copy_case x)));
    cases = (fun _ x -> copy_cases (cases mapper (R.copy_cases x)));
    class_declaration = (fun _ x -> copy_class_declaration (class_declaration mapper (R.copy_class_declaration x)));
    class_description = (fun _ x -> copy_class_description (class_description mapper (R.copy_class_description x)));
    class_expr = (fun _ x -> copy_class_expr (class_expr mapper (R.copy_class_expr x)));
    class_field = (fun _ x -> copy_class_field (class_field mapper (R.copy_class_field x)));
    class_signature = (fun _ x -> copy_class_signature (class_signature mapper (R.copy_class_signature x)));
    class_structure = (fun _ x -> copy_class_structure (class_structure mapper (R.copy_class_structure x)));
    class_type = (fun _ x -> copy_class_type (class_type mapper (R.copy_class_type x)));
    class_type_declaration = (fun _ x -> copy_class_type_declaration (class_type_declaration mapper (R.copy_class_type_declaration x)));
    class_type_field = (fun _ x -> copy_class_type_field (class_type_field mapper (R.copy_class_type_field x)));
    constructor_declaration = (fun _ x -> copy_constructor_declaration (constructor_declaration mapper (R.copy_constructor_declaration x)));
    expr = (fun _ x -> copy_expr (expr mapper (R.copy_expr x)));
    extension = (fun _ x -> copy_extension (extension mapper (R.copy_extension x)));
    extension_constructor = (fun _ x -> copy_extension_constructor (extension_constructor mapper (R.copy_extension_constructor x)));
    include_declaration = (fun _ x -> copy_include_declaration (include_declaration mapper (R.copy_include_declaration x)));
    include_description = (fun _ x -> copy_include_description (include_description mapper (R.copy_include_description x)));
    label_declaration = (fun _ x -> copy_label_declaration (label_declaration mapper (R.copy_label_declaration x)));
    location = (fun _ x -> copy_location (location mapper (R.copy_location x)));
    module_binding = (fun _ x -> copy_module_binding (module_binding mapper (R.copy_module_binding x)));
    module_declaration = (fun _ x -> copy_module_declaration (module_declaration mapper (R.copy_module_declaration x)));
    module_expr = (fun _ x -> copy_module_expr (module_expr mapper (R.copy_module_expr x)));
    module_type = (fun _ x -> copy_module_type (module_type mapper (R.copy_module_type x)));
    module_type_declaration = (fun _ x -> copy_module_type_declaration (module_type_declaration mapper (R.copy_module_type_declaration x)));
    open_description = (fun _ x -> copy_open_description (open_description mapper (R.copy_open_description x)));
    pat = (fun _ x -> copy_pat (pat mapper (R.copy_pat x)));
    signature = (fun _ x -> copy_signature (signature mapper (R.copy_signature x)));
    signature_item = (fun _ x -> copy_signature_item (signature_item mapper (R.copy_signature_item x)));
    structure = (fun _ x -> copy_structure (structure mapper (R.copy_structure x)));
    structure_item = (fun _ x -> copy_structure_item (structure_item mapper (R.copy_structure_item x)));
    typ = (fun _ x -> copy_typ (typ mapper (R.copy_typ x)));
    type_declaration = (fun _ x -> copy_type_declaration (type_declaration mapper (R.copy_type_declaration x)));
    type_extension = (fun _ x -> copy_type_extension (type_extension mapper (R.copy_type_extension x)));
    type_kind = (fun _ x -> copy_type_kind (type_kind mapper (R.copy_type_kind x)));
    value_binding = (fun _ x -> copy_value_binding (value_binding mapper (R.copy_value_binding x)));
    value_description = (fun _ x -> copy_value_description (value_description mapper (R.copy_value_description x)));
    with_constraint = (fun _ x -> copy_with_constraint (with_constraint mapper (R.copy_with_constraint x)));
    payload = (fun _ x -> copy_payload (payload mapper (R.copy_payload x)));
    (*$*)
  }

end
module Migrate_parsetree_404_403
= struct
#1 "migrate_parsetree_404_403.ml"
# 1 "src/migrate_parsetree_404_403.ml"
(**************************************************************************)
(*                                                                        *)
(*                         OCaml Migrate Parsetree                        *)
(*                                                                        *)
(*                             Frédéric Bour                              *)
(*                                                                        *)
(*   Copyright 2017 Institut National de Recherche en Informatique et     *)
(*     en Automatique (INRIA).                                            *)
(*                                                                        *)
(*   All rights reserved.  This file is distributed under the terms of    *)
(*   the GNU Lesser General Public License version 2.1, with the          *)
(*   special exception on linking described in the file LICENSE.          *)
(*                                                                        *)
(**************************************************************************)

include Migrate_parsetree_404_403_migrate

(*$ open Printf
    let fields = [
      "attribute"; "attributes"; "case"; "cases"; "class_declaration";
      "class_description"; "class_expr"; "class_field"; "class_signature";
      "class_structure"; "class_type"; "class_type_declaration";
      "class_type_field"; "constructor_declaration"; "expr"; "extension";
      "extension_constructor"; "include_declaration"; "include_description";
      "label_declaration"; "location"; "module_binding"; "module_declaration";
      "module_expr"; "module_type"; "module_type_declaration";
      "open_description"; "pat"; "signature"; "signature_item"; "structure";
      "structure_item"; "typ"; "type_declaration"; "type_extension";
      "type_kind"; "value_binding"; "value_description";
      "with_constraint"; "payload"
    ]
  let foreach_field f =
    printf "\n";
    List.iter f fields
*)(*$*)

let copy_mapper = fun
  ({ From.Ast_mapper.
     (*$ foreach_field (printf "%s;\n")*)
     attribute;
     attributes;
     case;
     cases;
     class_declaration;
     class_description;
     class_expr;
     class_field;
     class_signature;
     class_structure;
     class_type;
     class_type_declaration;
     class_type_field;
     constructor_declaration;
     expr;
     extension;
     extension_constructor;
     include_declaration;
     include_description;
     label_declaration;
     location;
     module_binding;
     module_declaration;
     module_expr;
     module_type;
     module_type_declaration;
     open_description;
     pat;
     signature;
     signature_item;
     structure;
     structure_item;
     typ;
     type_declaration;
     type_extension;
     type_kind;
     value_binding;
     value_description;
     with_constraint;
     payload;
     (*$*)
   } as mapper) ->
  let module R = Migrate_parsetree_403_404_migrate in
  {
    To.Ast_mapper.
    (*$ foreach_field (fun s ->
          printf
          "%s = (fun _ x -> copy_%s (%s mapper (R.copy_%s x)));\n" s s s s)
    *)
    attribute = (fun _ x -> copy_attribute (attribute mapper (R.copy_attribute x)));
    attributes = (fun _ x -> copy_attributes (attributes mapper (R.copy_attributes x)));
    case = (fun _ x -> copy_case (case mapper (R.copy_case x)));
    cases = (fun _ x -> copy_cases (cases mapper (R.copy_cases x)));
    class_declaration = (fun _ x -> copy_class_declaration (class_declaration mapper (R.copy_class_declaration x)));
    class_description = (fun _ x -> copy_class_description (class_description mapper (R.copy_class_description x)));
    class_expr = (fun _ x -> copy_class_expr (class_expr mapper (R.copy_class_expr x)));
    class_field = (fun _ x -> copy_class_field (class_field mapper (R.copy_class_field x)));
    class_signature = (fun _ x -> copy_class_signature (class_signature mapper (R.copy_class_signature x)));
    class_structure = (fun _ x -> copy_class_structure (class_structure mapper (R.copy_class_structure x)));
    class_type = (fun _ x -> copy_class_type (class_type mapper (R.copy_class_type x)));
    class_type_declaration = (fun _ x -> copy_class_type_declaration (class_type_declaration mapper (R.copy_class_type_declaration x)));
    class_type_field = (fun _ x -> copy_class_type_field (class_type_field mapper (R.copy_class_type_field x)));
    constructor_declaration = (fun _ x -> copy_constructor_declaration (constructor_declaration mapper (R.copy_constructor_declaration x)));
    expr = (fun _ x -> copy_expr (expr mapper (R.copy_expr x)));
    extension = (fun _ x -> copy_extension (extension mapper (R.copy_extension x)));
    extension_constructor = (fun _ x -> copy_extension_constructor (extension_constructor mapper (R.copy_extension_constructor x)));
    include_declaration = (fun _ x -> copy_include_declaration (include_declaration mapper (R.copy_include_declaration x)));
    include_description = (fun _ x -> copy_include_description (include_description mapper (R.copy_include_description x)));
    label_declaration = (fun _ x -> copy_label_declaration (label_declaration mapper (R.copy_label_declaration x)));
    location = (fun _ x -> copy_location (location mapper (R.copy_location x)));
    module_binding = (fun _ x -> copy_module_binding (module_binding mapper (R.copy_module_binding x)));
    module_declaration = (fun _ x -> copy_module_declaration (module_declaration mapper (R.copy_module_declaration x)));
    module_expr = (fun _ x -> copy_module_expr (module_expr mapper (R.copy_module_expr x)));
    module_type = (fun _ x -> copy_module_type (module_type mapper (R.copy_module_type x)));
    module_type_declaration = (fun _ x -> copy_module_type_declaration (module_type_declaration mapper (R.copy_module_type_declaration x)));
    open_description = (fun _ x -> copy_open_description (open_description mapper (R.copy_open_description x)));
    pat = (fun _ x -> copy_pat (pat mapper (R.copy_pat x)));
    signature = (fun _ x -> copy_signature (signature mapper (R.copy_signature x)));
    signature_item = (fun _ x -> copy_signature_item (signature_item mapper (R.copy_signature_item x)));
    structure = (fun _ x -> copy_structure (structure mapper (R.copy_structure x)));
    structure_item = (fun _ x -> copy_structure_item (structure_item mapper (R.copy_structure_item x)));
    typ = (fun _ x -> copy_typ (typ mapper (R.copy_typ x)));
    type_declaration = (fun _ x -> copy_type_declaration (type_declaration mapper (R.copy_type_declaration x)));
    type_extension = (fun _ x -> copy_type_extension (type_extension mapper (R.copy_type_extension x)));
    type_kind = (fun _ x -> copy_type_kind (type_kind mapper (R.copy_type_kind x)));
    value_binding = (fun _ x -> copy_value_binding (value_binding mapper (R.copy_value_binding x)));
    value_description = (fun _ x -> copy_value_description (value_description mapper (R.copy_value_description x)));
    with_constraint = (fun _ x -> copy_with_constraint (with_constraint mapper (R.copy_with_constraint x)));
    payload = (fun _ x -> copy_payload (payload mapper (R.copy_payload x)));
    (*$*)
  }

end
module Migrate_parsetree_404_405_migrate
= struct
#1 "migrate_parsetree_404_405_migrate.ml"
# 1 "src/migrate_parsetree_404_405_migrate.ml"
(**************************************************************************)
(*                                                                        *)
(*                         OCaml Migrate Parsetree                        *)
(*                                                                        *)
(*                             Frédéric Bour                              *)
(*                         Alain Frisch, LexiFi                           *)
(*                                                                        *)
(*   Copyright 2017 Institut National de Recherche en Informatique et     *)
(*     en Automatique (INRIA).                                            *)
(*                                                                        *)
(*   All rights reserved.  This file is distributed under the terms of    *)
(*   the GNU Lesser General Public License version 2.1, with the          *)
(*   special exception on linking described in the file LICENSE.          *)
(*                                                                        *)
(**************************************************************************)

module From = Ast_404
module To = Ast_405

let noloc x = { Location. txt = x; loc = Location.none }

let rec copy_expression :
  From.Parsetree.expression -> To.Parsetree.expression =
  fun
    { From.Parsetree.pexp_desc = pexp_desc;
      From.Parsetree.pexp_loc = pexp_loc;
      From.Parsetree.pexp_attributes = pexp_attributes }
     ->
    {
      To.Parsetree.pexp_desc = (copy_expression_desc pexp_desc);
      To.Parsetree.pexp_loc = (copy_location pexp_loc);
      To.Parsetree.pexp_attributes = (copy_attributes pexp_attributes)
    }

and copy_expression_desc :
  From.Parsetree.expression_desc -> To.Parsetree.expression_desc =
  function
  | From.Parsetree.Pexp_ident x0 ->
      To.Parsetree.Pexp_ident
        (copy_loc copy_longident x0)
  | From.Parsetree.Pexp_constant x0 ->
      To.Parsetree.Pexp_constant (copy_constant x0)
  | From.Parsetree.Pexp_let (x0,x1,x2) ->
      To.Parsetree.Pexp_let
        ((copy_rec_flag x0),
          (List.map copy_value_binding x1),
          (copy_expression x2))
  | From.Parsetree.Pexp_function x0 ->
      To.Parsetree.Pexp_function
        (List.map copy_case x0)
  | From.Parsetree.Pexp_fun (x0,x1,x2,x3) ->
      To.Parsetree.Pexp_fun
        ((copy_arg_label x0),
          (copy_option copy_expression x1),
          (copy_pattern x2),
          (copy_expression x3))
  | From.Parsetree.Pexp_apply (x0,x1) ->
      To.Parsetree.Pexp_apply
        ((copy_expression x0),
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                ((copy_arg_label x0),
                  (copy_expression x1))) x1))
  | From.Parsetree.Pexp_match (x0,x1) ->
      To.Parsetree.Pexp_match
        ((copy_expression x0),
          (List.map copy_case x1))
  | From.Parsetree.Pexp_try (x0,x1) ->
      To.Parsetree.Pexp_try
        ((copy_expression x0),
          (List.map copy_case x1))
  | From.Parsetree.Pexp_tuple x0 ->
      To.Parsetree.Pexp_tuple
        (List.map copy_expression x0)
  | From.Parsetree.Pexp_construct (x0,x1) ->
      To.Parsetree.Pexp_construct
        ((copy_loc copy_longident x0),
          (copy_option copy_expression x1))
  | From.Parsetree.Pexp_variant (x0,x1) ->
      To.Parsetree.Pexp_variant
        ((copy_label x0),
          (copy_option copy_expression x1))
  | From.Parsetree.Pexp_record (x0,x1) ->
      To.Parsetree.Pexp_record
        ((List.map
            (fun x  ->
               let (x0,x1) = x  in
               ((copy_loc copy_longident x0),
                 (copy_expression x1))) x0),
          (copy_option copy_expression x1))
  | From.Parsetree.Pexp_field (x0,x1) ->
      To.Parsetree.Pexp_field
        ((copy_expression x0),
          (copy_loc copy_longident x1))
  | From.Parsetree.Pexp_setfield (x0,x1,x2) ->
      To.Parsetree.Pexp_setfield
        ((copy_expression x0),
          (copy_loc copy_longident x1),
          (copy_expression x2))
  | From.Parsetree.Pexp_array x0 ->
      To.Parsetree.Pexp_array
        (List.map copy_expression x0)
  | From.Parsetree.Pexp_ifthenelse (x0,x1,x2) ->
      To.Parsetree.Pexp_ifthenelse
        ((copy_expression x0),
          (copy_expression x1),
          (copy_option copy_expression x2))
  | From.Parsetree.Pexp_sequence (x0,x1) ->
      To.Parsetree.Pexp_sequence
        ((copy_expression x0),
          (copy_expression x1))
  | From.Parsetree.Pexp_while (x0,x1) ->
      To.Parsetree.Pexp_while
        ((copy_expression x0),
          (copy_expression x1))
  | From.Parsetree.Pexp_for (x0,x1,x2,x3,x4) ->
      To.Parsetree.Pexp_for
        ((copy_pattern x0),
          (copy_expression x1),
          (copy_expression x2),
          (copy_direction_flag x3),
          (copy_expression x4))
  | From.Parsetree.Pexp_constraint (x0,x1) ->
      To.Parsetree.Pexp_constraint
        ((copy_expression x0),
          (copy_core_type x1))
  | From.Parsetree.Pexp_coerce (x0,x1,x2) ->
      To.Parsetree.Pexp_coerce
        ((copy_expression x0),
          (copy_option copy_core_type x1),
          (copy_core_type x2))
  | From.Parsetree.Pexp_send (x0,x1) ->
      To.Parsetree.Pexp_send
        ((copy_expression x0), noloc x1)
  | From.Parsetree.Pexp_new x0 ->
      To.Parsetree.Pexp_new
        (copy_loc copy_longident x0)
  | From.Parsetree.Pexp_setinstvar (x0,x1) ->
      To.Parsetree.Pexp_setinstvar
        ((copy_loc (fun x  -> x) x0),
          (copy_expression x1))
  | From.Parsetree.Pexp_override x0 ->
      To.Parsetree.Pexp_override
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_loc (fun x  -> x) x0),
                (copy_expression x1))) x0)
  | From.Parsetree.Pexp_letmodule (x0,x1,x2) ->
      To.Parsetree.Pexp_letmodule
        ((copy_loc (fun x  -> x) x0),
          (copy_module_expr x1),
          (copy_expression x2))
  | From.Parsetree.Pexp_letexception (x0,x1) ->
      To.Parsetree.Pexp_letexception
        ((copy_extension_constructor x0),
          (copy_expression x1))
  | From.Parsetree.Pexp_assert x0 ->
      To.Parsetree.Pexp_assert (copy_expression x0)
  | From.Parsetree.Pexp_lazy x0 ->
      To.Parsetree.Pexp_lazy (copy_expression x0)
  | From.Parsetree.Pexp_poly (x0,x1) ->
      To.Parsetree.Pexp_poly
        ((copy_expression x0),
          (copy_option copy_core_type x1))
  | From.Parsetree.Pexp_object x0 ->
      To.Parsetree.Pexp_object
        (copy_class_structure x0)
  | From.Parsetree.Pexp_newtype (x0,x1) ->
      To.Parsetree.Pexp_newtype
        (noloc x0, (copy_expression x1))
  | From.Parsetree.Pexp_pack x0 ->
      To.Parsetree.Pexp_pack (copy_module_expr x0)
  | From.Parsetree.Pexp_open (x0,x1,x2) ->
      To.Parsetree.Pexp_open
        ((copy_override_flag x0),
          (copy_loc copy_longident x1),
          (copy_expression x2))
  | From.Parsetree.Pexp_extension x0 ->
      To.Parsetree.Pexp_extension (copy_extension x0)
  | From.Parsetree.Pexp_unreachable  -> To.Parsetree.Pexp_unreachable

and copy_direction_flag :
  From.Asttypes.direction_flag -> To.Asttypes.direction_flag =
  function
  | From.Asttypes.Upto  -> To.Asttypes.Upto
  | From.Asttypes.Downto  -> To.Asttypes.Downto

and copy_case :
  From.Parsetree.case -> To.Parsetree.case =
  fun
    { From.Parsetree.pc_lhs = pc_lhs;
      From.Parsetree.pc_guard = pc_guard;
      From.Parsetree.pc_rhs = pc_rhs }
     ->
    {
      To.Parsetree.pc_lhs = (copy_pattern pc_lhs);
      To.Parsetree.pc_guard =
        (copy_option copy_expression pc_guard);
      To.Parsetree.pc_rhs = (copy_expression pc_rhs)
    }

and copy_value_binding :
  From.Parsetree.value_binding -> To.Parsetree.value_binding =
  fun
    { From.Parsetree.pvb_pat = pvb_pat;
      From.Parsetree.pvb_expr = pvb_expr;
      From.Parsetree.pvb_attributes = pvb_attributes;
      From.Parsetree.pvb_loc = pvb_loc }
     ->
    {
      To.Parsetree.pvb_pat = (copy_pattern pvb_pat);
      To.Parsetree.pvb_expr =
        (copy_expression pvb_expr);
      To.Parsetree.pvb_attributes =
        (copy_attributes pvb_attributes);
      To.Parsetree.pvb_loc = (copy_location pvb_loc)
    }

and copy_pattern :
  From.Parsetree.pattern -> To.Parsetree.pattern =
  fun
    { From.Parsetree.ppat_desc = ppat_desc;
      From.Parsetree.ppat_loc = ppat_loc;
      From.Parsetree.ppat_attributes = ppat_attributes }
     ->
    {
      To.Parsetree.ppat_desc =
        (copy_pattern_desc ppat_desc);
      To.Parsetree.ppat_loc = (copy_location ppat_loc);
      To.Parsetree.ppat_attributes =
        (copy_attributes ppat_attributes)
    }

and copy_pattern_desc :
  From.Parsetree.pattern_desc -> To.Parsetree.pattern_desc =
  function
  | From.Parsetree.Ppat_any  -> To.Parsetree.Ppat_any
  | From.Parsetree.Ppat_var x0 ->
      To.Parsetree.Ppat_var (copy_loc (fun x  -> x) x0)
  | From.Parsetree.Ppat_alias (x0,x1) ->
      To.Parsetree.Ppat_alias
        ((copy_pattern x0),
          (copy_loc (fun x  -> x) x1))
  | From.Parsetree.Ppat_constant x0 ->
      To.Parsetree.Ppat_constant (copy_constant x0)
  | From.Parsetree.Ppat_interval (x0,x1) ->
      To.Parsetree.Ppat_interval
        ((copy_constant x0),
          (copy_constant x1))
  | From.Parsetree.Ppat_tuple x0 ->
      To.Parsetree.Ppat_tuple
        (List.map copy_pattern x0)
  | From.Parsetree.Ppat_construct (x0,x1) ->
      To.Parsetree.Ppat_construct
        ((copy_loc copy_longident x0),
          (copy_option copy_pattern x1))
  | From.Parsetree.Ppat_variant (x0,x1) ->
      To.Parsetree.Ppat_variant
        ((copy_label x0),
          (copy_option copy_pattern x1))
  | From.Parsetree.Ppat_record (x0,x1) ->
      To.Parsetree.Ppat_record
        ((List.map
            (fun x  ->
               let (x0,x1) = x  in
               ((copy_loc copy_longident x0),
                 (copy_pattern x1))) x0),
          (copy_closed_flag x1))
  | From.Parsetree.Ppat_array x0 ->
      To.Parsetree.Ppat_array
        (List.map copy_pattern x0)
  | From.Parsetree.Ppat_or (x0,x1) ->
      To.Parsetree.Ppat_or
        ((copy_pattern x0),
          (copy_pattern x1))
  | From.Parsetree.Ppat_constraint (x0,x1) ->
      To.Parsetree.Ppat_constraint
        ((copy_pattern x0),
          (copy_core_type x1))
  | From.Parsetree.Ppat_type x0 ->
      To.Parsetree.Ppat_type
        (copy_loc copy_longident x0)
  | From.Parsetree.Ppat_lazy x0 ->
      To.Parsetree.Ppat_lazy (copy_pattern x0)
  | From.Parsetree.Ppat_unpack x0 ->
      To.Parsetree.Ppat_unpack
        (copy_loc (fun x  -> x) x0)
  | From.Parsetree.Ppat_exception x0 ->
      To.Parsetree.Ppat_exception (copy_pattern x0)
  | From.Parsetree.Ppat_extension x0 ->
      To.Parsetree.Ppat_extension (copy_extension x0)
  | From.Parsetree.Ppat_open (x0,x1) ->
      To.Parsetree.Ppat_open
        ((copy_loc copy_longident x0),
          (copy_pattern x1))

and copy_core_type :
  From.Parsetree.core_type -> To.Parsetree.core_type =
  fun
    { From.Parsetree.ptyp_desc = ptyp_desc;
      From.Parsetree.ptyp_loc = ptyp_loc;
      From.Parsetree.ptyp_attributes = ptyp_attributes }
     ->
    {
      To.Parsetree.ptyp_desc =
        (copy_core_type_desc ptyp_desc);
      To.Parsetree.ptyp_loc = (copy_location ptyp_loc);
      To.Parsetree.ptyp_attributes =
        (copy_attributes ptyp_attributes)
    }

and copy_core_type_desc :
  From.Parsetree.core_type_desc -> To.Parsetree.core_type_desc =
  function
  | From.Parsetree.Ptyp_any  -> To.Parsetree.Ptyp_any
  | From.Parsetree.Ptyp_var x0 -> To.Parsetree.Ptyp_var x0
  | From.Parsetree.Ptyp_arrow (x0,x1,x2) ->
      To.Parsetree.Ptyp_arrow
        ((copy_arg_label x0),
          (copy_core_type x1),
          (copy_core_type x2))
  | From.Parsetree.Ptyp_tuple x0 ->
      To.Parsetree.Ptyp_tuple
        (List.map copy_core_type x0)
  | From.Parsetree.Ptyp_constr (x0,x1) ->
      To.Parsetree.Ptyp_constr
        ((copy_loc copy_longident x0),
          (List.map copy_core_type x1))
  | From.Parsetree.Ptyp_object (x0,x1) ->
      To.Parsetree.Ptyp_object
        ((List.map
            (fun x  ->
               let (x0,x1,x2) = x  in
               (noloc x0, (copy_attributes x1),
                 (copy_core_type x2))) x0),
          (copy_closed_flag x1))
  | From.Parsetree.Ptyp_class (x0,x1) ->
      To.Parsetree.Ptyp_class
        ((copy_loc copy_longident x0),
          (List.map copy_core_type x1))
  | From.Parsetree.Ptyp_alias (x0,x1) ->
      To.Parsetree.Ptyp_alias
        ((copy_core_type x0), x1)
  | From.Parsetree.Ptyp_variant (x0,x1,x2) ->
      To.Parsetree.Ptyp_variant
        ((List.map copy_row_field x0),
          (copy_closed_flag x1),
          (copy_option (fun x  -> List.map copy_label x) x2))
  | From.Parsetree.Ptyp_poly (x0,x1) ->
      To.Parsetree.Ptyp_poly
        ((List.map (fun x  -> noloc x) x0), (copy_core_type x1))
  | From.Parsetree.Ptyp_package x0 ->
      To.Parsetree.Ptyp_package (copy_package_type x0)
  | From.Parsetree.Ptyp_extension x0 ->
      To.Parsetree.Ptyp_extension (copy_extension x0)

and copy_package_type :
  From.Parsetree.package_type -> To.Parsetree.package_type =
  fun x  ->
    let (x0,x1) = x  in
    ((copy_loc copy_longident x0),
      (List.map
         (fun x  ->
            let (x0,x1) = x  in
            ((copy_loc copy_longident x0),
              (copy_core_type x1))) x1))

and copy_row_field :
  From.Parsetree.row_field -> To.Parsetree.row_field =
  function
  | From.Parsetree.Rtag (x0,x1,x2,x3) ->
      To.Parsetree.Rtag
        ((copy_label x0),
          (copy_attributes x1), (copy_bool x2),
          (List.map copy_core_type x3))
  | From.Parsetree.Rinherit x0 ->
      To.Parsetree.Rinherit (copy_core_type x0)

and copy_attributes :
  From.Parsetree.attributes -> To.Parsetree.attributes =
  fun x  -> List.map copy_attribute x

and copy_attribute :
  From.Parsetree.attribute -> To.Parsetree.attribute =
  fun x  ->
    let (x0,x1) = x  in
    ((copy_loc (fun x  -> x) x0),
      (copy_payload x1))

and copy_payload :
  From.Parsetree.payload -> To.Parsetree.payload =
  function
  | From.Parsetree.PStr x0 ->
      To.Parsetree.PStr (copy_structure x0)
  | From.Parsetree.PSig x0 ->
      To.Parsetree.PSig (copy_signature x0)
  | From.Parsetree.PTyp x0 ->
      To.Parsetree.PTyp (copy_core_type x0)
  | From.Parsetree.PPat (x0,x1) ->
      To.Parsetree.PPat
        ((copy_pattern x0),
          (copy_option copy_expression x1))

and copy_structure :
  From.Parsetree.structure -> To.Parsetree.structure =
  fun x  -> List.map copy_structure_item x

and copy_structure_item :
  From.Parsetree.structure_item -> To.Parsetree.structure_item =
  fun
    { From.Parsetree.pstr_desc = pstr_desc;
      From.Parsetree.pstr_loc = pstr_loc }
     ->
    {
      To.Parsetree.pstr_desc =
        (copy_structure_item_desc pstr_desc);
      To.Parsetree.pstr_loc = (copy_location pstr_loc)
    }

and copy_structure_item_desc :
  From.Parsetree.structure_item_desc ->
    To.Parsetree.structure_item_desc
  =
  function
  | From.Parsetree.Pstr_eval (x0,x1) ->
      To.Parsetree.Pstr_eval
        ((copy_expression x0),
          (copy_attributes x1))
  | From.Parsetree.Pstr_value (x0,x1) ->
      To.Parsetree.Pstr_value
        ((copy_rec_flag x0),
          (List.map copy_value_binding x1))
  | From.Parsetree.Pstr_primitive x0 ->
      To.Parsetree.Pstr_primitive
        (copy_value_description x0)
  | From.Parsetree.Pstr_type (x0,x1) ->
      To.Parsetree.Pstr_type
        ((copy_rec_flag x0),
          (List.map copy_type_declaration x1))
  | From.Parsetree.Pstr_typext x0 ->
      To.Parsetree.Pstr_typext
        (copy_type_extension x0)
  | From.Parsetree.Pstr_exception x0 ->
      To.Parsetree.Pstr_exception
        (copy_extension_constructor x0)
  | From.Parsetree.Pstr_module x0 ->
      To.Parsetree.Pstr_module
        (copy_module_binding x0)
  | From.Parsetree.Pstr_recmodule x0 ->
      To.Parsetree.Pstr_recmodule
        (List.map copy_module_binding x0)
  | From.Parsetree.Pstr_modtype x0 ->
      To.Parsetree.Pstr_modtype
        (copy_module_type_declaration x0)
  | From.Parsetree.Pstr_open x0 ->
      To.Parsetree.Pstr_open
        (copy_open_description x0)
  | From.Parsetree.Pstr_class x0 ->
      To.Parsetree.Pstr_class
        (List.map copy_class_declaration x0)
  | From.Parsetree.Pstr_class_type x0 ->
      To.Parsetree.Pstr_class_type
        (List.map copy_class_type_declaration x0)
  | From.Parsetree.Pstr_include x0 ->
      To.Parsetree.Pstr_include
        (copy_include_declaration x0)
  | From.Parsetree.Pstr_attribute x0 ->
      To.Parsetree.Pstr_attribute (copy_attribute x0)
  | From.Parsetree.Pstr_extension (x0,x1) ->
      To.Parsetree.Pstr_extension
        ((copy_extension x0),
          (copy_attributes x1))

and copy_include_declaration :
  From.Parsetree.include_declaration ->
    To.Parsetree.include_declaration
  =
  fun x  ->
    copy_include_infos copy_module_expr x

and copy_class_declaration :
  From.Parsetree.class_declaration -> To.Parsetree.class_declaration
  =
  fun x  ->
    copy_class_infos copy_class_expr x

and copy_class_expr :
  From.Parsetree.class_expr -> To.Parsetree.class_expr =
  fun
    { From.Parsetree.pcl_desc = pcl_desc;
      From.Parsetree.pcl_loc = pcl_loc;
      From.Parsetree.pcl_attributes = pcl_attributes }
     ->
    {
      To.Parsetree.pcl_desc =
        (copy_class_expr_desc pcl_desc);
      To.Parsetree.pcl_loc = (copy_location pcl_loc);
      To.Parsetree.pcl_attributes =
        (copy_attributes pcl_attributes)
    }

and copy_class_expr_desc :
  From.Parsetree.class_expr_desc -> To.Parsetree.class_expr_desc =
  function
  | From.Parsetree.Pcl_constr (x0,x1) ->
      To.Parsetree.Pcl_constr
        ((copy_loc copy_longident x0),
          (List.map copy_core_type x1))
  | From.Parsetree.Pcl_structure x0 ->
      To.Parsetree.Pcl_structure
        (copy_class_structure x0)
  | From.Parsetree.Pcl_fun (x0,x1,x2,x3) ->
      To.Parsetree.Pcl_fun
        ((copy_arg_label x0),
          (copy_option copy_expression x1),
          (copy_pattern x2),
          (copy_class_expr x3))
  | From.Parsetree.Pcl_apply (x0,x1) ->
      To.Parsetree.Pcl_apply
        ((copy_class_expr x0),
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                ((copy_arg_label x0),
                  (copy_expression x1))) x1))
  | From.Parsetree.Pcl_let (x0,x1,x2) ->
      To.Parsetree.Pcl_let
        ((copy_rec_flag x0),
          (List.map copy_value_binding x1),
          (copy_class_expr x2))
  | From.Parsetree.Pcl_constraint (x0,x1) ->
      To.Parsetree.Pcl_constraint
        ((copy_class_expr x0),
          (copy_class_type x1))
  | From.Parsetree.Pcl_extension x0 ->
      To.Parsetree.Pcl_extension (copy_extension x0)

and copy_class_structure :
  From.Parsetree.class_structure -> To.Parsetree.class_structure =
  fun
    { From.Parsetree.pcstr_self = pcstr_self;
      From.Parsetree.pcstr_fields = pcstr_fields }
     ->
    {
      To.Parsetree.pcstr_self =
        (copy_pattern pcstr_self);
      To.Parsetree.pcstr_fields =
        (List.map copy_class_field pcstr_fields)
    }

and copy_class_field :
  From.Parsetree.class_field -> To.Parsetree.class_field =
  fun
    { From.Parsetree.pcf_desc = pcf_desc;
      From.Parsetree.pcf_loc = pcf_loc;
      From.Parsetree.pcf_attributes = pcf_attributes }
     ->
    {
      To.Parsetree.pcf_desc =
        (copy_class_field_desc pcf_desc);
      To.Parsetree.pcf_loc = (copy_location pcf_loc);
      To.Parsetree.pcf_attributes =
        (copy_attributes pcf_attributes)
    }

and copy_class_field_desc :
  From.Parsetree.class_field_desc -> To.Parsetree.class_field_desc =
  function
  | From.Parsetree.Pcf_inherit (x0,x1,x2) ->
      To.Parsetree.Pcf_inherit
        ((copy_override_flag x0),
          (copy_class_expr x1),
          (copy_option (fun x  -> noloc x) x2))
  | From.Parsetree.Pcf_val x0 ->
      To.Parsetree.Pcf_val
        (let (x0,x1,x2) = x0  in
         ((copy_loc (fun x  -> x) x0),
           (copy_mutable_flag x1),
           (copy_class_field_kind x2)))
  | From.Parsetree.Pcf_method x0 ->
      To.Parsetree.Pcf_method
        (let (x0,x1,x2) = x0  in
         ((copy_loc (fun x  -> x) x0),
           (copy_private_flag x1),
           (copy_class_field_kind x2)))
  | From.Parsetree.Pcf_constraint x0 ->
      To.Parsetree.Pcf_constraint
        (let (x0,x1) = x0  in
         ((copy_core_type x0),
           (copy_core_type x1)))
  | From.Parsetree.Pcf_initializer x0 ->
      To.Parsetree.Pcf_initializer
        (copy_expression x0)
  | From.Parsetree.Pcf_attribute x0 ->
      To.Parsetree.Pcf_attribute (copy_attribute x0)
  | From.Parsetree.Pcf_extension x0 ->
      To.Parsetree.Pcf_extension (copy_extension x0)

and copy_class_field_kind :
  From.Parsetree.class_field_kind -> To.Parsetree.class_field_kind =
  function
  | From.Parsetree.Cfk_virtual x0 ->
      To.Parsetree.Cfk_virtual (copy_core_type x0)
  | From.Parsetree.Cfk_concrete (x0,x1) ->
      To.Parsetree.Cfk_concrete
        ((copy_override_flag x0),
          (copy_expression x1))

and copy_module_binding :
  From.Parsetree.module_binding -> To.Parsetree.module_binding =
  fun
    { From.Parsetree.pmb_name = pmb_name;
      From.Parsetree.pmb_expr = pmb_expr;
      From.Parsetree.pmb_attributes = pmb_attributes;
      From.Parsetree.pmb_loc = pmb_loc }
     ->
    {
      To.Parsetree.pmb_name =
        (copy_loc (fun x  -> x) pmb_name);
      To.Parsetree.pmb_expr =
        (copy_module_expr pmb_expr);
      To.Parsetree.pmb_attributes =
        (copy_attributes pmb_attributes);
      To.Parsetree.pmb_loc = (copy_location pmb_loc)
    }

and copy_module_expr :
  From.Parsetree.module_expr -> To.Parsetree.module_expr =
  fun
    { From.Parsetree.pmod_desc = pmod_desc;
      From.Parsetree.pmod_loc = pmod_loc;
      From.Parsetree.pmod_attributes = pmod_attributes }
     ->
    {
      To.Parsetree.pmod_desc =
        (copy_module_expr_desc pmod_desc);
      To.Parsetree.pmod_loc = (copy_location pmod_loc);
      To.Parsetree.pmod_attributes =
        (copy_attributes pmod_attributes)
    }

and copy_module_expr_desc :
  From.Parsetree.module_expr_desc -> To.Parsetree.module_expr_desc =
  function
  | From.Parsetree.Pmod_ident x0 ->
      To.Parsetree.Pmod_ident
        (copy_loc copy_longident x0)
  | From.Parsetree.Pmod_structure x0 ->
      To.Parsetree.Pmod_structure (copy_structure x0)
  | From.Parsetree.Pmod_functor (x0,x1,x2) ->
      To.Parsetree.Pmod_functor
        ((copy_loc (fun x  -> x) x0),
          (copy_option copy_module_type x1),
          (copy_module_expr x2))
  | From.Parsetree.Pmod_apply (x0,x1) ->
      To.Parsetree.Pmod_apply
        ((copy_module_expr x0),
          (copy_module_expr x1))
  | From.Parsetree.Pmod_constraint (x0,x1) ->
      To.Parsetree.Pmod_constraint
        ((copy_module_expr x0),
          (copy_module_type x1))
  | From.Parsetree.Pmod_unpack x0 ->
      To.Parsetree.Pmod_unpack (copy_expression x0)
  | From.Parsetree.Pmod_extension x0 ->
      To.Parsetree.Pmod_extension (copy_extension x0)

and copy_module_type :
  From.Parsetree.module_type -> To.Parsetree.module_type =
  fun
    { From.Parsetree.pmty_desc = pmty_desc;
      From.Parsetree.pmty_loc = pmty_loc;
      From.Parsetree.pmty_attributes = pmty_attributes }
     ->
    {
      To.Parsetree.pmty_desc =
        (copy_module_type_desc pmty_desc);
      To.Parsetree.pmty_loc = (copy_location pmty_loc);
      To.Parsetree.pmty_attributes =
        (copy_attributes pmty_attributes)
    }

and copy_module_type_desc :
  From.Parsetree.module_type_desc -> To.Parsetree.module_type_desc =
  function
  | From.Parsetree.Pmty_ident x0 ->
      To.Parsetree.Pmty_ident
        (copy_loc copy_longident x0)
  | From.Parsetree.Pmty_signature x0 ->
      To.Parsetree.Pmty_signature (copy_signature x0)
  | From.Parsetree.Pmty_functor (x0,x1,x2) ->
      To.Parsetree.Pmty_functor
        ((copy_loc (fun x  -> x) x0),
          (copy_option copy_module_type x1),
          (copy_module_type x2))
  | From.Parsetree.Pmty_with (x0,x1) ->
      To.Parsetree.Pmty_with
        ((copy_module_type x0),
          (List.map copy_with_constraint x1))
  | From.Parsetree.Pmty_typeof x0 ->
      To.Parsetree.Pmty_typeof (copy_module_expr x0)
  | From.Parsetree.Pmty_extension x0 ->
      To.Parsetree.Pmty_extension (copy_extension x0)
  | From.Parsetree.Pmty_alias x0 ->
      To.Parsetree.Pmty_alias
        (copy_loc copy_longident x0)

and copy_with_constraint :
  From.Parsetree.with_constraint -> To.Parsetree.with_constraint =
  function
  | From.Parsetree.Pwith_type (x0,x1) ->
      To.Parsetree.Pwith_type
        ((copy_loc copy_longident x0),
          (copy_type_declaration x1))
  | From.Parsetree.Pwith_module (x0,x1) ->
      To.Parsetree.Pwith_module
        ((copy_loc copy_longident x0),
          (copy_loc copy_longident x1))
  | From.Parsetree.Pwith_typesubst x0 ->
      To.Parsetree.Pwith_typesubst
        (copy_type_declaration x0)
  | From.Parsetree.Pwith_modsubst (x0,x1) ->
      To.Parsetree.Pwith_modsubst
        ((copy_loc (fun x  -> x) x0),
          (copy_loc copy_longident x1))

and copy_signature :
  From.Parsetree.signature -> To.Parsetree.signature =
  fun x  -> List.map copy_signature_item x

and copy_signature_item :
  From.Parsetree.signature_item -> To.Parsetree.signature_item =
  fun
    { From.Parsetree.psig_desc = psig_desc;
      From.Parsetree.psig_loc = psig_loc }
     ->
    {
      To.Parsetree.psig_desc =
        (copy_signature_item_desc psig_desc);
      To.Parsetree.psig_loc = (copy_location psig_loc)
    }

and copy_signature_item_desc :
  From.Parsetree.signature_item_desc ->
    To.Parsetree.signature_item_desc
  =
  function
  | From.Parsetree.Psig_value x0 ->
      To.Parsetree.Psig_value
        (copy_value_description x0)
  | From.Parsetree.Psig_type (x0,x1) ->
      To.Parsetree.Psig_type
        ((copy_rec_flag x0),
          (List.map copy_type_declaration x1))
  | From.Parsetree.Psig_typext x0 ->
      To.Parsetree.Psig_typext
        (copy_type_extension x0)
  | From.Parsetree.Psig_exception x0 ->
      To.Parsetree.Psig_exception
        (copy_extension_constructor x0)
  | From.Parsetree.Psig_module x0 ->
      To.Parsetree.Psig_module
        (copy_module_declaration x0)
  | From.Parsetree.Psig_recmodule x0 ->
      To.Parsetree.Psig_recmodule
        (List.map copy_module_declaration x0)
  | From.Parsetree.Psig_modtype x0 ->
      To.Parsetree.Psig_modtype
        (copy_module_type_declaration x0)
  | From.Parsetree.Psig_open x0 ->
      To.Parsetree.Psig_open
        (copy_open_description x0)
  | From.Parsetree.Psig_include x0 ->
      To.Parsetree.Psig_include
        (copy_include_description x0)
  | From.Parsetree.Psig_class x0 ->
      To.Parsetree.Psig_class
        (List.map copy_class_description x0)
  | From.Parsetree.Psig_class_type x0 ->
      To.Parsetree.Psig_class_type
        (List.map copy_class_type_declaration x0)
  | From.Parsetree.Psig_attribute x0 ->
      To.Parsetree.Psig_attribute (copy_attribute x0)
  | From.Parsetree.Psig_extension (x0,x1) ->
      To.Parsetree.Psig_extension
        ((copy_extension x0),
          (copy_attributes x1))

and copy_class_type_declaration :
  From.Parsetree.class_type_declaration ->
    To.Parsetree.class_type_declaration
  =
  fun x  ->
    copy_class_infos copy_class_type x

and copy_class_description :
  From.Parsetree.class_description -> To.Parsetree.class_description
  =
  fun x  ->
    copy_class_infos copy_class_type x

and copy_class_type :
  From.Parsetree.class_type -> To.Parsetree.class_type =
  fun
    { From.Parsetree.pcty_desc = pcty_desc;
      From.Parsetree.pcty_loc = pcty_loc;
      From.Parsetree.pcty_attributes = pcty_attributes }
     ->
    {
      To.Parsetree.pcty_desc =
        (copy_class_type_desc pcty_desc);
      To.Parsetree.pcty_loc = (copy_location pcty_loc);
      To.Parsetree.pcty_attributes =
        (copy_attributes pcty_attributes)
    }

and copy_class_type_desc :
  From.Parsetree.class_type_desc -> To.Parsetree.class_type_desc =
  function
  | From.Parsetree.Pcty_constr (x0,x1) ->
      To.Parsetree.Pcty_constr
        ((copy_loc copy_longident x0),
          (List.map copy_core_type x1))
  | From.Parsetree.Pcty_signature x0 ->
      To.Parsetree.Pcty_signature
        (copy_class_signature x0)
  | From.Parsetree.Pcty_arrow (x0,x1,x2) ->
      To.Parsetree.Pcty_arrow
        ((copy_arg_label x0),
          (copy_core_type x1),
          (copy_class_type x2))
  | From.Parsetree.Pcty_extension x0 ->
      To.Parsetree.Pcty_extension (copy_extension x0)

and copy_class_signature :
  From.Parsetree.class_signature -> To.Parsetree.class_signature =
  fun
    { From.Parsetree.pcsig_self = pcsig_self;
      From.Parsetree.pcsig_fields = pcsig_fields }
     ->
    {
      To.Parsetree.pcsig_self =
        (copy_core_type pcsig_self);
      To.Parsetree.pcsig_fields =
        (List.map copy_class_type_field pcsig_fields)
    }

and copy_class_type_field :
  From.Parsetree.class_type_field -> To.Parsetree.class_type_field =
  fun
    { From.Parsetree.pctf_desc = pctf_desc;
      From.Parsetree.pctf_loc = pctf_loc;
      From.Parsetree.pctf_attributes = pctf_attributes }
     ->
    {
      To.Parsetree.pctf_desc =
        (copy_class_type_field_desc pctf_desc);
      To.Parsetree.pctf_loc = (copy_location pctf_loc);
      To.Parsetree.pctf_attributes =
        (copy_attributes pctf_attributes)
    }

and copy_class_type_field_desc :
  From.Parsetree.class_type_field_desc ->
    To.Parsetree.class_type_field_desc
  =
  function
  | From.Parsetree.Pctf_inherit x0 ->
      To.Parsetree.Pctf_inherit (copy_class_type x0)
  | From.Parsetree.Pctf_val x0 ->
      To.Parsetree.Pctf_val
        (let (x0,x1,x2,x3) = x0  in
         (noloc x0, (copy_mutable_flag x1),
           (copy_virtual_flag x2),
           (copy_core_type x3)))
  | From.Parsetree.Pctf_method x0 ->
      To.Parsetree.Pctf_method
        (let (x0,x1,x2,x3) = x0  in
         (noloc x0, (copy_private_flag x1),
           (copy_virtual_flag x2),
           (copy_core_type x3)))
  | From.Parsetree.Pctf_constraint x0 ->
      To.Parsetree.Pctf_constraint
        (let (x0,x1) = x0  in
         ((copy_core_type x0),
           (copy_core_type x1)))
  | From.Parsetree.Pctf_attribute x0 ->
      To.Parsetree.Pctf_attribute (copy_attribute x0)
  | From.Parsetree.Pctf_extension x0 ->
      To.Parsetree.Pctf_extension (copy_extension x0)

and copy_extension :
  From.Parsetree.extension -> To.Parsetree.extension =
  fun x  ->
    let (x0,x1) = x  in
    ((copy_loc (fun x  -> x) x0),
      (copy_payload x1))

and copy_class_infos :
  'f0 'g0 .
    ('f0 -> 'g0) ->
      'f0 From.Parsetree.class_infos -> 'g0 To.Parsetree.class_infos
  =
  fun f0  ->
    fun
      { From.Parsetree.pci_virt = pci_virt;
        From.Parsetree.pci_params = pci_params;
        From.Parsetree.pci_name = pci_name;
        From.Parsetree.pci_expr = pci_expr;
        From.Parsetree.pci_loc = pci_loc;
        From.Parsetree.pci_attributes = pci_attributes }
       ->
      {
        To.Parsetree.pci_virt =
          (copy_virtual_flag pci_virt);
        To.Parsetree.pci_params =
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                ((copy_core_type x0),
                  (copy_variance x1))) pci_params);
        To.Parsetree.pci_name =
          (copy_loc (fun x  -> x) pci_name);
        To.Parsetree.pci_expr = (f0 pci_expr);
        To.Parsetree.pci_loc = (copy_location pci_loc);
        To.Parsetree.pci_attributes =
          (copy_attributes pci_attributes)
      }

and copy_virtual_flag :
  From.Asttypes.virtual_flag -> To.Asttypes.virtual_flag =
  function
  | From.Asttypes.Virtual  -> To.Asttypes.Virtual
  | From.Asttypes.Concrete  -> To.Asttypes.Concrete

and copy_include_description :
  From.Parsetree.include_description ->
    To.Parsetree.include_description
  =
  fun x  ->
    copy_include_infos copy_module_type x

and copy_include_infos :
  'f0 'g0 .
    ('f0 -> 'g0) ->
      'f0 From.Parsetree.include_infos ->
        'g0 To.Parsetree.include_infos
  =
  fun f0  ->
    fun
      { From.Parsetree.pincl_mod = pincl_mod;
        From.Parsetree.pincl_loc = pincl_loc;
        From.Parsetree.pincl_attributes = pincl_attributes }
       ->
      {
        To.Parsetree.pincl_mod = (f0 pincl_mod);
        To.Parsetree.pincl_loc = (copy_location pincl_loc);
        To.Parsetree.pincl_attributes =
          (copy_attributes pincl_attributes)
      }

and copy_open_description :
  From.Parsetree.open_description -> To.Parsetree.open_description =
  fun
    { From.Parsetree.popen_lid = popen_lid;
      From.Parsetree.popen_override = popen_override;
      From.Parsetree.popen_loc = popen_loc;
      From.Parsetree.popen_attributes = popen_attributes }
     ->
    {
      To.Parsetree.popen_lid =
        (copy_loc copy_longident popen_lid);
      To.Parsetree.popen_override =
        (copy_override_flag popen_override);
      To.Parsetree.popen_loc = (copy_location popen_loc);
      To.Parsetree.popen_attributes =
        (copy_attributes popen_attributes)
    }

and copy_override_flag :
  From.Asttypes.override_flag -> To.Asttypes.override_flag =
  function
  | From.Asttypes.Override  -> To.Asttypes.Override
  | From.Asttypes.Fresh  -> To.Asttypes.Fresh

and copy_module_type_declaration :
  From.Parsetree.module_type_declaration ->
    To.Parsetree.module_type_declaration
  =
  fun
    { From.Parsetree.pmtd_name = pmtd_name;
      From.Parsetree.pmtd_type = pmtd_type;
      From.Parsetree.pmtd_attributes = pmtd_attributes;
      From.Parsetree.pmtd_loc = pmtd_loc }
     ->
    {
      To.Parsetree.pmtd_name =
        (copy_loc (fun x  -> x) pmtd_name);
      To.Parsetree.pmtd_type =
        (copy_option copy_module_type pmtd_type);
      To.Parsetree.pmtd_attributes =
        (copy_attributes pmtd_attributes);
      To.Parsetree.pmtd_loc = (copy_location pmtd_loc)
    }

and copy_module_declaration :
  From.Parsetree.module_declaration ->
    To.Parsetree.module_declaration
  =
  fun
    { From.Parsetree.pmd_name = pmd_name;
      From.Parsetree.pmd_type = pmd_type;
      From.Parsetree.pmd_attributes = pmd_attributes;
      From.Parsetree.pmd_loc = pmd_loc }
     ->
    {
      To.Parsetree.pmd_name =
        (copy_loc (fun x  -> x) pmd_name);
      To.Parsetree.pmd_type =
        (copy_module_type pmd_type);
      To.Parsetree.pmd_attributes =
        (copy_attributes pmd_attributes);
      To.Parsetree.pmd_loc = (copy_location pmd_loc)
    }

and copy_type_extension :
  From.Parsetree.type_extension -> To.Parsetree.type_extension =
  fun
    { From.Parsetree.ptyext_path = ptyext_path;
      From.Parsetree.ptyext_params = ptyext_params;
      From.Parsetree.ptyext_constructors = ptyext_constructors;
      From.Parsetree.ptyext_private = ptyext_private;
      From.Parsetree.ptyext_attributes = ptyext_attributes }
     ->
    {
      To.Parsetree.ptyext_path =
        (copy_loc copy_longident ptyext_path);
      To.Parsetree.ptyext_params =
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_core_type x0),
                (copy_variance x1))) ptyext_params);
      To.Parsetree.ptyext_constructors =
        (List.map copy_extension_constructor
           ptyext_constructors);
      To.Parsetree.ptyext_private =
        (copy_private_flag ptyext_private);
      To.Parsetree.ptyext_attributes =
        (copy_attributes ptyext_attributes)
    }

and copy_extension_constructor :
  From.Parsetree.extension_constructor ->
    To.Parsetree.extension_constructor
  =
  fun
    { From.Parsetree.pext_name = pext_name;
      From.Parsetree.pext_kind = pext_kind;
      From.Parsetree.pext_loc = pext_loc;
      From.Parsetree.pext_attributes = pext_attributes }
     ->
    {
      To.Parsetree.pext_name =
        (copy_loc (fun x  -> x) pext_name);
      To.Parsetree.pext_kind =
        (copy_extension_constructor_kind pext_kind);
      To.Parsetree.pext_loc = (copy_location pext_loc);
      To.Parsetree.pext_attributes =
        (copy_attributes pext_attributes)
    }

and copy_extension_constructor_kind :
  From.Parsetree.extension_constructor_kind ->
    To.Parsetree.extension_constructor_kind
  =
  function
  | From.Parsetree.Pext_decl (x0,x1) ->
      To.Parsetree.Pext_decl
        ((copy_constructor_arguments x0),
          (copy_option copy_core_type x1))
  | From.Parsetree.Pext_rebind x0 ->
      To.Parsetree.Pext_rebind
        (copy_loc copy_longident x0)

and copy_type_declaration :
  From.Parsetree.type_declaration -> To.Parsetree.type_declaration =
  fun
    { From.Parsetree.ptype_name = ptype_name;
      From.Parsetree.ptype_params = ptype_params;
      From.Parsetree.ptype_cstrs = ptype_cstrs;
      From.Parsetree.ptype_kind = ptype_kind;
      From.Parsetree.ptype_private = ptype_private;
      From.Parsetree.ptype_manifest = ptype_manifest;
      From.Parsetree.ptype_attributes = ptype_attributes;
      From.Parsetree.ptype_loc = ptype_loc }
     ->
    {
      To.Parsetree.ptype_name =
        (copy_loc (fun x  -> x) ptype_name);
      To.Parsetree.ptype_params =
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_core_type x0),
                (copy_variance x1))) ptype_params);
      To.Parsetree.ptype_cstrs =
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              ((copy_core_type x0),
                (copy_core_type x1),
                (copy_location x2))) ptype_cstrs);
      To.Parsetree.ptype_kind =
        (copy_type_kind ptype_kind);
      To.Parsetree.ptype_private =
        (copy_private_flag ptype_private);
      To.Parsetree.ptype_manifest =
        (copy_option copy_core_type ptype_manifest);
      To.Parsetree.ptype_attributes =
        (copy_attributes ptype_attributes);
      To.Parsetree.ptype_loc = (copy_location ptype_loc)
    }

and copy_private_flag :
  From.Asttypes.private_flag -> To.Asttypes.private_flag =
  function
  | From.Asttypes.Private  -> To.Asttypes.Private
  | From.Asttypes.Public  -> To.Asttypes.Public

and copy_type_kind :
  From.Parsetree.type_kind -> To.Parsetree.type_kind =
  function
  | From.Parsetree.Ptype_abstract  -> To.Parsetree.Ptype_abstract
  | From.Parsetree.Ptype_variant x0 ->
      To.Parsetree.Ptype_variant
        (List.map copy_constructor_declaration x0)
  | From.Parsetree.Ptype_record x0 ->
      To.Parsetree.Ptype_record
        (List.map copy_label_declaration x0)
  | From.Parsetree.Ptype_open  -> To.Parsetree.Ptype_open

and copy_constructor_declaration :
  From.Parsetree.constructor_declaration ->
    To.Parsetree.constructor_declaration
  =
  fun
    { From.Parsetree.pcd_name = pcd_name;
      From.Parsetree.pcd_args = pcd_args;
      From.Parsetree.pcd_res = pcd_res;
      From.Parsetree.pcd_loc = pcd_loc;
      From.Parsetree.pcd_attributes = pcd_attributes }
     ->
    {
      To.Parsetree.pcd_name =
        (copy_loc (fun x  -> x) pcd_name);
      To.Parsetree.pcd_args =
        (copy_constructor_arguments pcd_args);
      To.Parsetree.pcd_res =
        (copy_option copy_core_type pcd_res);
      To.Parsetree.pcd_loc = (copy_location pcd_loc);
      To.Parsetree.pcd_attributes =
        (copy_attributes pcd_attributes)
    }

and copy_constructor_arguments :
  From.Parsetree.constructor_arguments ->
    To.Parsetree.constructor_arguments
  =
  function
  | From.Parsetree.Pcstr_tuple x0 ->
      To.Parsetree.Pcstr_tuple
        (List.map copy_core_type x0)
  | From.Parsetree.Pcstr_record x0 ->
      To.Parsetree.Pcstr_record
        (List.map copy_label_declaration x0)

and copy_label_declaration :
  From.Parsetree.label_declaration -> To.Parsetree.label_declaration
  =
  fun
    { From.Parsetree.pld_name = pld_name;
      From.Parsetree.pld_mutable = pld_mutable;
      From.Parsetree.pld_type = pld_type;
      From.Parsetree.pld_loc = pld_loc;
      From.Parsetree.pld_attributes = pld_attributes }
     ->
    {
      To.Parsetree.pld_name =
        (copy_loc (fun x  -> x) pld_name);
      To.Parsetree.pld_mutable =
        (copy_mutable_flag pld_mutable);
      To.Parsetree.pld_type =
        (copy_core_type pld_type);
      To.Parsetree.pld_loc = (copy_location pld_loc);
      To.Parsetree.pld_attributes =
        (copy_attributes pld_attributes)
    }

and copy_mutable_flag :
  From.Asttypes.mutable_flag -> To.Asttypes.mutable_flag =
  function
  | From.Asttypes.Immutable  -> To.Asttypes.Immutable
  | From.Asttypes.Mutable  -> To.Asttypes.Mutable

and copy_variance :
  From.Asttypes.variance -> To.Asttypes.variance =
  function
  | From.Asttypes.Covariant  -> To.Asttypes.Covariant
  | From.Asttypes.Contravariant  -> To.Asttypes.Contravariant
  | From.Asttypes.Invariant  -> To.Asttypes.Invariant

and copy_value_description :
  From.Parsetree.value_description -> To.Parsetree.value_description
  =
  fun
    { From.Parsetree.pval_name = pval_name;
      From.Parsetree.pval_type = pval_type;
      From.Parsetree.pval_prim = pval_prim;
      From.Parsetree.pval_attributes = pval_attributes;
      From.Parsetree.pval_loc = pval_loc }
     ->
    {
      To.Parsetree.pval_name =
        (copy_loc (fun x  -> x) pval_name);
      To.Parsetree.pval_type =
        (copy_core_type pval_type);
      To.Parsetree.pval_prim = (List.map (fun x  -> x) pval_prim);
      To.Parsetree.pval_attributes =
        (copy_attributes pval_attributes);
      To.Parsetree.pval_loc = (copy_location pval_loc)
    }

and copy_arg_label :
  From.Asttypes.arg_label -> To.Asttypes.arg_label =
  function
  | From.Asttypes.Nolabel  -> To.Asttypes.Nolabel
  | From.Asttypes.Labelled x0 -> To.Asttypes.Labelled x0
  | From.Asttypes.Optional x0 -> To.Asttypes.Optional x0

and copy_closed_flag :
  From.Asttypes.closed_flag -> To.Asttypes.closed_flag =
  function
  | From.Asttypes.Closed  -> To.Asttypes.Closed
  | From.Asttypes.Open  -> To.Asttypes.Open

and copy_label :
  From.Asttypes.label -> To.Asttypes.label = fun x  -> x

and copy_rec_flag :
  From.Asttypes.rec_flag -> To.Asttypes.rec_flag =
  function
  | From.Asttypes.Nonrecursive  -> To.Asttypes.Nonrecursive
  | From.Asttypes.Recursive  -> To.Asttypes.Recursive

and copy_constant :
  From.Parsetree.constant -> To.Parsetree.constant =
  function
  | From.Parsetree.Pconst_integer (x0,x1) ->
      To.Parsetree.Pconst_integer (x0, (copy_option (fun x  -> x) x1))
  | From.Parsetree.Pconst_char x0 -> To.Parsetree.Pconst_char x0
  | From.Parsetree.Pconst_string (x0,x1) ->
      To.Parsetree.Pconst_string (x0, (copy_option (fun x  -> x) x1))
  | From.Parsetree.Pconst_float (x0,x1) ->
      To.Parsetree.Pconst_float (x0, (copy_option (fun x  -> x) x1))

and copy_option : 'f0 'g0 . ('f0 -> 'g0) -> 'f0 option -> 'g0 option =
  fun f0  -> function | None  -> None | Some x0 -> Some (f0 x0)

and copy_longident : From.Longident.t -> To.Longident.t =
  function
  | From.Longident.Lident x0 -> To.Longident.Lident x0
  | From.Longident.Ldot (x0,x1) ->
      To.Longident.Ldot ((copy_longident x0), x1)
  | From.Longident.Lapply (x0,x1) ->
      To.Longident.Lapply
        ((copy_longident x0), (copy_longident x1))

and copy_loc :
  'f0 'g0 .
    ('f0 -> 'g0) -> 'f0 From.Asttypes.loc -> 'g0 To.Asttypes.loc
  =
  fun f0  ->
    fun { From.Asttypes.txt = txt; From.Asttypes.loc = loc }  ->
      {
        To.Asttypes.txt = (f0 txt);
        To.Asttypes.loc = (copy_location loc)
      }

and copy_location : From.Location.t -> To.Location.t =
  fun
    { From.Location.loc_start = loc_start;
      From.Location.loc_end = loc_end;
      From.Location.loc_ghost = loc_ghost }
     ->
    {
      To.Location.loc_start = (copy_Lexing_position loc_start);
      To.Location.loc_end = (copy_Lexing_position loc_end);
      To.Location.loc_ghost = (copy_bool loc_ghost)
    }

and copy_bool : bool -> bool = function | false  -> false | true  -> true

and copy_Lexing_position : Lexing.position -> Lexing.position =
  fun
    { Lexing.pos_fname = pos_fname; Lexing.pos_lnum = pos_lnum;
      Lexing.pos_bol = pos_bol; Lexing.pos_cnum = pos_cnum }
     ->
    {
      Lexing.pos_fname = pos_fname;
      Lexing.pos_lnum = pos_lnum;
      Lexing.pos_bol = pos_bol;
      Lexing.pos_cnum = pos_cnum
    }

let rec copy_out_phrase :
  From.Outcometree.out_phrase -> To.Outcometree.out_phrase =
  function
  | From.Outcometree.Ophr_eval (x0,x1) ->
      To.Outcometree.Ophr_eval
        ((copy_out_value x0),
          (copy_out_type x1))
  | From.Outcometree.Ophr_signature x0 ->
      To.Outcometree.Ophr_signature
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_out_sig_item x0),
                (copy_option copy_out_value x1))) x0)
  | From.Outcometree.Ophr_exception x0 ->
      To.Outcometree.Ophr_exception
        (let (x0,x1) = x0  in
         ((copy_exn x0), (copy_out_value x1)))

and copy_exn : exn -> exn = fun x  -> x

and copy_out_sig_item :
  From.Outcometree.out_sig_item -> To.Outcometree.out_sig_item =
  function
  | From.Outcometree.Osig_class (x0,x1,x2,x3,x4) ->
      To.Outcometree.Osig_class
        ((copy_bool x0), x1,
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                (x0, (let (x0,x1) = x1  in ((copy_bool x0), (copy_bool x1)))))
             x2), (copy_out_class_type x3),
          (copy_out_rec_status x4))
  | From.Outcometree.Osig_class_type (x0,x1,x2,x3,x4) ->
      To.Outcometree.Osig_class_type
        ((copy_bool x0), x1,
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                (x0, (let (x0,x1) = x1  in ((copy_bool x0), (copy_bool x1)))))
             x2), (copy_out_class_type x3),
          (copy_out_rec_status x4))
  | From.Outcometree.Osig_typext (x0,x1) ->
      To.Outcometree.Osig_typext
        ((copy_out_extension_constructor x0),
          (copy_out_ext_status x1))
  | From.Outcometree.Osig_modtype (x0,x1) ->
      To.Outcometree.Osig_modtype
        (x0, (copy_out_module_type x1))
  | From.Outcometree.Osig_module (x0,x1,x2) ->
      To.Outcometree.Osig_module
        (x0, (copy_out_module_type x1),
          (copy_out_rec_status x2))
  | From.Outcometree.Osig_type (x0,x1) ->
      To.Outcometree.Osig_type
        ((copy_out_type_decl x0),
          (copy_out_rec_status x1))
  | From.Outcometree.Osig_value x0 ->
      To.Outcometree.Osig_value
        (copy_out_val_decl x0)
  | From.Outcometree.Osig_ellipsis  -> To.Outcometree.Osig_ellipsis

and copy_out_val_decl :
  From.Outcometree.out_val_decl -> To.Outcometree.out_val_decl =
  fun
    { From.Outcometree.oval_name = oval_name;
      From.Outcometree.oval_type = oval_type;
      From.Outcometree.oval_prims = oval_prims;
      From.Outcometree.oval_attributes = oval_attributes }
     ->
    {
      To.Outcometree.oval_name = oval_name;
      To.Outcometree.oval_type =
        (copy_out_type oval_type);
      To.Outcometree.oval_prims = (List.map (fun x  -> x) oval_prims);
      To.Outcometree.oval_attributes =
        (List.map copy_out_attribute oval_attributes)
    }

and copy_out_type_decl :
  From.Outcometree.out_type_decl -> To.Outcometree.out_type_decl =
  fun
    { From.Outcometree.otype_name = otype_name;
      From.Outcometree.otype_params = otype_params;
      From.Outcometree.otype_type = otype_type;
      From.Outcometree.otype_private = otype_private;
      From.Outcometree.otype_immediate = otype_immediate;
      From.Outcometree.otype_unboxed = otype_unboxed;
      From.Outcometree.otype_cstrs = otype_cstrs }
     ->
    {
      To.Outcometree.otype_name = otype_name;
      To.Outcometree.otype_params =
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              (x0, (let (x0,x1) = x1  in ((copy_bool x0), (copy_bool x1)))))
           otype_params);
      To.Outcometree.otype_type =
        (copy_out_type otype_type);
      To.Outcometree.otype_private =
        (copy_From_Asttypes_private_flag otype_private);
      To.Outcometree.otype_immediate = (copy_bool otype_immediate);
      To.Outcometree.otype_unboxed = (copy_bool otype_unboxed);
      To.Outcometree.otype_cstrs =
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_out_type x0),
                (copy_out_type x1))) otype_cstrs)
    }

and copy_out_module_type :
  From.Outcometree.out_module_type -> To.Outcometree.out_module_type
  =
  function
  | From.Outcometree.Omty_abstract  -> To.Outcometree.Omty_abstract
  | From.Outcometree.Omty_functor (x0,x1,x2) ->
      To.Outcometree.Omty_functor
        (x0, (copy_option copy_out_module_type x1),
          (copy_out_module_type x2))
  | From.Outcometree.Omty_ident x0 ->
      To.Outcometree.Omty_ident (copy_out_ident x0)
  | From.Outcometree.Omty_signature x0 ->
      To.Outcometree.Omty_signature
        (List.map copy_out_sig_item x0)
  | From.Outcometree.Omty_alias x0 ->
      To.Outcometree.Omty_alias (copy_out_ident x0)

and copy_out_ext_status :
  From.Outcometree.out_ext_status -> To.Outcometree.out_ext_status =
  function
  | From.Outcometree.Oext_first  -> To.Outcometree.Oext_first
  | From.Outcometree.Oext_next  -> To.Outcometree.Oext_next
  | From.Outcometree.Oext_exception  -> To.Outcometree.Oext_exception

and copy_out_extension_constructor :
  From.Outcometree.out_extension_constructor ->
    To.Outcometree.out_extension_constructor
  =
  fun
    { From.Outcometree.oext_name = oext_name;
      From.Outcometree.oext_type_name = oext_type_name;
      From.Outcometree.oext_type_params = oext_type_params;
      From.Outcometree.oext_args = oext_args;
      From.Outcometree.oext_ret_type = oext_ret_type;
      From.Outcometree.oext_private = oext_private }
     ->
    {
      To.Outcometree.oext_name = oext_name;
      To.Outcometree.oext_type_name = oext_type_name;
      To.Outcometree.oext_type_params =
        (List.map (fun x  -> x) oext_type_params);
      To.Outcometree.oext_args =
        (List.map copy_out_type oext_args);
      To.Outcometree.oext_ret_type =
        (copy_option copy_out_type oext_ret_type);
      To.Outcometree.oext_private =
        (copy_From_Asttypes_private_flag oext_private)
    }

and copy_From_Asttypes_private_flag :
  From.Asttypes.private_flag -> To.Asttypes.private_flag =
  function
  | From.Asttypes.Private  -> To.Asttypes.Private
  | From.Asttypes.Public  -> To.Asttypes.Public

and copy_out_rec_status :
  From.Outcometree.out_rec_status -> To.Outcometree.out_rec_status =
  function
  | From.Outcometree.Orec_not  -> To.Outcometree.Orec_not
  | From.Outcometree.Orec_first  -> To.Outcometree.Orec_first
  | From.Outcometree.Orec_next  -> To.Outcometree.Orec_next

and copy_out_class_type :
  From.Outcometree.out_class_type -> To.Outcometree.out_class_type =
  function
  | From.Outcometree.Octy_constr (x0,x1) ->
      To.Outcometree.Octy_constr
        ((copy_out_ident x0),
          (List.map copy_out_type x1))
  | From.Outcometree.Octy_arrow (x0,x1,x2) ->
      To.Outcometree.Octy_arrow
        (x0, (copy_out_type x1),
          (copy_out_class_type x2))
  | From.Outcometree.Octy_signature (x0,x1) ->
      To.Outcometree.Octy_signature
        ((copy_option copy_out_type x0),
          (List.map copy_out_class_sig_item x1))

and copy_out_class_sig_item :
  From.Outcometree.out_class_sig_item ->
    To.Outcometree.out_class_sig_item
  =
  function
  | From.Outcometree.Ocsg_constraint (x0,x1) ->
      To.Outcometree.Ocsg_constraint
        ((copy_out_type x0),
          (copy_out_type x1))
  | From.Outcometree.Ocsg_method (x0,x1,x2,x3) ->
      To.Outcometree.Ocsg_method
        (x0, (copy_bool x1), (copy_bool x2),
          (copy_out_type x3))
  | From.Outcometree.Ocsg_value (x0,x1,x2,x3) ->
      To.Outcometree.Ocsg_value
        (x0, (copy_bool x1), (copy_bool x2),
          (copy_out_type x3))

and copy_out_type :
  From.Outcometree.out_type -> To.Outcometree.out_type =
  function
  | From.Outcometree.Otyp_abstract  -> To.Outcometree.Otyp_abstract
  | From.Outcometree.Otyp_open  -> To.Outcometree.Otyp_open
  | From.Outcometree.Otyp_alias (x0,x1) ->
      To.Outcometree.Otyp_alias
        ((copy_out_type x0), x1)
  | From.Outcometree.Otyp_arrow (x0,x1,x2) ->
      To.Outcometree.Otyp_arrow
        (x0, (copy_out_type x1),
          (copy_out_type x2))
  | From.Outcometree.Otyp_class (x0,x1,x2) ->
      To.Outcometree.Otyp_class
        ((copy_bool x0), (copy_out_ident x1),
          (List.map copy_out_type x2))
  | From.Outcometree.Otyp_constr (x0,x1) ->
      To.Outcometree.Otyp_constr
        ((copy_out_ident x0),
          (List.map copy_out_type x1))
  | From.Outcometree.Otyp_manifest (x0,x1) ->
      To.Outcometree.Otyp_manifest
        ((copy_out_type x0),
          (copy_out_type x1))
  | From.Outcometree.Otyp_object (x0,x1) ->
      To.Outcometree.Otyp_object
        ((List.map
            (fun x  ->
               let (x0,x1) = x  in
               (x0, (copy_out_type x1))) x0),
          (copy_option copy_bool x1))
  | From.Outcometree.Otyp_record x0 ->
      To.Outcometree.Otyp_record
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              (x0, (copy_bool x1), (copy_out_type x2)))
           x0)
  | From.Outcometree.Otyp_stuff x0 -> To.Outcometree.Otyp_stuff x0
  | From.Outcometree.Otyp_sum x0 ->
      To.Outcometree.Otyp_sum
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              (x0, (List.map copy_out_type x1),
                (copy_option copy_out_type x2))) x0)
  | From.Outcometree.Otyp_tuple x0 ->
      To.Outcometree.Otyp_tuple
        (List.map copy_out_type x0)
  | From.Outcometree.Otyp_var (x0,x1) ->
      To.Outcometree.Otyp_var ((copy_bool x0), x1)
  | From.Outcometree.Otyp_variant (x0,x1,x2,x3) ->
      To.Outcometree.Otyp_variant
        ((copy_bool x0), (copy_out_variant x1),
          (copy_bool x2),
          (copy_option (fun x  -> List.map (fun x  -> x) x) x3))
  | From.Outcometree.Otyp_poly (x0,x1) ->
      To.Outcometree.Otyp_poly
        ((List.map (fun x  -> x) x0), (copy_out_type x1))
  | From.Outcometree.Otyp_module (x0,x1,x2) ->
      To.Outcometree.Otyp_module
        (x0, (List.map (fun x  -> x) x1),
          (List.map copy_out_type x2))
  | From.Outcometree.Otyp_attribute (x0,x1) ->
      To.Outcometree.Otyp_attribute
        ((copy_out_type x0),
          (copy_out_attribute x1))

and copy_out_attribute :
  From.Outcometree.out_attribute -> To.Outcometree.out_attribute =
  fun { From.Outcometree.oattr_name = oattr_name }  ->
    { To.Outcometree.oattr_name = oattr_name }

and copy_out_variant :
  From.Outcometree.out_variant -> To.Outcometree.out_variant =
  function
  | From.Outcometree.Ovar_fields x0 ->
      To.Outcometree.Ovar_fields
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              (x0, (copy_bool x1),
                (List.map copy_out_type x2))) x0)
  | From.Outcometree.Ovar_name (x0,x1) ->
      To.Outcometree.Ovar_typ
        (To.Outcometree.Otyp_constr
           ((copy_out_ident x0),
            (List.map copy_out_type x1)))

and copy_out_value :
  From.Outcometree.out_value -> To.Outcometree.out_value =
  function
  | From.Outcometree.Oval_array x0 ->
      To.Outcometree.Oval_array
        (List.map copy_out_value x0)
  | From.Outcometree.Oval_char x0 -> To.Outcometree.Oval_char x0
  | From.Outcometree.Oval_constr (x0,x1) ->
      To.Outcometree.Oval_constr
        ((copy_out_ident x0),
          (List.map copy_out_value x1))
  | From.Outcometree.Oval_ellipsis  -> To.Outcometree.Oval_ellipsis
  | From.Outcometree.Oval_float x0 ->
      To.Outcometree.Oval_float (copy_float x0)
  | From.Outcometree.Oval_int x0 -> To.Outcometree.Oval_int x0
  | From.Outcometree.Oval_int32 x0 -> To.Outcometree.Oval_int32 x0
  | From.Outcometree.Oval_int64 x0 -> To.Outcometree.Oval_int64 x0
  | From.Outcometree.Oval_nativeint x0 ->
      To.Outcometree.Oval_nativeint x0
  | From.Outcometree.Oval_list x0 ->
      To.Outcometree.Oval_list
        (List.map copy_out_value x0)
  | From.Outcometree.Oval_printer x0 ->
      To.Outcometree.Oval_printer x0
  | From.Outcometree.Oval_record x0 ->
      To.Outcometree.Oval_record
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_out_ident x0),
                (copy_out_value x1))) x0)
  | From.Outcometree.Oval_string x0 -> To.Outcometree.Oval_string x0
  | From.Outcometree.Oval_stuff x0 -> To.Outcometree.Oval_stuff x0
  | From.Outcometree.Oval_tuple x0 ->
      To.Outcometree.Oval_tuple
        (List.map copy_out_value x0)
  | From.Outcometree.Oval_variant (x0,x1) ->
      To.Outcometree.Oval_variant
        (x0, (copy_option copy_out_value x1))

and copy_float : float -> float = fun x  -> x

and copy_out_ident :
  From.Outcometree.out_ident -> To.Outcometree.out_ident =
  function
  | From.Outcometree.Oide_apply (x0,x1) ->
      To.Outcometree.Oide_apply
        ((copy_out_ident x0),
          (copy_out_ident x1))
  | From.Outcometree.Oide_dot (x0,x1) ->
      To.Outcometree.Oide_dot
        ((copy_out_ident x0), x1)
  | From.Outcometree.Oide_ident x0 -> To.Outcometree.Oide_ident x0

let rec copy_toplevel_phrase :
  From.Parsetree.toplevel_phrase -> To.Parsetree.toplevel_phrase =
  function
  | From.Parsetree.Ptop_def x0 ->
      To.Parsetree.Ptop_def (copy_structure x0)
  | From.Parsetree.Ptop_dir (x0,x1) ->
      To.Parsetree.Ptop_dir
        (x0, (copy_directive_argument x1))

and copy_directive_argument :
  From.Parsetree.directive_argument -> To.Parsetree.directive_argument =
  function
  | From.Parsetree.Pdir_none  -> To.Parsetree.Pdir_none
  | From.Parsetree.Pdir_string x0 -> To.Parsetree.Pdir_string x0
  | From.Parsetree.Pdir_int (x0,x1) ->
      To.Parsetree.Pdir_int (x0, (copy_option (fun x  -> x) x1))
  | From.Parsetree.Pdir_ident x0 ->
      To.Parsetree.Pdir_ident (copy_longident x0)
  | From.Parsetree.Pdir_bool x0 ->
      To.Parsetree.Pdir_bool (copy_bool x0)

let copy_out_type_extension :
  From.Outcometree.out_type_extension -> To.Outcometree.out_type_extension =
  fun
    { From.Outcometree.otyext_name = otyext_name;
      From.Outcometree.otyext_params = otyext_params;
      From.Outcometree.otyext_constructors = otyext_constructors;
      From.Outcometree.otyext_private = otyext_private }
     ->
    {
      To.Outcometree.otyext_name = otyext_name;
      To.Outcometree.otyext_params =
        (List.map (fun x  -> x) otyext_params);
      To.Outcometree.otyext_constructors =
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              (x0, (List.map copy_out_type x1),
                (copy_option copy_out_type x2)))
           otyext_constructors);
      To.Outcometree.otyext_private =
        (copy_private_flag otyext_private)
    }

let copy_cases x = List.map copy_case x
let copy_pat = copy_pattern
let copy_expr = copy_expression
let copy_typ = copy_core_type

end
module Migrate_parsetree_405_404_migrate
= struct
#1 "migrate_parsetree_405_404_migrate.ml"
# 1 "src/migrate_parsetree_405_404_migrate.ml"
(**************************************************************************)
(*                                                                        *)
(*                         OCaml Migrate Parsetree                        *)
(*                                                                        *)
(*                             Frédéric Bour                              *)
(*                         Alain Frisch, LexiFi                           *)
(*                                                                        *)
(*   Copyright 2017 Institut National de Recherche en Informatique et     *)
(*     en Automatique (INRIA).                                            *)
(*                                                                        *)
(*   All rights reserved.  This file is distributed under the terms of    *)
(*   the GNU Lesser General Public License version 2.1, with the          *)
(*   special exception on linking described in the file LICENSE.          *)
(*                                                                        *)
(**************************************************************************)

module From = Ast_405
module To = Ast_404

let rec copy_expression :
  From.Parsetree.expression -> To.Parsetree.expression =
  fun
    { From.Parsetree.pexp_desc = pexp_desc;
      From.Parsetree.pexp_loc = pexp_loc;
      From.Parsetree.pexp_attributes = pexp_attributes }
     ->
    {
      To.Parsetree.pexp_desc =
        (copy_expression_desc pexp_desc);
      To.Parsetree.pexp_loc = (copy_location pexp_loc);
      To.Parsetree.pexp_attributes =
        (copy_attributes pexp_attributes)
    }

and copy_expression_desc :
  From.Parsetree.expression_desc -> To.Parsetree.expression_desc =
  function
  | From.Parsetree.Pexp_ident x0 ->
      To.Parsetree.Pexp_ident
        (copy_loc copy_longident x0)
  | From.Parsetree.Pexp_constant x0 ->
      To.Parsetree.Pexp_constant (copy_constant x0)
  | From.Parsetree.Pexp_let (x0,x1,x2) ->
      To.Parsetree.Pexp_let
        ((copy_rec_flag x0),
          (List.map copy_value_binding x1),
          (copy_expression x2))
  | From.Parsetree.Pexp_function x0 ->
      To.Parsetree.Pexp_function
        (List.map copy_case x0)
  | From.Parsetree.Pexp_fun (x0,x1,x2,x3) ->
      To.Parsetree.Pexp_fun
        ((copy_arg_label x0),
          (copy_option copy_expression x1),
          (copy_pattern x2),
          (copy_expression x3))
  | From.Parsetree.Pexp_apply (x0,x1) ->
      To.Parsetree.Pexp_apply
        ((copy_expression x0),
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                ((copy_arg_label x0),
                  (copy_expression x1))) x1))
  | From.Parsetree.Pexp_match (x0,x1) ->
      To.Parsetree.Pexp_match
        ((copy_expression x0),
          (List.map copy_case x1))
  | From.Parsetree.Pexp_try (x0,x1) ->
      To.Parsetree.Pexp_try
        ((copy_expression x0),
          (List.map copy_case x1))
  | From.Parsetree.Pexp_tuple x0 ->
      To.Parsetree.Pexp_tuple
        (List.map copy_expression x0)
  | From.Parsetree.Pexp_construct (x0,x1) ->
      To.Parsetree.Pexp_construct
        ((copy_loc copy_longident x0),
          (copy_option copy_expression x1))
  | From.Parsetree.Pexp_variant (x0,x1) ->
      To.Parsetree.Pexp_variant
        ((copy_label x0),
          (copy_option copy_expression x1))
  | From.Parsetree.Pexp_record (x0,x1) ->
      To.Parsetree.Pexp_record
        ((List.map
            (fun x  ->
               let (x0,x1) = x  in
               ((copy_loc copy_longident x0),
                 (copy_expression x1))) x0),
          (copy_option copy_expression x1))
  | From.Parsetree.Pexp_field (x0,x1) ->
      To.Parsetree.Pexp_field
        ((copy_expression x0),
          (copy_loc copy_longident x1))
  | From.Parsetree.Pexp_setfield (x0,x1,x2) ->
      To.Parsetree.Pexp_setfield
        ((copy_expression x0),
          (copy_loc copy_longident x1),
          (copy_expression x2))
  | From.Parsetree.Pexp_array x0 ->
      To.Parsetree.Pexp_array
        (List.map copy_expression x0)
  | From.Parsetree.Pexp_ifthenelse (x0,x1,x2) ->
      To.Parsetree.Pexp_ifthenelse
        ((copy_expression x0),
          (copy_expression x1),
          (copy_option copy_expression x2))
  | From.Parsetree.Pexp_sequence (x0,x1) ->
      To.Parsetree.Pexp_sequence
        ((copy_expression x0),
          (copy_expression x1))
  | From.Parsetree.Pexp_while (x0,x1) ->
      To.Parsetree.Pexp_while
        ((copy_expression x0),
          (copy_expression x1))
  | From.Parsetree.Pexp_for (x0,x1,x2,x3,x4) ->
      To.Parsetree.Pexp_for
        ((copy_pattern x0),
          (copy_expression x1),
          (copy_expression x2),
          (copy_direction_flag x3),
          (copy_expression x4))
  | From.Parsetree.Pexp_constraint (x0,x1) ->
      To.Parsetree.Pexp_constraint
        ((copy_expression x0),
          (copy_core_type x1))
  | From.Parsetree.Pexp_coerce (x0,x1,x2) ->
      To.Parsetree.Pexp_coerce
        ((copy_expression x0),
          (copy_option copy_core_type x1),
          (copy_core_type x2))
  | From.Parsetree.Pexp_send (x0,x1) ->
      To.Parsetree.Pexp_send
        ((copy_expression x0), x1.From.Asttypes.txt)
  | From.Parsetree.Pexp_new x0 ->
      To.Parsetree.Pexp_new
        (copy_loc copy_longident x0)
  | From.Parsetree.Pexp_setinstvar (x0,x1) ->
      To.Parsetree.Pexp_setinstvar
        ((copy_loc (fun x  -> x) x0),
          (copy_expression x1))
  | From.Parsetree.Pexp_override x0 ->
      To.Parsetree.Pexp_override
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_loc (fun x  -> x) x0),
                (copy_expression x1))) x0)
  | From.Parsetree.Pexp_letmodule (x0,x1,x2) ->
      To.Parsetree.Pexp_letmodule
        ((copy_loc (fun x  -> x) x0),
          (copy_module_expr x1),
          (copy_expression x2))
  | From.Parsetree.Pexp_letexception (x0,x1) ->
      To.Parsetree.Pexp_letexception
        ((copy_extension_constructor x0),
          (copy_expression x1))
  | From.Parsetree.Pexp_assert x0 ->
      To.Parsetree.Pexp_assert (copy_expression x0)
  | From.Parsetree.Pexp_lazy x0 ->
      To.Parsetree.Pexp_lazy (copy_expression x0)
  | From.Parsetree.Pexp_poly (x0,x1) ->
      To.Parsetree.Pexp_poly
        ((copy_expression x0),
          (copy_option copy_core_type x1))
  | From.Parsetree.Pexp_object x0 ->
      To.Parsetree.Pexp_object
        (copy_class_structure x0)
  | From.Parsetree.Pexp_newtype (x0,x1) ->
      To.Parsetree.Pexp_newtype
        (x0.From.Asttypes.txt, (copy_expression x1))
  | From.Parsetree.Pexp_pack x0 ->
      To.Parsetree.Pexp_pack (copy_module_expr x0)
  | From.Parsetree.Pexp_open (x0,x1,x2) ->
      To.Parsetree.Pexp_open
        ((copy_override_flag x0),
          (copy_loc copy_longident x1),
          (copy_expression x2))
  | From.Parsetree.Pexp_extension x0 ->
      To.Parsetree.Pexp_extension (copy_extension x0)
  | From.Parsetree.Pexp_unreachable  -> To.Parsetree.Pexp_unreachable

and copy_direction_flag :
  From.Asttypes.direction_flag -> To.Asttypes.direction_flag =
  function
  | From.Asttypes.Upto  -> To.Asttypes.Upto
  | From.Asttypes.Downto  -> To.Asttypes.Downto

and copy_case :
  From.Parsetree.case -> To.Parsetree.case =
  fun
    { From.Parsetree.pc_lhs = pc_lhs;
      From.Parsetree.pc_guard = pc_guard;
      From.Parsetree.pc_rhs = pc_rhs }
     ->
    {
      To.Parsetree.pc_lhs = (copy_pattern pc_lhs);
      To.Parsetree.pc_guard =
        (copy_option copy_expression pc_guard);
      To.Parsetree.pc_rhs = (copy_expression pc_rhs)
    }

and copy_value_binding :
  From.Parsetree.value_binding -> To.Parsetree.value_binding =
  fun
    { From.Parsetree.pvb_pat = pvb_pat;
      From.Parsetree.pvb_expr = pvb_expr;
      From.Parsetree.pvb_attributes = pvb_attributes;
      From.Parsetree.pvb_loc = pvb_loc }
     ->
    {
      To.Parsetree.pvb_pat = (copy_pattern pvb_pat);
      To.Parsetree.pvb_expr =
        (copy_expression pvb_expr);
      To.Parsetree.pvb_attributes =
        (copy_attributes pvb_attributes);
      To.Parsetree.pvb_loc = (copy_location pvb_loc)
    }

and copy_pattern :
  From.Parsetree.pattern -> To.Parsetree.pattern =
  fun
    { From.Parsetree.ppat_desc = ppat_desc;
      From.Parsetree.ppat_loc = ppat_loc;
      From.Parsetree.ppat_attributes = ppat_attributes }
     ->
    {
      To.Parsetree.ppat_desc =
        (copy_pattern_desc ppat_desc);
      To.Parsetree.ppat_loc = (copy_location ppat_loc);
      To.Parsetree.ppat_attributes =
        (copy_attributes ppat_attributes)
    }

and copy_pattern_desc :
  From.Parsetree.pattern_desc -> To.Parsetree.pattern_desc =
  function
  | From.Parsetree.Ppat_any  -> To.Parsetree.Ppat_any
  | From.Parsetree.Ppat_var x0 ->
      To.Parsetree.Ppat_var (copy_loc (fun x  -> x) x0)
  | From.Parsetree.Ppat_alias (x0,x1) ->
      To.Parsetree.Ppat_alias
        ((copy_pattern x0),
          (copy_loc (fun x  -> x) x1))
  | From.Parsetree.Ppat_constant x0 ->
      To.Parsetree.Ppat_constant (copy_constant x0)
  | From.Parsetree.Ppat_interval (x0,x1) ->
      To.Parsetree.Ppat_interval
        ((copy_constant x0),
          (copy_constant x1))
  | From.Parsetree.Ppat_tuple x0 ->
      To.Parsetree.Ppat_tuple
        (List.map copy_pattern x0)
  | From.Parsetree.Ppat_construct (x0,x1) ->
      To.Parsetree.Ppat_construct
        ((copy_loc copy_longident x0),
          (copy_option copy_pattern x1))
  | From.Parsetree.Ppat_variant (x0,x1) ->
      To.Parsetree.Ppat_variant
        ((copy_label x0),
          (copy_option copy_pattern x1))
  | From.Parsetree.Ppat_record (x0,x1) ->
      To.Parsetree.Ppat_record
        ((List.map
            (fun x  ->
               let (x0,x1) = x  in
               ((copy_loc copy_longident x0),
                 (copy_pattern x1))) x0),
          (copy_closed_flag x1))
  | From.Parsetree.Ppat_array x0 ->
      To.Parsetree.Ppat_array
        (List.map copy_pattern x0)
  | From.Parsetree.Ppat_or (x0,x1) ->
      To.Parsetree.Ppat_or
        ((copy_pattern x0),
          (copy_pattern x1))
  | From.Parsetree.Ppat_constraint (x0,x1) ->
      To.Parsetree.Ppat_constraint
        ((copy_pattern x0),
          (copy_core_type x1))
  | From.Parsetree.Ppat_type x0 ->
      To.Parsetree.Ppat_type
        (copy_loc copy_longident x0)
  | From.Parsetree.Ppat_lazy x0 ->
      To.Parsetree.Ppat_lazy (copy_pattern x0)
  | From.Parsetree.Ppat_unpack x0 ->
      To.Parsetree.Ppat_unpack
        (copy_loc (fun x  -> x) x0)
  | From.Parsetree.Ppat_exception x0 ->
      To.Parsetree.Ppat_exception (copy_pattern x0)
  | From.Parsetree.Ppat_extension x0 ->
      To.Parsetree.Ppat_extension (copy_extension x0)
  | From.Parsetree.Ppat_open (x0,x1) ->
      To.Parsetree.Ppat_open
        ((copy_loc copy_longident x0),
          (copy_pattern x1))

and copy_core_type :
  From.Parsetree.core_type -> To.Parsetree.core_type =
  fun
    { From.Parsetree.ptyp_desc = ptyp_desc;
      From.Parsetree.ptyp_loc = ptyp_loc;
      From.Parsetree.ptyp_attributes = ptyp_attributes }
     ->
    {
      To.Parsetree.ptyp_desc =
        (copy_core_type_desc ptyp_desc);
      To.Parsetree.ptyp_loc = (copy_location ptyp_loc);
      To.Parsetree.ptyp_attributes =
        (copy_attributes ptyp_attributes)
    }

and copy_core_type_desc :
  From.Parsetree.core_type_desc -> To.Parsetree.core_type_desc =
  function
  | From.Parsetree.Ptyp_any  -> To.Parsetree.Ptyp_any
  | From.Parsetree.Ptyp_var x0 -> To.Parsetree.Ptyp_var x0
  | From.Parsetree.Ptyp_arrow (x0,x1,x2) ->
      To.Parsetree.Ptyp_arrow
        ((copy_arg_label x0),
          (copy_core_type x1),
          (copy_core_type x2))
  | From.Parsetree.Ptyp_tuple x0 ->
      To.Parsetree.Ptyp_tuple
        (List.map copy_core_type x0)
  | From.Parsetree.Ptyp_constr (x0,x1) ->
      To.Parsetree.Ptyp_constr
        ((copy_loc copy_longident x0),
          (List.map copy_core_type x1))
  | From.Parsetree.Ptyp_object (x0,x1) ->
      To.Parsetree.Ptyp_object
        ((List.map
            (fun x  ->
               let (x0,x1,x2) = x  in
               (x0.From.Asttypes.txt, (copy_attributes x1),
                 (copy_core_type x2))) x0),
          (copy_closed_flag x1))
  | From.Parsetree.Ptyp_class (x0,x1) ->
      To.Parsetree.Ptyp_class
        ((copy_loc copy_longident x0),
          (List.map copy_core_type x1))
  | From.Parsetree.Ptyp_alias (x0,x1) ->
      To.Parsetree.Ptyp_alias
        ((copy_core_type x0), x1)
  | From.Parsetree.Ptyp_variant (x0,x1,x2) ->
      To.Parsetree.Ptyp_variant
        ((List.map copy_row_field x0),
          (copy_closed_flag x1),
          (copy_option (fun x  -> List.map copy_label x) x2))
  | From.Parsetree.Ptyp_poly (x0,x1) ->
      To.Parsetree.Ptyp_poly
        ((List.map (fun x  -> x.From.Asttypes.txt) x0), (copy_core_type x1))
  | From.Parsetree.Ptyp_package x0 ->
      To.Parsetree.Ptyp_package (copy_package_type x0)
  | From.Parsetree.Ptyp_extension x0 ->
      To.Parsetree.Ptyp_extension (copy_extension x0)

and copy_package_type :
  From.Parsetree.package_type -> To.Parsetree.package_type =
  fun x  ->
    let (x0,x1) = x  in
    ((copy_loc copy_longident x0),
      (List.map
         (fun x  ->
            let (x0,x1) = x  in
            ((copy_loc copy_longident x0),
              (copy_core_type x1))) x1))

and copy_row_field :
  From.Parsetree.row_field -> To.Parsetree.row_field =
  function
  | From.Parsetree.Rtag (x0,x1,x2,x3) ->
      To.Parsetree.Rtag
        ((copy_label x0),
          (copy_attributes x1), (copy_bool x2),
          (List.map copy_core_type x3))
  | From.Parsetree.Rinherit x0 ->
      To.Parsetree.Rinherit (copy_core_type x0)

and copy_attributes :
  From.Parsetree.attributes -> To.Parsetree.attributes =
  fun x  -> List.map copy_attribute x

and copy_attribute :
  From.Parsetree.attribute -> To.Parsetree.attribute =
  fun x  ->
    let (x0,x1) = x  in
    ((copy_loc (fun x  -> x) x0),
      (copy_payload x1))

and copy_payload :
  From.Parsetree.payload -> To.Parsetree.payload =
  function
  | From.Parsetree.PStr x0 ->
      To.Parsetree.PStr (copy_structure x0)
  | From.Parsetree.PSig x0 ->
      To.Parsetree.PSig (copy_signature x0)
  | From.Parsetree.PTyp x0 ->
      To.Parsetree.PTyp (copy_core_type x0)
  | From.Parsetree.PPat (x0,x1) ->
      To.Parsetree.PPat
        ((copy_pattern x0),
          (copy_option copy_expression x1))

and copy_structure :
  From.Parsetree.structure -> To.Parsetree.structure =
  fun x  -> List.map copy_structure_item x

and copy_structure_item :
  From.Parsetree.structure_item -> To.Parsetree.structure_item =
  fun
    { From.Parsetree.pstr_desc = pstr_desc;
      From.Parsetree.pstr_loc = pstr_loc }
     ->
    {
      To.Parsetree.pstr_desc =
        (copy_structure_item_desc pstr_desc);
      To.Parsetree.pstr_loc = (copy_location pstr_loc)
    }

and copy_structure_item_desc :
  From.Parsetree.structure_item_desc ->
    To.Parsetree.structure_item_desc
  =
  function
  | From.Parsetree.Pstr_eval (x0,x1) ->
      To.Parsetree.Pstr_eval
        ((copy_expression x0),
          (copy_attributes x1))
  | From.Parsetree.Pstr_value (x0,x1) ->
      To.Parsetree.Pstr_value
        ((copy_rec_flag x0),
          (List.map copy_value_binding x1))
  | From.Parsetree.Pstr_primitive x0 ->
      To.Parsetree.Pstr_primitive
        (copy_value_description x0)
  | From.Parsetree.Pstr_type (x0,x1) ->
      To.Parsetree.Pstr_type
        ((copy_rec_flag x0),
          (List.map copy_type_declaration x1))
  | From.Parsetree.Pstr_typext x0 ->
      To.Parsetree.Pstr_typext
        (copy_type_extension x0)
  | From.Parsetree.Pstr_exception x0 ->
      To.Parsetree.Pstr_exception
        (copy_extension_constructor x0)
  | From.Parsetree.Pstr_module x0 ->
      To.Parsetree.Pstr_module
        (copy_module_binding x0)
  | From.Parsetree.Pstr_recmodule x0 ->
      To.Parsetree.Pstr_recmodule
        (List.map copy_module_binding x0)
  | From.Parsetree.Pstr_modtype x0 ->
      To.Parsetree.Pstr_modtype
        (copy_module_type_declaration x0)
  | From.Parsetree.Pstr_open x0 ->
      To.Parsetree.Pstr_open
        (copy_open_description x0)
  | From.Parsetree.Pstr_class x0 ->
      To.Parsetree.Pstr_class
        (List.map copy_class_declaration x0)
  | From.Parsetree.Pstr_class_type x0 ->
      To.Parsetree.Pstr_class_type
        (List.map copy_class_type_declaration x0)
  | From.Parsetree.Pstr_include x0 ->
      To.Parsetree.Pstr_include
        (copy_include_declaration x0)
  | From.Parsetree.Pstr_attribute x0 ->
      To.Parsetree.Pstr_attribute (copy_attribute x0)
  | From.Parsetree.Pstr_extension (x0,x1) ->
      To.Parsetree.Pstr_extension
        ((copy_extension x0),
          (copy_attributes x1))

and copy_include_declaration :
  From.Parsetree.include_declaration ->
    To.Parsetree.include_declaration
  =
  fun x  ->
    copy_include_infos copy_module_expr x

and copy_class_declaration :
  From.Parsetree.class_declaration -> To.Parsetree.class_declaration
  =
  fun x  ->
    copy_class_infos copy_class_expr x

and copy_class_expr :
  From.Parsetree.class_expr -> To.Parsetree.class_expr =
  fun
    { From.Parsetree.pcl_desc = pcl_desc;
      From.Parsetree.pcl_loc = pcl_loc;
      From.Parsetree.pcl_attributes = pcl_attributes }
     ->
    {
      To.Parsetree.pcl_desc =
        (copy_class_expr_desc pcl_desc);
      To.Parsetree.pcl_loc = (copy_location pcl_loc);
      To.Parsetree.pcl_attributes =
        (copy_attributes pcl_attributes)
    }

and copy_class_expr_desc :
  From.Parsetree.class_expr_desc -> To.Parsetree.class_expr_desc =
  function
  | From.Parsetree.Pcl_constr (x0,x1) ->
      To.Parsetree.Pcl_constr
        ((copy_loc copy_longident x0),
          (List.map copy_core_type x1))
  | From.Parsetree.Pcl_structure x0 ->
      To.Parsetree.Pcl_structure
        (copy_class_structure x0)
  | From.Parsetree.Pcl_fun (x0,x1,x2,x3) ->
      To.Parsetree.Pcl_fun
        ((copy_arg_label x0),
          (copy_option copy_expression x1),
          (copy_pattern x2),
          (copy_class_expr x3))
  | From.Parsetree.Pcl_apply (x0,x1) ->
      To.Parsetree.Pcl_apply
        ((copy_class_expr x0),
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                ((copy_arg_label x0),
                  (copy_expression x1))) x1))
  | From.Parsetree.Pcl_let (x0,x1,x2) ->
      To.Parsetree.Pcl_let
        ((copy_rec_flag x0),
          (List.map copy_value_binding x1),
          (copy_class_expr x2))
  | From.Parsetree.Pcl_constraint (x0,x1) ->
      To.Parsetree.Pcl_constraint
        ((copy_class_expr x0),
          (copy_class_type x1))
  | From.Parsetree.Pcl_extension x0 ->
      To.Parsetree.Pcl_extension (copy_extension x0)

and copy_class_structure :
  From.Parsetree.class_structure -> To.Parsetree.class_structure =
  fun
    { From.Parsetree.pcstr_self = pcstr_self;
      From.Parsetree.pcstr_fields = pcstr_fields }
     ->
    {
      To.Parsetree.pcstr_self =
        (copy_pattern pcstr_self);
      To.Parsetree.pcstr_fields =
        (List.map copy_class_field pcstr_fields)
    }

and copy_class_field :
  From.Parsetree.class_field -> To.Parsetree.class_field =
  fun
    { From.Parsetree.pcf_desc = pcf_desc;
      From.Parsetree.pcf_loc = pcf_loc;
      From.Parsetree.pcf_attributes = pcf_attributes }
     ->
    {
      To.Parsetree.pcf_desc =
        (copy_class_field_desc pcf_desc);
      To.Parsetree.pcf_loc = (copy_location pcf_loc);
      To.Parsetree.pcf_attributes =
        (copy_attributes pcf_attributes)
    }

and copy_class_field_desc :
  From.Parsetree.class_field_desc -> To.Parsetree.class_field_desc =
  function
  | From.Parsetree.Pcf_inherit (x0,x1,x2) ->
      To.Parsetree.Pcf_inherit
        ((copy_override_flag x0),
          (copy_class_expr x1),
          (copy_option (fun x  -> x.From.Asttypes.txt) x2))
  | From.Parsetree.Pcf_val x0 ->
      To.Parsetree.Pcf_val
        (let (x0,x1,x2) = x0  in
         ((copy_loc (fun x  -> x) x0),
           (copy_mutable_flag x1),
           (copy_class_field_kind x2)))
  | From.Parsetree.Pcf_method x0 ->
      To.Parsetree.Pcf_method
        (let (x0,x1,x2) = x0  in
         ((copy_loc (fun x  -> x) x0),
           (copy_private_flag x1),
           (copy_class_field_kind x2)))
  | From.Parsetree.Pcf_constraint x0 ->
      To.Parsetree.Pcf_constraint
        (let (x0,x1) = x0  in
         ((copy_core_type x0),
           (copy_core_type x1)))
  | From.Parsetree.Pcf_initializer x0 ->
      To.Parsetree.Pcf_initializer
        (copy_expression x0)
  | From.Parsetree.Pcf_attribute x0 ->
      To.Parsetree.Pcf_attribute (copy_attribute x0)
  | From.Parsetree.Pcf_extension x0 ->
      To.Parsetree.Pcf_extension (copy_extension x0)

and copy_class_field_kind :
  From.Parsetree.class_field_kind -> To.Parsetree.class_field_kind =
  function
  | From.Parsetree.Cfk_virtual x0 ->
      To.Parsetree.Cfk_virtual (copy_core_type x0)
  | From.Parsetree.Cfk_concrete (x0,x1) ->
      To.Parsetree.Cfk_concrete
        ((copy_override_flag x0),
          (copy_expression x1))

and copy_module_binding :
  From.Parsetree.module_binding -> To.Parsetree.module_binding =
  fun
    { From.Parsetree.pmb_name = pmb_name;
      From.Parsetree.pmb_expr = pmb_expr;
      From.Parsetree.pmb_attributes = pmb_attributes;
      From.Parsetree.pmb_loc = pmb_loc }
     ->
    {
      To.Parsetree.pmb_name =
        (copy_loc (fun x  -> x) pmb_name);
      To.Parsetree.pmb_expr =
        (copy_module_expr pmb_expr);
      To.Parsetree.pmb_attributes =
        (copy_attributes pmb_attributes);
      To.Parsetree.pmb_loc = (copy_location pmb_loc)
    }

and copy_module_expr :
  From.Parsetree.module_expr -> To.Parsetree.module_expr =
  fun
    { From.Parsetree.pmod_desc = pmod_desc;
      From.Parsetree.pmod_loc = pmod_loc;
      From.Parsetree.pmod_attributes = pmod_attributes }
     ->
    {
      To.Parsetree.pmod_desc =
        (copy_module_expr_desc pmod_desc);
      To.Parsetree.pmod_loc = (copy_location pmod_loc);
      To.Parsetree.pmod_attributes =
        (copy_attributes pmod_attributes)
    }

and copy_module_expr_desc :
  From.Parsetree.module_expr_desc -> To.Parsetree.module_expr_desc =
  function
  | From.Parsetree.Pmod_ident x0 ->
      To.Parsetree.Pmod_ident
        (copy_loc copy_longident x0)
  | From.Parsetree.Pmod_structure x0 ->
      To.Parsetree.Pmod_structure (copy_structure x0)
  | From.Parsetree.Pmod_functor (x0,x1,x2) ->
      To.Parsetree.Pmod_functor
        ((copy_loc (fun x  -> x) x0),
          (copy_option copy_module_type x1),
          (copy_module_expr x2))
  | From.Parsetree.Pmod_apply (x0,x1) ->
      To.Parsetree.Pmod_apply
        ((copy_module_expr x0),
          (copy_module_expr x1))
  | From.Parsetree.Pmod_constraint (x0,x1) ->
      To.Parsetree.Pmod_constraint
        ((copy_module_expr x0),
          (copy_module_type x1))
  | From.Parsetree.Pmod_unpack x0 ->
      To.Parsetree.Pmod_unpack (copy_expression x0)
  | From.Parsetree.Pmod_extension x0 ->
      To.Parsetree.Pmod_extension (copy_extension x0)

and copy_module_type :
  From.Parsetree.module_type -> To.Parsetree.module_type =
  fun
    { From.Parsetree.pmty_desc = pmty_desc;
      From.Parsetree.pmty_loc = pmty_loc;
      From.Parsetree.pmty_attributes = pmty_attributes }
     ->
    {
      To.Parsetree.pmty_desc =
        (copy_module_type_desc pmty_desc);
      To.Parsetree.pmty_loc = (copy_location pmty_loc);
      To.Parsetree.pmty_attributes =
        (copy_attributes pmty_attributes)
    }

and copy_module_type_desc :
  From.Parsetree.module_type_desc -> To.Parsetree.module_type_desc =
  function
  | From.Parsetree.Pmty_ident x0 ->
      To.Parsetree.Pmty_ident
        (copy_loc copy_longident x0)
  | From.Parsetree.Pmty_signature x0 ->
      To.Parsetree.Pmty_signature (copy_signature x0)
  | From.Parsetree.Pmty_functor (x0,x1,x2) ->
      To.Parsetree.Pmty_functor
        ((copy_loc (fun x  -> x) x0),
          (copy_option copy_module_type x1),
          (copy_module_type x2))
  | From.Parsetree.Pmty_with (x0,x1) ->
      To.Parsetree.Pmty_with
        ((copy_module_type x0),
          (List.map copy_with_constraint x1))
  | From.Parsetree.Pmty_typeof x0 ->
      To.Parsetree.Pmty_typeof (copy_module_expr x0)
  | From.Parsetree.Pmty_extension x0 ->
      To.Parsetree.Pmty_extension (copy_extension x0)
  | From.Parsetree.Pmty_alias x0 ->
      To.Parsetree.Pmty_alias
        (copy_loc copy_longident x0)

and copy_with_constraint :
  From.Parsetree.with_constraint -> To.Parsetree.with_constraint =
  function
  | From.Parsetree.Pwith_type (x0,x1) ->
      To.Parsetree.Pwith_type
        ((copy_loc copy_longident x0),
          (copy_type_declaration x1))
  | From.Parsetree.Pwith_module (x0,x1) ->
      To.Parsetree.Pwith_module
        ((copy_loc copy_longident x0),
          (copy_loc copy_longident x1))
  | From.Parsetree.Pwith_typesubst x0 ->
      To.Parsetree.Pwith_typesubst
        (copy_type_declaration x0)
  | From.Parsetree.Pwith_modsubst (x0,x1) ->
      To.Parsetree.Pwith_modsubst
        ((copy_loc (fun x  -> x) x0),
          (copy_loc copy_longident x1))

and copy_signature :
  From.Parsetree.signature -> To.Parsetree.signature =
  fun x  -> List.map copy_signature_item x

and copy_signature_item :
  From.Parsetree.signature_item -> To.Parsetree.signature_item =
  fun
    { From.Parsetree.psig_desc = psig_desc;
      From.Parsetree.psig_loc = psig_loc }
     ->
    {
      To.Parsetree.psig_desc =
        (copy_signature_item_desc psig_desc);
      To.Parsetree.psig_loc = (copy_location psig_loc)
    }

and copy_signature_item_desc :
  From.Parsetree.signature_item_desc ->
    To.Parsetree.signature_item_desc
  =
  function
  | From.Parsetree.Psig_value x0 ->
      To.Parsetree.Psig_value
        (copy_value_description x0)
  | From.Parsetree.Psig_type (x0,x1) ->
      To.Parsetree.Psig_type
        ((copy_rec_flag x0),
          (List.map copy_type_declaration x1))
  | From.Parsetree.Psig_typext x0 ->
      To.Parsetree.Psig_typext
        (copy_type_extension x0)
  | From.Parsetree.Psig_exception x0 ->
      To.Parsetree.Psig_exception
        (copy_extension_constructor x0)
  | From.Parsetree.Psig_module x0 ->
      To.Parsetree.Psig_module
        (copy_module_declaration x0)
  | From.Parsetree.Psig_recmodule x0 ->
      To.Parsetree.Psig_recmodule
        (List.map copy_module_declaration x0)
  | From.Parsetree.Psig_modtype x0 ->
      To.Parsetree.Psig_modtype
        (copy_module_type_declaration x0)
  | From.Parsetree.Psig_open x0 ->
      To.Parsetree.Psig_open
        (copy_open_description x0)
  | From.Parsetree.Psig_include x0 ->
      To.Parsetree.Psig_include
        (copy_include_description x0)
  | From.Parsetree.Psig_class x0 ->
      To.Parsetree.Psig_class
        (List.map copy_class_description x0)
  | From.Parsetree.Psig_class_type x0 ->
      To.Parsetree.Psig_class_type
        (List.map copy_class_type_declaration x0)
  | From.Parsetree.Psig_attribute x0 ->
      To.Parsetree.Psig_attribute (copy_attribute x0)
  | From.Parsetree.Psig_extension (x0,x1) ->
      To.Parsetree.Psig_extension
        ((copy_extension x0),
          (copy_attributes x1))

and copy_class_type_declaration :
  From.Parsetree.class_type_declaration ->
    To.Parsetree.class_type_declaration
  =
  fun x  ->
    copy_class_infos copy_class_type x

and copy_class_description :
  From.Parsetree.class_description -> To.Parsetree.class_description
  =
  fun x  ->
    copy_class_infos copy_class_type x

and copy_class_type :
  From.Parsetree.class_type -> To.Parsetree.class_type =
  fun
    { From.Parsetree.pcty_desc = pcty_desc;
      From.Parsetree.pcty_loc = pcty_loc;
      From.Parsetree.pcty_attributes = pcty_attributes }
     ->
    {
      To.Parsetree.pcty_desc =
        (copy_class_type_desc pcty_desc);
      To.Parsetree.pcty_loc = (copy_location pcty_loc);
      To.Parsetree.pcty_attributes =
        (copy_attributes pcty_attributes)
    }

and copy_class_type_desc :
  From.Parsetree.class_type_desc -> To.Parsetree.class_type_desc =
  function
  | From.Parsetree.Pcty_constr (x0,x1) ->
      To.Parsetree.Pcty_constr
        ((copy_loc copy_longident x0),
          (List.map copy_core_type x1))
  | From.Parsetree.Pcty_signature x0 ->
      To.Parsetree.Pcty_signature
        (copy_class_signature x0)
  | From.Parsetree.Pcty_arrow (x0,x1,x2) ->
      To.Parsetree.Pcty_arrow
        ((copy_arg_label x0),
          (copy_core_type x1),
          (copy_class_type x2))
  | From.Parsetree.Pcty_extension x0 ->
      To.Parsetree.Pcty_extension (copy_extension x0)

and copy_class_signature :
  From.Parsetree.class_signature -> To.Parsetree.class_signature =
  fun
    { From.Parsetree.pcsig_self = pcsig_self;
      From.Parsetree.pcsig_fields = pcsig_fields }
     ->
    {
      To.Parsetree.pcsig_self =
        (copy_core_type pcsig_self);
      To.Parsetree.pcsig_fields =
        (List.map copy_class_type_field pcsig_fields)
    }

and copy_class_type_field :
  From.Parsetree.class_type_field -> To.Parsetree.class_type_field =
  fun
    { From.Parsetree.pctf_desc = pctf_desc;
      From.Parsetree.pctf_loc = pctf_loc;
      From.Parsetree.pctf_attributes = pctf_attributes }
     ->
    {
      To.Parsetree.pctf_desc =
        (copy_class_type_field_desc pctf_desc);
      To.Parsetree.pctf_loc = (copy_location pctf_loc);
      To.Parsetree.pctf_attributes =
        (copy_attributes pctf_attributes)
    }

and copy_class_type_field_desc :
  From.Parsetree.class_type_field_desc ->
    To.Parsetree.class_type_field_desc
  =
  function
  | From.Parsetree.Pctf_inherit x0 ->
      To.Parsetree.Pctf_inherit (copy_class_type x0)
  | From.Parsetree.Pctf_val x0 ->
      To.Parsetree.Pctf_val
        (let (x0,x1,x2,x3) = x0  in
         (x0.From.Asttypes.txt, (copy_mutable_flag x1),
           (copy_virtual_flag x2),
           (copy_core_type x3)))
  | From.Parsetree.Pctf_method x0 ->
      To.Parsetree.Pctf_method
        (let (x0,x1,x2,x3) = x0  in
         (x0.From.Asttypes.txt, (copy_private_flag x1),
           (copy_virtual_flag x2),
           (copy_core_type x3)))
  | From.Parsetree.Pctf_constraint x0 ->
      To.Parsetree.Pctf_constraint
        (let (x0,x1) = x0  in
         ((copy_core_type x0),
           (copy_core_type x1)))
  | From.Parsetree.Pctf_attribute x0 ->
      To.Parsetree.Pctf_attribute (copy_attribute x0)
  | From.Parsetree.Pctf_extension x0 ->
      To.Parsetree.Pctf_extension (copy_extension x0)

and copy_extension :
  From.Parsetree.extension -> To.Parsetree.extension =
  fun x  ->
    let (x0,x1) = x  in
    ((copy_loc (fun x  -> x) x0),
      (copy_payload x1))

and copy_class_infos :
  'f0 'g0 .
    ('f0 -> 'g0) ->
      'f0 From.Parsetree.class_infos -> 'g0 To.Parsetree.class_infos
  =
  fun f0  ->
    fun
      { From.Parsetree.pci_virt = pci_virt;
        From.Parsetree.pci_params = pci_params;
        From.Parsetree.pci_name = pci_name;
        From.Parsetree.pci_expr = pci_expr;
        From.Parsetree.pci_loc = pci_loc;
        From.Parsetree.pci_attributes = pci_attributes }
       ->
      {
        To.Parsetree.pci_virt =
          (copy_virtual_flag pci_virt);
        To.Parsetree.pci_params =
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                ((copy_core_type x0),
                  (copy_variance x1))) pci_params);
        To.Parsetree.pci_name =
          (copy_loc (fun x  -> x) pci_name);
        To.Parsetree.pci_expr = (f0 pci_expr);
        To.Parsetree.pci_loc = (copy_location pci_loc);
        To.Parsetree.pci_attributes =
          (copy_attributes pci_attributes)
      }

and copy_virtual_flag :
  From.Asttypes.virtual_flag -> To.Asttypes.virtual_flag =
  function
  | From.Asttypes.Virtual  -> To.Asttypes.Virtual
  | From.Asttypes.Concrete  -> To.Asttypes.Concrete

and copy_include_description :
  From.Parsetree.include_description ->
    To.Parsetree.include_description
  =
  fun x  ->
    copy_include_infos copy_module_type x

and copy_include_infos :
  'f0 'g0 .
    ('f0 -> 'g0) ->
      'f0 From.Parsetree.include_infos ->
        'g0 To.Parsetree.include_infos
  =
  fun f0  ->
    fun
      { From.Parsetree.pincl_mod = pincl_mod;
        From.Parsetree.pincl_loc = pincl_loc;
        From.Parsetree.pincl_attributes = pincl_attributes }
       ->
      {
        To.Parsetree.pincl_mod = (f0 pincl_mod);
        To.Parsetree.pincl_loc = (copy_location pincl_loc);
        To.Parsetree.pincl_attributes =
          (copy_attributes pincl_attributes)
      }

and copy_open_description :
  From.Parsetree.open_description -> To.Parsetree.open_description =
  fun
    { From.Parsetree.popen_lid = popen_lid;
      From.Parsetree.popen_override = popen_override;
      From.Parsetree.popen_loc = popen_loc;
      From.Parsetree.popen_attributes = popen_attributes }
     ->
    {
      To.Parsetree.popen_lid =
        (copy_loc copy_longident popen_lid);
      To.Parsetree.popen_override =
        (copy_override_flag popen_override);
      To.Parsetree.popen_loc = (copy_location popen_loc);
      To.Parsetree.popen_attributes =
        (copy_attributes popen_attributes)
    }

and copy_override_flag :
  From.Asttypes.override_flag -> To.Asttypes.override_flag =
  function
  | From.Asttypes.Override  -> To.Asttypes.Override
  | From.Asttypes.Fresh  -> To.Asttypes.Fresh

and copy_module_type_declaration :
  From.Parsetree.module_type_declaration ->
    To.Parsetree.module_type_declaration
  =
  fun
    { From.Parsetree.pmtd_name = pmtd_name;
      From.Parsetree.pmtd_type = pmtd_type;
      From.Parsetree.pmtd_attributes = pmtd_attributes;
      From.Parsetree.pmtd_loc = pmtd_loc }
     ->
    {
      To.Parsetree.pmtd_name =
        (copy_loc (fun x  -> x) pmtd_name);
      To.Parsetree.pmtd_type =
        (copy_option copy_module_type pmtd_type);
      To.Parsetree.pmtd_attributes =
        (copy_attributes pmtd_attributes);
      To.Parsetree.pmtd_loc = (copy_location pmtd_loc)
    }

and copy_module_declaration :
  From.Parsetree.module_declaration ->
    To.Parsetree.module_declaration
  =
  fun
    { From.Parsetree.pmd_name = pmd_name;
      From.Parsetree.pmd_type = pmd_type;
      From.Parsetree.pmd_attributes = pmd_attributes;
      From.Parsetree.pmd_loc = pmd_loc }
     ->
    {
      To.Parsetree.pmd_name =
        (copy_loc (fun x  -> x) pmd_name);
      To.Parsetree.pmd_type =
        (copy_module_type pmd_type);
      To.Parsetree.pmd_attributes =
        (copy_attributes pmd_attributes);
      To.Parsetree.pmd_loc = (copy_location pmd_loc)
    }

and copy_type_extension :
  From.Parsetree.type_extension -> To.Parsetree.type_extension =
  fun
    { From.Parsetree.ptyext_path = ptyext_path;
      From.Parsetree.ptyext_params = ptyext_params;
      From.Parsetree.ptyext_constructors = ptyext_constructors;
      From.Parsetree.ptyext_private = ptyext_private;
      From.Parsetree.ptyext_attributes = ptyext_attributes }
     ->
    {
      To.Parsetree.ptyext_path =
        (copy_loc copy_longident ptyext_path);
      To.Parsetree.ptyext_params =
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_core_type x0),
                (copy_variance x1))) ptyext_params);
      To.Parsetree.ptyext_constructors =
        (List.map copy_extension_constructor
           ptyext_constructors);
      To.Parsetree.ptyext_private =
        (copy_private_flag ptyext_private);
      To.Parsetree.ptyext_attributes =
        (copy_attributes ptyext_attributes)
    }

and copy_extension_constructor :
  From.Parsetree.extension_constructor ->
    To.Parsetree.extension_constructor
  =
  fun
    { From.Parsetree.pext_name = pext_name;
      From.Parsetree.pext_kind = pext_kind;
      From.Parsetree.pext_loc = pext_loc;
      From.Parsetree.pext_attributes = pext_attributes }
     ->
    {
      To.Parsetree.pext_name =
        (copy_loc (fun x  -> x) pext_name);
      To.Parsetree.pext_kind =
        (copy_extension_constructor_kind pext_kind);
      To.Parsetree.pext_loc = (copy_location pext_loc);
      To.Parsetree.pext_attributes =
        (copy_attributes pext_attributes)
    }

and copy_extension_constructor_kind :
  From.Parsetree.extension_constructor_kind ->
    To.Parsetree.extension_constructor_kind
  =
  function
  | From.Parsetree.Pext_decl (x0,x1) ->
      To.Parsetree.Pext_decl
        ((copy_constructor_arguments x0),
          (copy_option copy_core_type x1))
  | From.Parsetree.Pext_rebind x0 ->
      To.Parsetree.Pext_rebind
        (copy_loc copy_longident x0)

and copy_type_declaration :
  From.Parsetree.type_declaration -> To.Parsetree.type_declaration =
  fun
    { From.Parsetree.ptype_name = ptype_name;
      From.Parsetree.ptype_params = ptype_params;
      From.Parsetree.ptype_cstrs = ptype_cstrs;
      From.Parsetree.ptype_kind = ptype_kind;
      From.Parsetree.ptype_private = ptype_private;
      From.Parsetree.ptype_manifest = ptype_manifest;
      From.Parsetree.ptype_attributes = ptype_attributes;
      From.Parsetree.ptype_loc = ptype_loc }
     ->
    {
      To.Parsetree.ptype_name =
        (copy_loc (fun x  -> x) ptype_name);
      To.Parsetree.ptype_params =
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_core_type x0),
                (copy_variance x1))) ptype_params);
      To.Parsetree.ptype_cstrs =
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              ((copy_core_type x0),
                (copy_core_type x1),
                (copy_location x2))) ptype_cstrs);
      To.Parsetree.ptype_kind =
        (copy_type_kind ptype_kind);
      To.Parsetree.ptype_private =
        (copy_private_flag ptype_private);
      To.Parsetree.ptype_manifest =
        (copy_option copy_core_type ptype_manifest);
      To.Parsetree.ptype_attributes =
        (copy_attributes ptype_attributes);
      To.Parsetree.ptype_loc = (copy_location ptype_loc)
    }

and copy_private_flag :
  From.Asttypes.private_flag -> To.Asttypes.private_flag =
  function
  | From.Asttypes.Private  -> To.Asttypes.Private
  | From.Asttypes.Public  -> To.Asttypes.Public

and copy_type_kind :
  From.Parsetree.type_kind -> To.Parsetree.type_kind =
  function
  | From.Parsetree.Ptype_abstract  -> To.Parsetree.Ptype_abstract
  | From.Parsetree.Ptype_variant x0 ->
      To.Parsetree.Ptype_variant
        (List.map copy_constructor_declaration x0)
  | From.Parsetree.Ptype_record x0 ->
      To.Parsetree.Ptype_record
        (List.map copy_label_declaration x0)
  | From.Parsetree.Ptype_open  -> To.Parsetree.Ptype_open

and copy_constructor_declaration :
  From.Parsetree.constructor_declaration ->
    To.Parsetree.constructor_declaration
  =
  fun
    { From.Parsetree.pcd_name = pcd_name;
      From.Parsetree.pcd_args = pcd_args;
      From.Parsetree.pcd_res = pcd_res;
      From.Parsetree.pcd_loc = pcd_loc;
      From.Parsetree.pcd_attributes = pcd_attributes }
     ->
    {
      To.Parsetree.pcd_name =
        (copy_loc (fun x  -> x) pcd_name);
      To.Parsetree.pcd_args =
        (copy_constructor_arguments pcd_args);
      To.Parsetree.pcd_res =
        (copy_option copy_core_type pcd_res);
      To.Parsetree.pcd_loc = (copy_location pcd_loc);
      To.Parsetree.pcd_attributes =
        (copy_attributes pcd_attributes)
    }

and copy_constructor_arguments :
  From.Parsetree.constructor_arguments ->
    To.Parsetree.constructor_arguments
  =
  function
  | From.Parsetree.Pcstr_tuple x0 ->
      To.Parsetree.Pcstr_tuple
        (List.map copy_core_type x0)
  | From.Parsetree.Pcstr_record x0 ->
      To.Parsetree.Pcstr_record
        (List.map copy_label_declaration x0)

and copy_label_declaration :
  From.Parsetree.label_declaration -> To.Parsetree.label_declaration
  =
  fun
    { From.Parsetree.pld_name = pld_name;
      From.Parsetree.pld_mutable = pld_mutable;
      From.Parsetree.pld_type = pld_type;
      From.Parsetree.pld_loc = pld_loc;
      From.Parsetree.pld_attributes = pld_attributes }
     ->
    {
      To.Parsetree.pld_name =
        (copy_loc (fun x  -> x) pld_name);
      To.Parsetree.pld_mutable =
        (copy_mutable_flag pld_mutable);
      To.Parsetree.pld_type =
        (copy_core_type pld_type);
      To.Parsetree.pld_loc = (copy_location pld_loc);
      To.Parsetree.pld_attributes =
        (copy_attributes pld_attributes)
    }

and copy_mutable_flag :
  From.Asttypes.mutable_flag -> To.Asttypes.mutable_flag =
  function
  | From.Asttypes.Immutable  -> To.Asttypes.Immutable
  | From.Asttypes.Mutable  -> To.Asttypes.Mutable

and copy_variance :
  From.Asttypes.variance -> To.Asttypes.variance =
  function
  | From.Asttypes.Covariant  -> To.Asttypes.Covariant
  | From.Asttypes.Contravariant  -> To.Asttypes.Contravariant
  | From.Asttypes.Invariant  -> To.Asttypes.Invariant

and copy_value_description :
  From.Parsetree.value_description -> To.Parsetree.value_description
  =
  fun
    { From.Parsetree.pval_name = pval_name;
      From.Parsetree.pval_type = pval_type;
      From.Parsetree.pval_prim = pval_prim;
      From.Parsetree.pval_attributes = pval_attributes;
      From.Parsetree.pval_loc = pval_loc }
     ->
    {
      To.Parsetree.pval_name =
        (copy_loc (fun x  -> x) pval_name);
      To.Parsetree.pval_type =
        (copy_core_type pval_type);
      To.Parsetree.pval_prim = (List.map (fun x  -> x) pval_prim);
      To.Parsetree.pval_attributes =
        (copy_attributes pval_attributes);
      To.Parsetree.pval_loc = (copy_location pval_loc)
    }

and copy_arg_label :
  From.Asttypes.arg_label -> To.Asttypes.arg_label =
  function
  | From.Asttypes.Nolabel  -> To.Asttypes.Nolabel
  | From.Asttypes.Labelled x0 -> To.Asttypes.Labelled x0
  | From.Asttypes.Optional x0 -> To.Asttypes.Optional x0

and copy_closed_flag :
  From.Asttypes.closed_flag -> To.Asttypes.closed_flag =
  function
  | From.Asttypes.Closed  -> To.Asttypes.Closed
  | From.Asttypes.Open  -> To.Asttypes.Open

and copy_label :
  From.Asttypes.label -> To.Asttypes.label = fun x  -> x

and copy_rec_flag :
  From.Asttypes.rec_flag -> To.Asttypes.rec_flag =
  function
  | From.Asttypes.Nonrecursive  -> To.Asttypes.Nonrecursive
  | From.Asttypes.Recursive  -> To.Asttypes.Recursive

and copy_constant :
  From.Parsetree.constant -> To.Parsetree.constant =
  function
  | From.Parsetree.Pconst_integer (x0,x1) ->
      To.Parsetree.Pconst_integer (x0, (copy_option (fun x  -> x) x1))
  | From.Parsetree.Pconst_char x0 -> To.Parsetree.Pconst_char x0
  | From.Parsetree.Pconst_string (x0,x1) ->
      To.Parsetree.Pconst_string (x0, (copy_option (fun x  -> x) x1))
  | From.Parsetree.Pconst_float (x0,x1) ->
      To.Parsetree.Pconst_float (x0, (copy_option (fun x  -> x) x1))

and copy_option : 'f0 'g0 . ('f0 -> 'g0) -> 'f0 option -> 'g0 option =
  fun f0  -> function | None  -> None | Some x0 -> Some (f0 x0)

and copy_longident : From.Longident.t -> To.Longident.t =
  function
  | From.Longident.Lident x0 -> To.Longident.Lident x0
  | From.Longident.Ldot (x0,x1) ->
      To.Longident.Ldot ((copy_longident x0), x1)
  | From.Longident.Lapply (x0,x1) ->
      To.Longident.Lapply
        ((copy_longident x0), (copy_longident x1))

and copy_loc :
  'f0 'g0 .
    ('f0 -> 'g0) -> 'f0 From.Asttypes.loc -> 'g0 To.Asttypes.loc
  =
  fun f0  ->
    fun { From.Asttypes.txt = txt; From.Asttypes.loc = loc }  ->
      {
        To.Asttypes.txt = (f0 txt);
        To.Asttypes.loc = (copy_location loc)
      }

and copy_location : From.Location.t -> To.Location.t =
  fun
    { From.Location.loc_start = loc_start;
      From.Location.loc_end = loc_end;
      From.Location.loc_ghost = loc_ghost }
     ->
    {
      To.Location.loc_start = (copy_Lexing_position loc_start);
      To.Location.loc_end = (copy_Lexing_position loc_end);
      To.Location.loc_ghost = (copy_bool loc_ghost)
    }

and copy_bool : bool -> bool = function | false  -> false | true  -> true

and copy_Lexing_position : Lexing.position -> Lexing.position =
  fun
    { Lexing.pos_fname = pos_fname; Lexing.pos_lnum = pos_lnum;
      Lexing.pos_bol = pos_bol; Lexing.pos_cnum = pos_cnum }
     ->
    {
      Lexing.pos_fname = pos_fname;
      Lexing.pos_lnum = pos_lnum;
      Lexing.pos_bol = pos_bol;
      Lexing.pos_cnum = pos_cnum
    }

let rec copy_out_phrase :
  From.Outcometree.out_phrase -> To.Outcometree.out_phrase =
  function
  | From.Outcometree.Ophr_eval (x0,x1) ->
      To.Outcometree.Ophr_eval
        ((copy_out_value x0),
          (copy_out_type x1))
  | From.Outcometree.Ophr_signature x0 ->
      To.Outcometree.Ophr_signature
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_out_sig_item x0),
                (copy_option copy_out_value x1))) x0)
  | From.Outcometree.Ophr_exception x0 ->
      To.Outcometree.Ophr_exception
        (let (x0,x1) = x0  in
         ((copy_exn x0), (copy_out_value x1)))

and copy_exn : exn -> exn = fun x  -> x

and copy_out_sig_item :
  From.Outcometree.out_sig_item -> To.Outcometree.out_sig_item =
  function
  | From.Outcometree.Osig_class (x0,x1,x2,x3,x4) ->
      To.Outcometree.Osig_class
        ((copy_bool x0), x1,
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                (x0, (let (x0,x1) = x1  in ((copy_bool x0), (copy_bool x1)))))
             x2), (copy_out_class_type x3),
          (copy_out_rec_status x4))
  | From.Outcometree.Osig_class_type (x0,x1,x2,x3,x4) ->
      To.Outcometree.Osig_class_type
        ((copy_bool x0), x1,
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                (x0, (let (x0,x1) = x1  in ((copy_bool x0), (copy_bool x1)))))
             x2), (copy_out_class_type x3),
          (copy_out_rec_status x4))
  | From.Outcometree.Osig_typext (x0,x1) ->
      To.Outcometree.Osig_typext
        ((copy_out_extension_constructor x0),
          (copy_out_ext_status x1))
  | From.Outcometree.Osig_modtype (x0,x1) ->
      To.Outcometree.Osig_modtype
        (x0, (copy_out_module_type x1))
  | From.Outcometree.Osig_module (x0,x1,x2) ->
      To.Outcometree.Osig_module
        (x0, (copy_out_module_type x1),
          (copy_out_rec_status x2))
  | From.Outcometree.Osig_type (x0,x1) ->
      To.Outcometree.Osig_type
        ((copy_out_type_decl x0),
          (copy_out_rec_status x1))
  | From.Outcometree.Osig_value x0 ->
      To.Outcometree.Osig_value
        (copy_out_val_decl x0)
  | From.Outcometree.Osig_ellipsis  -> To.Outcometree.Osig_ellipsis

and copy_out_val_decl :
  From.Outcometree.out_val_decl -> To.Outcometree.out_val_decl =
  fun
    { From.Outcometree.oval_name = oval_name;
      From.Outcometree.oval_type = oval_type;
      From.Outcometree.oval_prims = oval_prims;
      From.Outcometree.oval_attributes = oval_attributes }
     ->
    {
      To.Outcometree.oval_name = oval_name;
      To.Outcometree.oval_type =
        (copy_out_type oval_type);
      To.Outcometree.oval_prims = (List.map (fun x  -> x) oval_prims);
      To.Outcometree.oval_attributes =
        (List.map copy_out_attribute oval_attributes)
    }

and copy_out_type_decl :
  From.Outcometree.out_type_decl -> To.Outcometree.out_type_decl =
  fun
    { From.Outcometree.otype_name = otype_name;
      From.Outcometree.otype_params = otype_params;
      From.Outcometree.otype_type = otype_type;
      From.Outcometree.otype_private = otype_private;
      From.Outcometree.otype_immediate = otype_immediate;
      From.Outcometree.otype_unboxed = otype_unboxed;
      From.Outcometree.otype_cstrs = otype_cstrs }
     ->
    {
      To.Outcometree.otype_name = otype_name;
      To.Outcometree.otype_params =
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              (x0, (let (x0,x1) = x1  in ((copy_bool x0), (copy_bool x1)))))
           otype_params);
      To.Outcometree.otype_type =
        (copy_out_type otype_type);
      To.Outcometree.otype_private =
        (copy_From_Asttypes_private_flag otype_private);
      To.Outcometree.otype_immediate = (copy_bool otype_immediate);
      To.Outcometree.otype_unboxed = (copy_bool otype_unboxed);
      To.Outcometree.otype_cstrs =
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_out_type x0),
                (copy_out_type x1))) otype_cstrs)
    }

and copy_out_module_type :
  From.Outcometree.out_module_type -> To.Outcometree.out_module_type
  =
  function
  | From.Outcometree.Omty_abstract  -> To.Outcometree.Omty_abstract
  | From.Outcometree.Omty_functor (x0,x1,x2) ->
      To.Outcometree.Omty_functor
        (x0, (copy_option copy_out_module_type x1),
          (copy_out_module_type x2))
  | From.Outcometree.Omty_ident x0 ->
      To.Outcometree.Omty_ident (copy_out_ident x0)
  | From.Outcometree.Omty_signature x0 ->
      To.Outcometree.Omty_signature
        (List.map copy_out_sig_item x0)
  | From.Outcometree.Omty_alias x0 ->
      To.Outcometree.Omty_alias (copy_out_ident x0)

and copy_out_ext_status :
  From.Outcometree.out_ext_status -> To.Outcometree.out_ext_status =
  function
  | From.Outcometree.Oext_first  -> To.Outcometree.Oext_first
  | From.Outcometree.Oext_next  -> To.Outcometree.Oext_next
  | From.Outcometree.Oext_exception  -> To.Outcometree.Oext_exception

and copy_out_extension_constructor :
  From.Outcometree.out_extension_constructor ->
    To.Outcometree.out_extension_constructor
  =
  fun
    { From.Outcometree.oext_name = oext_name;
      From.Outcometree.oext_type_name = oext_type_name;
      From.Outcometree.oext_type_params = oext_type_params;
      From.Outcometree.oext_args = oext_args;
      From.Outcometree.oext_ret_type = oext_ret_type;
      From.Outcometree.oext_private = oext_private }
     ->
    {
      To.Outcometree.oext_name = oext_name;
      To.Outcometree.oext_type_name = oext_type_name;
      To.Outcometree.oext_type_params =
        (List.map (fun x  -> x) oext_type_params);
      To.Outcometree.oext_args =
        (List.map copy_out_type oext_args);
      To.Outcometree.oext_ret_type =
        (copy_option copy_out_type oext_ret_type);
      To.Outcometree.oext_private =
        (copy_From_Asttypes_private_flag oext_private)
    }

and copy_From_Asttypes_private_flag :
  From.Asttypes.private_flag -> To.Asttypes.private_flag =
  function
  | From.Asttypes.Private  -> To.Asttypes.Private
  | From.Asttypes.Public  -> To.Asttypes.Public

and copy_out_rec_status :
  From.Outcometree.out_rec_status -> To.Outcometree.out_rec_status =
  function
  | From.Outcometree.Orec_not  -> To.Outcometree.Orec_not
  | From.Outcometree.Orec_first  -> To.Outcometree.Orec_first
  | From.Outcometree.Orec_next  -> To.Outcometree.Orec_next

and copy_out_class_type :
  From.Outcometree.out_class_type -> To.Outcometree.out_class_type =
  function
  | From.Outcometree.Octy_constr (x0,x1) ->
      To.Outcometree.Octy_constr
        ((copy_out_ident x0),
          (List.map copy_out_type x1))
  | From.Outcometree.Octy_arrow (x0,x1,x2) ->
      To.Outcometree.Octy_arrow
        (x0, (copy_out_type x1),
          (copy_out_class_type x2))
  | From.Outcometree.Octy_signature (x0,x1) ->
      To.Outcometree.Octy_signature
        ((copy_option copy_out_type x0),
          (List.map copy_out_class_sig_item x1))

and copy_out_class_sig_item :
  From.Outcometree.out_class_sig_item ->
    To.Outcometree.out_class_sig_item
  =
  function
  | From.Outcometree.Ocsg_constraint (x0,x1) ->
      To.Outcometree.Ocsg_constraint
        ((copy_out_type x0),
          (copy_out_type x1))
  | From.Outcometree.Ocsg_method (x0,x1,x2,x3) ->
      To.Outcometree.Ocsg_method
        (x0, (copy_bool x1), (copy_bool x2),
          (copy_out_type x3))
  | From.Outcometree.Ocsg_value (x0,x1,x2,x3) ->
      To.Outcometree.Ocsg_value
        (x0, (copy_bool x1), (copy_bool x2),
          (copy_out_type x3))

and copy_out_type :
  From.Outcometree.out_type -> To.Outcometree.out_type =
  function
  | From.Outcometree.Otyp_abstract  -> To.Outcometree.Otyp_abstract
  | From.Outcometree.Otyp_open  -> To.Outcometree.Otyp_open
  | From.Outcometree.Otyp_alias (x0,x1) ->
      To.Outcometree.Otyp_alias
        ((copy_out_type x0), x1)
  | From.Outcometree.Otyp_arrow (x0,x1,x2) ->
      To.Outcometree.Otyp_arrow
        (x0, (copy_out_type x1),
          (copy_out_type x2))
  | From.Outcometree.Otyp_class (x0,x1,x2) ->
      To.Outcometree.Otyp_class
        ((copy_bool x0), (copy_out_ident x1),
          (List.map copy_out_type x2))
  | From.Outcometree.Otyp_constr (x0,x1) ->
      To.Outcometree.Otyp_constr
        ((copy_out_ident x0),
          (List.map copy_out_type x1))
  | From.Outcometree.Otyp_manifest (x0,x1) ->
      To.Outcometree.Otyp_manifest
        ((copy_out_type x0),
          (copy_out_type x1))
  | From.Outcometree.Otyp_object (x0,x1) ->
      To.Outcometree.Otyp_object
        ((List.map
            (fun x  ->
               let (x0,x1) = x  in
               (x0, (copy_out_type x1))) x0),
          (copy_option copy_bool x1))
  | From.Outcometree.Otyp_record x0 ->
      To.Outcometree.Otyp_record
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              (x0, (copy_bool x1), (copy_out_type x2)))
           x0)
  | From.Outcometree.Otyp_stuff x0 -> To.Outcometree.Otyp_stuff x0
  | From.Outcometree.Otyp_sum x0 ->
      To.Outcometree.Otyp_sum
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              (x0, (List.map copy_out_type x1),
                (copy_option copy_out_type x2))) x0)
  | From.Outcometree.Otyp_tuple x0 ->
      To.Outcometree.Otyp_tuple
        (List.map copy_out_type x0)
  | From.Outcometree.Otyp_var (x0,x1) ->
      To.Outcometree.Otyp_var ((copy_bool x0), x1)
  | From.Outcometree.Otyp_variant (x0,x1,x2,x3) ->
      To.Outcometree.Otyp_variant
        ((copy_bool x0), (copy_out_variant x1),
          (copy_bool x2),
          (copy_option (fun x  -> List.map (fun x  -> x) x) x3))
  | From.Outcometree.Otyp_poly (x0,x1) ->
      To.Outcometree.Otyp_poly
        ((List.map (fun x  -> x) x0), (copy_out_type x1))
  | From.Outcometree.Otyp_module (x0,x1,x2) ->
      To.Outcometree.Otyp_module
        (x0, (List.map (fun x  -> x) x1),
          (List.map copy_out_type x2))
  | From.Outcometree.Otyp_attribute (x0,x1) ->
      To.Outcometree.Otyp_attribute
        ((copy_out_type x0),
          (copy_out_attribute x1))

and copy_out_attribute :
  From.Outcometree.out_attribute -> To.Outcometree.out_attribute =
  fun { From.Outcometree.oattr_name = oattr_name }  ->
    { To.Outcometree.oattr_name = oattr_name }

and copy_out_variant :
  From.Outcometree.out_variant -> To.Outcometree.out_variant =
  function
  | From.Outcometree.Ovar_fields x0 ->
      To.Outcometree.Ovar_fields
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              (x0, (copy_bool x1),
                (List.map copy_out_type x2))) x0)
  | From.Outcometree.Ovar_typ (From.Outcometree.Otyp_constr (id,tyl)) ->
      To.Outcometree.Ovar_name (copy_out_ident id, List.map copy_out_type tyl)
  | From.Outcometree.Ovar_typ x0 ->
      To.Outcometree.Ovar_name
        (To.Outcometree.Oide_ident "", [copy_out_type x0])

and copy_out_value :
  From.Outcometree.out_value -> To.Outcometree.out_value =
  function
  | From.Outcometree.Oval_array x0 ->
      To.Outcometree.Oval_array
        (List.map copy_out_value x0)
  | From.Outcometree.Oval_char x0 -> To.Outcometree.Oval_char x0
  | From.Outcometree.Oval_constr (x0,x1) ->
      To.Outcometree.Oval_constr
        ((copy_out_ident x0),
          (List.map copy_out_value x1))
  | From.Outcometree.Oval_ellipsis  -> To.Outcometree.Oval_ellipsis
  | From.Outcometree.Oval_float x0 ->
      To.Outcometree.Oval_float (copy_float x0)
  | From.Outcometree.Oval_int x0 -> To.Outcometree.Oval_int x0
  | From.Outcometree.Oval_int32 x0 -> To.Outcometree.Oval_int32 x0
  | From.Outcometree.Oval_int64 x0 -> To.Outcometree.Oval_int64 x0
  | From.Outcometree.Oval_nativeint x0 ->
      To.Outcometree.Oval_nativeint x0
  | From.Outcometree.Oval_list x0 ->
      To.Outcometree.Oval_list
        (List.map copy_out_value x0)
  | From.Outcometree.Oval_printer x0 ->
      To.Outcometree.Oval_printer x0
  | From.Outcometree.Oval_record x0 ->
      To.Outcometree.Oval_record
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_out_ident x0),
                (copy_out_value x1))) x0)
  | From.Outcometree.Oval_string x0 -> To.Outcometree.Oval_string x0
  | From.Outcometree.Oval_stuff x0 -> To.Outcometree.Oval_stuff x0
  | From.Outcometree.Oval_tuple x0 ->
      To.Outcometree.Oval_tuple
        (List.map copy_out_value x0)
  | From.Outcometree.Oval_variant (x0,x1) ->
      To.Outcometree.Oval_variant
        (x0, (copy_option copy_out_value x1))

and copy_float : float -> float = fun x  -> x

and copy_out_ident :
  From.Outcometree.out_ident -> To.Outcometree.out_ident =
  function
  | From.Outcometree.Oide_apply (x0,x1) ->
      To.Outcometree.Oide_apply
        ((copy_out_ident x0),
          (copy_out_ident x1))
  | From.Outcometree.Oide_dot (x0,x1) ->
      To.Outcometree.Oide_dot
        ((copy_out_ident x0), x1)
  | From.Outcometree.Oide_ident x0 -> To.Outcometree.Oide_ident x0

let rec copy_toplevel_phrase :
  From.Parsetree.toplevel_phrase -> To.Parsetree.toplevel_phrase =
  function
  | From.Parsetree.Ptop_def x0 ->
      To.Parsetree.Ptop_def (copy_structure x0)
  | From.Parsetree.Ptop_dir (x0,x1) ->
      To.Parsetree.Ptop_dir
        (x0, (copy_directive_argument x1))

and copy_directive_argument :
  From.Parsetree.directive_argument -> To.Parsetree.directive_argument =
  function
  | From.Parsetree.Pdir_none  -> To.Parsetree.Pdir_none
  | From.Parsetree.Pdir_string x0 -> To.Parsetree.Pdir_string x0
  | From.Parsetree.Pdir_int (x0,x1) ->
      To.Parsetree.Pdir_int (x0, (copy_option (fun x  -> x) x1))
  | From.Parsetree.Pdir_ident x0 ->
      To.Parsetree.Pdir_ident (copy_longident x0)
  | From.Parsetree.Pdir_bool x0 ->
      To.Parsetree.Pdir_bool (copy_bool x0)

let copy_out_type_extension :
  From.Outcometree.out_type_extension -> To.Outcometree.out_type_extension =
  fun
    { From.Outcometree.otyext_name = otyext_name;
      From.Outcometree.otyext_params = otyext_params;
      From.Outcometree.otyext_constructors = otyext_constructors;
      From.Outcometree.otyext_private = otyext_private }
     ->
    {
      To.Outcometree.otyext_name = otyext_name;
      To.Outcometree.otyext_params =
        (List.map (fun x  -> x) otyext_params);
      To.Outcometree.otyext_constructors =
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              (x0, (List.map copy_out_type x1),
                (copy_option copy_out_type x2)))
           otyext_constructors);
      To.Outcometree.otyext_private =
        (copy_private_flag otyext_private)
    }

let copy_cases x = List.map copy_case x
let copy_pat = copy_pattern
let copy_expr = copy_expression
let copy_typ = copy_core_type

end
module Migrate_parsetree_404_405
= struct
#1 "migrate_parsetree_404_405.ml"
# 1 "src/migrate_parsetree_404_405.ml"
(**************************************************************************)
(*                                                                        *)
(*                         OCaml Migrate Parsetree                        *)
(*                                                                        *)
(*                             Frédéric Bour                              *)
(*                                                                        *)
(*   Copyright 2017 Institut National de Recherche en Informatique et     *)
(*     en Automatique (INRIA).                                            *)
(*                                                                        *)
(*   All rights reserved.  This file is distributed under the terms of    *)
(*   the GNU Lesser General Public License version 2.1, with the          *)
(*   special exception on linking described in the file LICENSE.          *)
(*                                                                        *)
(**************************************************************************)

include Migrate_parsetree_404_405_migrate

(*$ open Printf
    let fields = [
      "attribute"; "attributes"; "case"; "cases"; "class_declaration";
      "class_description"; "class_expr"; "class_field"; "class_signature";
      "class_structure"; "class_type"; "class_type_declaration";
      "class_type_field"; "constructor_declaration"; "expr"; "extension";
      "extension_constructor"; "include_declaration"; "include_description";
      "label_declaration"; "location"; "module_binding"; "module_declaration";
      "module_expr"; "module_type"; "module_type_declaration";
      "open_description"; "pat"; "signature"; "signature_item"; "structure";
      "structure_item"; "typ"; "type_declaration"; "type_extension";
      "type_kind"; "value_binding"; "value_description";
      "with_constraint"; "payload"
    ]
  let foreach_field f =
    printf "\n";
    List.iter f fields
*)(*$*)

let copy_mapper = fun
  ({ From.Ast_mapper.
     (*$ foreach_field (printf "%s;\n")*)
     attribute;
     attributes;
     case;
     cases;
     class_declaration;
     class_description;
     class_expr;
     class_field;
     class_signature;
     class_structure;
     class_type;
     class_type_declaration;
     class_type_field;
     constructor_declaration;
     expr;
     extension;
     extension_constructor;
     include_declaration;
     include_description;
     label_declaration;
     location;
     module_binding;
     module_declaration;
     module_expr;
     module_type;
     module_type_declaration;
     open_description;
     pat;
     signature;
     signature_item;
     structure;
     structure_item;
     typ;
     type_declaration;
     type_extension;
     type_kind;
     value_binding;
     value_description;
     with_constraint;
     payload;
     (*$*)
   } as mapper) ->
  let module R = Migrate_parsetree_405_404_migrate in
  {
    To.Ast_mapper.
    (*$ foreach_field (fun s ->
          printf
          "%s = (fun _ x -> copy_%s (%s mapper (R.copy_%s x)));\n" s s s s)
    *)
    attribute = (fun _ x -> copy_attribute (attribute mapper (R.copy_attribute x)));
    attributes = (fun _ x -> copy_attributes (attributes mapper (R.copy_attributes x)));
    case = (fun _ x -> copy_case (case mapper (R.copy_case x)));
    cases = (fun _ x -> copy_cases (cases mapper (R.copy_cases x)));
    class_declaration = (fun _ x -> copy_class_declaration (class_declaration mapper (R.copy_class_declaration x)));
    class_description = (fun _ x -> copy_class_description (class_description mapper (R.copy_class_description x)));
    class_expr = (fun _ x -> copy_class_expr (class_expr mapper (R.copy_class_expr x)));
    class_field = (fun _ x -> copy_class_field (class_field mapper (R.copy_class_field x)));
    class_signature = (fun _ x -> copy_class_signature (class_signature mapper (R.copy_class_signature x)));
    class_structure = (fun _ x -> copy_class_structure (class_structure mapper (R.copy_class_structure x)));
    class_type = (fun _ x -> copy_class_type (class_type mapper (R.copy_class_type x)));
    class_type_declaration = (fun _ x -> copy_class_type_declaration (class_type_declaration mapper (R.copy_class_type_declaration x)));
    class_type_field = (fun _ x -> copy_class_type_field (class_type_field mapper (R.copy_class_type_field x)));
    constructor_declaration = (fun _ x -> copy_constructor_declaration (constructor_declaration mapper (R.copy_constructor_declaration x)));
    expr = (fun _ x -> copy_expr (expr mapper (R.copy_expr x)));
    extension = (fun _ x -> copy_extension (extension mapper (R.copy_extension x)));
    extension_constructor = (fun _ x -> copy_extension_constructor (extension_constructor mapper (R.copy_extension_constructor x)));
    include_declaration = (fun _ x -> copy_include_declaration (include_declaration mapper (R.copy_include_declaration x)));
    include_description = (fun _ x -> copy_include_description (include_description mapper (R.copy_include_description x)));
    label_declaration = (fun _ x -> copy_label_declaration (label_declaration mapper (R.copy_label_declaration x)));
    location = (fun _ x -> copy_location (location mapper (R.copy_location x)));
    module_binding = (fun _ x -> copy_module_binding (module_binding mapper (R.copy_module_binding x)));
    module_declaration = (fun _ x -> copy_module_declaration (module_declaration mapper (R.copy_module_declaration x)));
    module_expr = (fun _ x -> copy_module_expr (module_expr mapper (R.copy_module_expr x)));
    module_type = (fun _ x -> copy_module_type (module_type mapper (R.copy_module_type x)));
    module_type_declaration = (fun _ x -> copy_module_type_declaration (module_type_declaration mapper (R.copy_module_type_declaration x)));
    open_description = (fun _ x -> copy_open_description (open_description mapper (R.copy_open_description x)));
    pat = (fun _ x -> copy_pat (pat mapper (R.copy_pat x)));
    signature = (fun _ x -> copy_signature (signature mapper (R.copy_signature x)));
    signature_item = (fun _ x -> copy_signature_item (signature_item mapper (R.copy_signature_item x)));
    structure = (fun _ x -> copy_structure (structure mapper (R.copy_structure x)));
    structure_item = (fun _ x -> copy_structure_item (structure_item mapper (R.copy_structure_item x)));
    typ = (fun _ x -> copy_typ (typ mapper (R.copy_typ x)));
    type_declaration = (fun _ x -> copy_type_declaration (type_declaration mapper (R.copy_type_declaration x)));
    type_extension = (fun _ x -> copy_type_extension (type_extension mapper (R.copy_type_extension x)));
    type_kind = (fun _ x -> copy_type_kind (type_kind mapper (R.copy_type_kind x)));
    value_binding = (fun _ x -> copy_value_binding (value_binding mapper (R.copy_value_binding x)));
    value_description = (fun _ x -> copy_value_description (value_description mapper (R.copy_value_description x)));
    with_constraint = (fun _ x -> copy_with_constraint (with_constraint mapper (R.copy_with_constraint x)));
    payload = (fun _ x -> copy_payload (payload mapper (R.copy_payload x)));
    (*$*)
  }

end
module Migrate_parsetree_405_404
= struct
#1 "migrate_parsetree_405_404.ml"
# 1 "src/migrate_parsetree_405_404.ml"
(**************************************************************************)
(*                                                                        *)
(*                         OCaml Migrate Parsetree                        *)
(*                                                                        *)
(*                             Frédéric Bour                              *)
(*                                                                        *)
(*   Copyright 2017 Institut National de Recherche en Informatique et     *)
(*     en Automatique (INRIA).                                            *)
(*                                                                        *)
(*   All rights reserved.  This file is distributed under the terms of    *)
(*   the GNU Lesser General Public License version 2.1, with the          *)
(*   special exception on linking described in the file LICENSE.          *)
(*                                                                        *)
(**************************************************************************)

include Migrate_parsetree_405_404_migrate

(*$ open Printf
    let fields = [
      "attribute"; "attributes"; "case"; "cases"; "class_declaration";
      "class_description"; "class_expr"; "class_field"; "class_signature";
      "class_structure"; "class_type"; "class_type_declaration";
      "class_type_field"; "constructor_declaration"; "expr"; "extension";
      "extension_constructor"; "include_declaration"; "include_description";
      "label_declaration"; "location"; "module_binding"; "module_declaration";
      "module_expr"; "module_type"; "module_type_declaration";
      "open_description"; "pat"; "signature"; "signature_item"; "structure";
      "structure_item"; "typ"; "type_declaration"; "type_extension";
      "type_kind"; "value_binding"; "value_description";
      "with_constraint"; "payload"
    ]
  let foreach_field f =
    printf "\n";
    List.iter f fields
*)(*$*)

let copy_mapper = fun
  ({ From.Ast_mapper.
     (*$ foreach_field (printf "%s;\n")*)
     attribute;
     attributes;
     case;
     cases;
     class_declaration;
     class_description;
     class_expr;
     class_field;
     class_signature;
     class_structure;
     class_type;
     class_type_declaration;
     class_type_field;
     constructor_declaration;
     expr;
     extension;
     extension_constructor;
     include_declaration;
     include_description;
     label_declaration;
     location;
     module_binding;
     module_declaration;
     module_expr;
     module_type;
     module_type_declaration;
     open_description;
     pat;
     signature;
     signature_item;
     structure;
     structure_item;
     typ;
     type_declaration;
     type_extension;
     type_kind;
     value_binding;
     value_description;
     with_constraint;
     payload;
     (*$*)
   } as mapper) ->
  let module R = Migrate_parsetree_404_405_migrate in
  {
    To.Ast_mapper.
    (*$ foreach_field (fun s ->
          printf
          "%s = (fun _ x -> copy_%s (%s mapper (R.copy_%s x)));\n" s s s s)
    *)
    attribute = (fun _ x -> copy_attribute (attribute mapper (R.copy_attribute x)));
    attributes = (fun _ x -> copy_attributes (attributes mapper (R.copy_attributes x)));
    case = (fun _ x -> copy_case (case mapper (R.copy_case x)));
    cases = (fun _ x -> copy_cases (cases mapper (R.copy_cases x)));
    class_declaration = (fun _ x -> copy_class_declaration (class_declaration mapper (R.copy_class_declaration x)));
    class_description = (fun _ x -> copy_class_description (class_description mapper (R.copy_class_description x)));
    class_expr = (fun _ x -> copy_class_expr (class_expr mapper (R.copy_class_expr x)));
    class_field = (fun _ x -> copy_class_field (class_field mapper (R.copy_class_field x)));
    class_signature = (fun _ x -> copy_class_signature (class_signature mapper (R.copy_class_signature x)));
    class_structure = (fun _ x -> copy_class_structure (class_structure mapper (R.copy_class_structure x)));
    class_type = (fun _ x -> copy_class_type (class_type mapper (R.copy_class_type x)));
    class_type_declaration = (fun _ x -> copy_class_type_declaration (class_type_declaration mapper (R.copy_class_type_declaration x)));
    class_type_field = (fun _ x -> copy_class_type_field (class_type_field mapper (R.copy_class_type_field x)));
    constructor_declaration = (fun _ x -> copy_constructor_declaration (constructor_declaration mapper (R.copy_constructor_declaration x)));
    expr = (fun _ x -> copy_expr (expr mapper (R.copy_expr x)));
    extension = (fun _ x -> copy_extension (extension mapper (R.copy_extension x)));
    extension_constructor = (fun _ x -> copy_extension_constructor (extension_constructor mapper (R.copy_extension_constructor x)));
    include_declaration = (fun _ x -> copy_include_declaration (include_declaration mapper (R.copy_include_declaration x)));
    include_description = (fun _ x -> copy_include_description (include_description mapper (R.copy_include_description x)));
    label_declaration = (fun _ x -> copy_label_declaration (label_declaration mapper (R.copy_label_declaration x)));
    location = (fun _ x -> copy_location (location mapper (R.copy_location x)));
    module_binding = (fun _ x -> copy_module_binding (module_binding mapper (R.copy_module_binding x)));
    module_declaration = (fun _ x -> copy_module_declaration (module_declaration mapper (R.copy_module_declaration x)));
    module_expr = (fun _ x -> copy_module_expr (module_expr mapper (R.copy_module_expr x)));
    module_type = (fun _ x -> copy_module_type (module_type mapper (R.copy_module_type x)));
    module_type_declaration = (fun _ x -> copy_module_type_declaration (module_type_declaration mapper (R.copy_module_type_declaration x)));
    open_description = (fun _ x -> copy_open_description (open_description mapper (R.copy_open_description x)));
    pat = (fun _ x -> copy_pat (pat mapper (R.copy_pat x)));
    signature = (fun _ x -> copy_signature (signature mapper (R.copy_signature x)));
    signature_item = (fun _ x -> copy_signature_item (signature_item mapper (R.copy_signature_item x)));
    structure = (fun _ x -> copy_structure (structure mapper (R.copy_structure x)));
    structure_item = (fun _ x -> copy_structure_item (structure_item mapper (R.copy_structure_item x)));
    typ = (fun _ x -> copy_typ (typ mapper (R.copy_typ x)));
    type_declaration = (fun _ x -> copy_type_declaration (type_declaration mapper (R.copy_type_declaration x)));
    type_extension = (fun _ x -> copy_type_extension (type_extension mapper (R.copy_type_extension x)));
    type_kind = (fun _ x -> copy_type_kind (type_kind mapper (R.copy_type_kind x)));
    value_binding = (fun _ x -> copy_value_binding (value_binding mapper (R.copy_value_binding x)));
    value_description = (fun _ x -> copy_value_description (value_description mapper (R.copy_value_description x)));
    with_constraint = (fun _ x -> copy_with_constraint (with_constraint mapper (R.copy_with_constraint x)));
    payload = (fun _ x -> copy_payload (payload mapper (R.copy_payload x)));
    (*$*)
  }

end
module Migrate_parsetree_405_406_migrate
= struct
#1 "migrate_parsetree_405_406_migrate.ml"
# 1 "src/migrate_parsetree_405_406_migrate.ml"
(**************************************************************************)
(*                                                                        *)
(*                         OCaml Migrate Parsetree                        *)
(*                                                                        *)
(*                             Frédéric Bour                              *)
(*                         Alain Frisch, LexiFi                           *)
(*                                                                        *)
(*   Copyright 2017 Institut National de Recherche en Informatique et     *)
(*     en Automatique (INRIA).                                            *)
(*                                                                        *)
(*   All rights reserved.  This file is distributed under the terms of    *)
(*   the GNU Lesser General Public License version 2.1, with the          *)
(*   special exception on linking described in the file LICENSE.          *)
(*                                                                        *)
(**************************************************************************)

module From = Ast_405
module To = Ast_406

let rec copy_expression :
  From.Parsetree.expression -> To.Parsetree.expression =
  fun
    { From.Parsetree.pexp_desc = pexp_desc;
      From.Parsetree.pexp_loc = pexp_loc;
      From.Parsetree.pexp_attributes = pexp_attributes }
     ->
    {
      To.Parsetree.pexp_desc = (copy_expression_desc pexp_desc);
      To.Parsetree.pexp_loc = (copy_location pexp_loc);
      To.Parsetree.pexp_attributes = (copy_attributes pexp_attributes)
    }

and copy_expression_desc :
  From.Parsetree.expression_desc -> To.Parsetree.expression_desc =
  function
  | From.Parsetree.Pexp_ident x0 ->
      To.Parsetree.Pexp_ident
        (copy_loc copy_longident x0)
  | From.Parsetree.Pexp_constant x0 ->
      To.Parsetree.Pexp_constant (copy_constant x0)
  | From.Parsetree.Pexp_let (x0,x1,x2) ->
      To.Parsetree.Pexp_let
        ((copy_rec_flag x0),
          (List.map copy_value_binding x1),
          (copy_expression x2))
  | From.Parsetree.Pexp_function x0 ->
      To.Parsetree.Pexp_function
        (List.map copy_case x0)
  | From.Parsetree.Pexp_fun (x0,x1,x2,x3) ->
      To.Parsetree.Pexp_fun
        ((copy_arg_label x0),
          (copy_option copy_expression x1),
          (copy_pattern x2),
          (copy_expression x3))
  | From.Parsetree.Pexp_apply (x0,x1) ->
      To.Parsetree.Pexp_apply
        ((copy_expression x0),
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                ((copy_arg_label x0),
                  (copy_expression x1))) x1))
  | From.Parsetree.Pexp_match (x0,x1) ->
      To.Parsetree.Pexp_match
        ((copy_expression x0),
          (List.map copy_case x1))
  | From.Parsetree.Pexp_try (x0,x1) ->
      To.Parsetree.Pexp_try
        ((copy_expression x0),
          (List.map copy_case x1))
  | From.Parsetree.Pexp_tuple x0 ->
      To.Parsetree.Pexp_tuple
        (List.map copy_expression x0)
  | From.Parsetree.Pexp_construct (x0,x1) ->
      To.Parsetree.Pexp_construct
        ((copy_loc copy_longident x0),
          (copy_option copy_expression x1))
  | From.Parsetree.Pexp_variant (x0,x1) ->
      To.Parsetree.Pexp_variant
        ((copy_label x0),
          (copy_option copy_expression x1))
  | From.Parsetree.Pexp_record (x0,x1) ->
      To.Parsetree.Pexp_record
        ((List.map
            (fun x  ->
               let (x0,x1) = x  in
               ((copy_loc copy_longident x0),
                 (copy_expression x1))) x0),
          (copy_option copy_expression x1))
  | From.Parsetree.Pexp_field (x0,x1) ->
      To.Parsetree.Pexp_field
        ((copy_expression x0),
          (copy_loc copy_longident x1))
  | From.Parsetree.Pexp_setfield (x0,x1,x2) ->
      To.Parsetree.Pexp_setfield
        ((copy_expression x0),
          (copy_loc copy_longident x1),
          (copy_expression x2))
  | From.Parsetree.Pexp_array x0 ->
      To.Parsetree.Pexp_array
        (List.map copy_expression x0)
  | From.Parsetree.Pexp_ifthenelse (x0,x1,x2) ->
      To.Parsetree.Pexp_ifthenelse
        ((copy_expression x0),
          (copy_expression x1),
          (copy_option copy_expression x2))
  | From.Parsetree.Pexp_sequence (x0,x1) ->
      To.Parsetree.Pexp_sequence
        ((copy_expression x0),
          (copy_expression x1))
  | From.Parsetree.Pexp_while (x0,x1) ->
      To.Parsetree.Pexp_while
        ((copy_expression x0),
          (copy_expression x1))
  | From.Parsetree.Pexp_for (x0,x1,x2,x3,x4) ->
      To.Parsetree.Pexp_for
        ((copy_pattern x0),
          (copy_expression x1),
          (copy_expression x2),
          (copy_direction_flag x3),
          (copy_expression x4))
  | From.Parsetree.Pexp_constraint (x0,x1) ->
      To.Parsetree.Pexp_constraint
        ((copy_expression x0),
          (copy_core_type x1))
  | From.Parsetree.Pexp_coerce (x0,x1,x2) ->
      To.Parsetree.Pexp_coerce
        ((copy_expression x0),
          (copy_option copy_core_type x1),
          (copy_core_type x2))
  | From.Parsetree.Pexp_send (x0,x1) ->
      To.Parsetree.Pexp_send
        ((copy_expression x0), (copy_loc (fun x  -> x) x1))
  | From.Parsetree.Pexp_new x0 ->
      To.Parsetree.Pexp_new
        (copy_loc copy_longident x0)
  | From.Parsetree.Pexp_setinstvar (x0,x1) ->
      To.Parsetree.Pexp_setinstvar
        ((copy_loc (fun x  -> x) x0),
          (copy_expression x1))
  | From.Parsetree.Pexp_override x0 ->
      To.Parsetree.Pexp_override
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_loc (fun x  -> x) x0),
                (copy_expression x1))) x0)
  | From.Parsetree.Pexp_letmodule (x0,x1,x2) ->
      To.Parsetree.Pexp_letmodule
        ((copy_loc (fun x  -> x) x0),
          (copy_module_expr x1),
          (copy_expression x2))
  | From.Parsetree.Pexp_letexception (x0,x1) ->
      To.Parsetree.Pexp_letexception
        ((copy_extension_constructor x0),
          (copy_expression x1))
  | From.Parsetree.Pexp_assert x0 ->
      To.Parsetree.Pexp_assert (copy_expression x0)
  | From.Parsetree.Pexp_lazy x0 ->
      To.Parsetree.Pexp_lazy (copy_expression x0)
  | From.Parsetree.Pexp_poly (x0,x1) ->
      To.Parsetree.Pexp_poly
        ((copy_expression x0),
          (copy_option copy_core_type x1))
  | From.Parsetree.Pexp_object x0 ->
      To.Parsetree.Pexp_object
        (copy_class_structure x0)
  | From.Parsetree.Pexp_newtype (x0,x1) ->
      To.Parsetree.Pexp_newtype
        ((copy_loc (fun x  -> x) x0), (copy_expression x1))
  | From.Parsetree.Pexp_pack x0 ->
      To.Parsetree.Pexp_pack (copy_module_expr x0)
  | From.Parsetree.Pexp_open (x0,x1,x2) ->
      To.Parsetree.Pexp_open
        ((copy_override_flag x0),
          (copy_loc copy_longident x1),
          (copy_expression x2))
  | From.Parsetree.Pexp_extension x0 ->
      To.Parsetree.Pexp_extension (copy_extension x0)
  | From.Parsetree.Pexp_unreachable  -> To.Parsetree.Pexp_unreachable

and copy_direction_flag :
  From.Asttypes.direction_flag -> To.Asttypes.direction_flag =
  function
  | From.Asttypes.Upto  -> To.Asttypes.Upto
  | From.Asttypes.Downto  -> To.Asttypes.Downto

and copy_case :
  From.Parsetree.case -> To.Parsetree.case =
  fun
    { From.Parsetree.pc_lhs = pc_lhs;
      From.Parsetree.pc_guard = pc_guard;
      From.Parsetree.pc_rhs = pc_rhs }
     ->
    {
      To.Parsetree.pc_lhs = (copy_pattern pc_lhs);
      To.Parsetree.pc_guard =
        (copy_option copy_expression pc_guard);
      To.Parsetree.pc_rhs = (copy_expression pc_rhs)
    }

and copy_value_binding :
  From.Parsetree.value_binding -> To.Parsetree.value_binding =
  fun
    { From.Parsetree.pvb_pat = pvb_pat;
      From.Parsetree.pvb_expr = pvb_expr;
      From.Parsetree.pvb_attributes = pvb_attributes;
      From.Parsetree.pvb_loc = pvb_loc }
     ->
    {
      To.Parsetree.pvb_pat = (copy_pattern pvb_pat);
      To.Parsetree.pvb_expr =
        (copy_expression pvb_expr);
      To.Parsetree.pvb_attributes =
        (copy_attributes pvb_attributes);
      To.Parsetree.pvb_loc = (copy_location pvb_loc)
    }

and copy_pattern :
  From.Parsetree.pattern -> To.Parsetree.pattern =
  fun
    { From.Parsetree.ppat_desc = ppat_desc;
      From.Parsetree.ppat_loc = ppat_loc;
      From.Parsetree.ppat_attributes = ppat_attributes }
     ->
    {
      To.Parsetree.ppat_desc =
        (copy_pattern_desc ppat_desc);
      To.Parsetree.ppat_loc = (copy_location ppat_loc);
      To.Parsetree.ppat_attributes =
        (copy_attributes ppat_attributes)
    }

and copy_pattern_desc :
  From.Parsetree.pattern_desc -> To.Parsetree.pattern_desc =
  function
  | From.Parsetree.Ppat_any  -> To.Parsetree.Ppat_any
  | From.Parsetree.Ppat_var x0 ->
      To.Parsetree.Ppat_var (copy_loc (fun x  -> x) x0)
  | From.Parsetree.Ppat_alias (x0,x1) ->
      To.Parsetree.Ppat_alias
        ((copy_pattern x0),
          (copy_loc (fun x  -> x) x1))
  | From.Parsetree.Ppat_constant x0 ->
      To.Parsetree.Ppat_constant (copy_constant x0)
  | From.Parsetree.Ppat_interval (x0,x1) ->
      To.Parsetree.Ppat_interval
        ((copy_constant x0),
          (copy_constant x1))
  | From.Parsetree.Ppat_tuple x0 ->
      To.Parsetree.Ppat_tuple
        (List.map copy_pattern x0)
  | From.Parsetree.Ppat_construct (x0,x1) ->
      To.Parsetree.Ppat_construct
        ((copy_loc copy_longident x0),
          (copy_option copy_pattern x1))
  | From.Parsetree.Ppat_variant (x0,x1) ->
      To.Parsetree.Ppat_variant
        ((copy_label x0),
          (copy_option copy_pattern x1))
  | From.Parsetree.Ppat_record (x0,x1) ->
      To.Parsetree.Ppat_record
        ((List.map
            (fun x  ->
               let (x0,x1) = x  in
               ((copy_loc copy_longident x0),
                 (copy_pattern x1))) x0),
          (copy_closed_flag x1))
  | From.Parsetree.Ppat_array x0 ->
      To.Parsetree.Ppat_array
        (List.map copy_pattern x0)
  | From.Parsetree.Ppat_or (x0,x1) ->
      To.Parsetree.Ppat_or
        ((copy_pattern x0),
          (copy_pattern x1))
  | From.Parsetree.Ppat_constraint (x0,x1) ->
      To.Parsetree.Ppat_constraint
        ((copy_pattern x0),
          (copy_core_type x1))
  | From.Parsetree.Ppat_type x0 ->
      To.Parsetree.Ppat_type
        (copy_loc copy_longident x0)
  | From.Parsetree.Ppat_lazy x0 ->
      To.Parsetree.Ppat_lazy (copy_pattern x0)
  | From.Parsetree.Ppat_unpack x0 ->
      To.Parsetree.Ppat_unpack
        (copy_loc (fun x  -> x) x0)
  | From.Parsetree.Ppat_exception x0 ->
      To.Parsetree.Ppat_exception (copy_pattern x0)
  | From.Parsetree.Ppat_extension x0 ->
      To.Parsetree.Ppat_extension (copy_extension x0)
  | From.Parsetree.Ppat_open (x0,x1) ->
      To.Parsetree.Ppat_open
        ((copy_loc copy_longident x0),
          (copy_pattern x1))

and copy_core_type :
  From.Parsetree.core_type -> To.Parsetree.core_type =
  fun
    { From.Parsetree.ptyp_desc = ptyp_desc;
      From.Parsetree.ptyp_loc = ptyp_loc;
      From.Parsetree.ptyp_attributes = ptyp_attributes }
     ->
    {
      To.Parsetree.ptyp_desc =
        (copy_core_type_desc ptyp_desc);
      To.Parsetree.ptyp_loc = (copy_location ptyp_loc);
      To.Parsetree.ptyp_attributes =
        (copy_attributes ptyp_attributes)
    }

and copy_core_type_desc :
  From.Parsetree.core_type_desc -> To.Parsetree.core_type_desc =
  function
  | From.Parsetree.Ptyp_any  -> To.Parsetree.Ptyp_any
  | From.Parsetree.Ptyp_var x0 -> To.Parsetree.Ptyp_var x0
  | From.Parsetree.Ptyp_arrow (x0,x1,x2) ->
      To.Parsetree.Ptyp_arrow
        ((copy_arg_label x0),
          (copy_core_type x1),
          (copy_core_type x2))
  | From.Parsetree.Ptyp_tuple x0 ->
      To.Parsetree.Ptyp_tuple
        (List.map copy_core_type x0)
  | From.Parsetree.Ptyp_constr (x0,x1) ->
      To.Parsetree.Ptyp_constr
        ((copy_loc copy_longident x0),
          (List.map copy_core_type x1))
  | From.Parsetree.Ptyp_object (x0,x1) ->
      To.Parsetree.Ptyp_object
        ((List.map
            (fun x  ->
               let (x0,x1,x2) = x  in
               To.Parsetree.Otag
                 (copy_loc (fun x  -> x) x0, (copy_attributes x1),
                  (copy_core_type x2))) x0),
          (copy_closed_flag x1))
  | From.Parsetree.Ptyp_class (x0,x1) ->
      To.Parsetree.Ptyp_class
        ((copy_loc copy_longident x0),
          (List.map copy_core_type x1))
  | From.Parsetree.Ptyp_alias (x0,x1) ->
      To.Parsetree.Ptyp_alias
        ((copy_core_type x0), x1)
  | From.Parsetree.Ptyp_variant (x0,x1,x2) ->
      To.Parsetree.Ptyp_variant
        ((List.map copy_row_field x0),
          (copy_closed_flag x1),
          (copy_option (fun x  -> List.map copy_label x) x2))
  | From.Parsetree.Ptyp_poly (x0,x1) ->
      To.Parsetree.Ptyp_poly
        ((List.map (fun x  -> copy_loc (fun x  -> x) x) x0), (copy_core_type x1))
  | From.Parsetree.Ptyp_package x0 ->
      To.Parsetree.Ptyp_package (copy_package_type x0)
  | From.Parsetree.Ptyp_extension x0 ->
      To.Parsetree.Ptyp_extension (copy_extension x0)

and copy_package_type :
  From.Parsetree.package_type -> To.Parsetree.package_type =
  fun x  ->
    let (x0,x1) = x  in
    ((copy_loc copy_longident x0),
      (List.map
         (fun x  ->
            let (x0,x1) = x  in
            ((copy_loc copy_longident x0),
              (copy_core_type x1))) x1))

and copy_row_field :
  From.Parsetree.row_field -> To.Parsetree.row_field =
  function
  | From.Parsetree.Rtag (x0,x1,x2,x3) ->
      To.Parsetree.Rtag
        (({ txt = copy_label x0; loc = Location.none; }),
          (copy_attributes x1), (copy_bool x2),
          (List.map copy_core_type x3))
  | From.Parsetree.Rinherit x0 ->
      To.Parsetree.Rinherit (copy_core_type x0)

and copy_attributes :
  From.Parsetree.attributes -> To.Parsetree.attributes =
  fun x  -> List.map copy_attribute x

and copy_attribute :
  From.Parsetree.attribute -> To.Parsetree.attribute =
  fun x  ->
    let (x0,x1) = x  in
    ((copy_loc (fun x  -> x) x0),
      (copy_payload x1))

and copy_payload :
  From.Parsetree.payload -> To.Parsetree.payload =
  function
  | From.Parsetree.PStr x0 ->
      To.Parsetree.PStr (copy_structure x0)
  | From.Parsetree.PSig x0 ->
      To.Parsetree.PSig (copy_signature x0)
  | From.Parsetree.PTyp x0 ->
      To.Parsetree.PTyp (copy_core_type x0)
  | From.Parsetree.PPat (x0,x1) ->
      To.Parsetree.PPat
        ((copy_pattern x0),
          (copy_option copy_expression x1))

and copy_structure :
  From.Parsetree.structure -> To.Parsetree.structure =
  fun x  -> List.map copy_structure_item x

and copy_structure_item :
  From.Parsetree.structure_item -> To.Parsetree.structure_item =
  fun
    { From.Parsetree.pstr_desc = pstr_desc;
      From.Parsetree.pstr_loc = pstr_loc }
     ->
    {
      To.Parsetree.pstr_desc =
        (copy_structure_item_desc pstr_desc);
      To.Parsetree.pstr_loc = (copy_location pstr_loc)
    }

and copy_structure_item_desc :
  From.Parsetree.structure_item_desc ->
    To.Parsetree.structure_item_desc
  =
  function
  | From.Parsetree.Pstr_eval (x0,x1) ->
      To.Parsetree.Pstr_eval
        ((copy_expression x0),
          (copy_attributes x1))
  | From.Parsetree.Pstr_value (x0,x1) ->
      To.Parsetree.Pstr_value
        ((copy_rec_flag x0),
          (List.map copy_value_binding x1))
  | From.Parsetree.Pstr_primitive x0 ->
      To.Parsetree.Pstr_primitive
        (copy_value_description x0)
  | From.Parsetree.Pstr_type (x0,x1) ->
      To.Parsetree.Pstr_type
        ((copy_rec_flag x0),
          (List.map copy_type_declaration x1))
  | From.Parsetree.Pstr_typext x0 ->
      To.Parsetree.Pstr_typext
        (copy_type_extension x0)
  | From.Parsetree.Pstr_exception x0 ->
      To.Parsetree.Pstr_exception
        (copy_extension_constructor x0)
  | From.Parsetree.Pstr_module x0 ->
      To.Parsetree.Pstr_module
        (copy_module_binding x0)
  | From.Parsetree.Pstr_recmodule x0 ->
      To.Parsetree.Pstr_recmodule
        (List.map copy_module_binding x0)
  | From.Parsetree.Pstr_modtype x0 ->
      To.Parsetree.Pstr_modtype
        (copy_module_type_declaration x0)
  | From.Parsetree.Pstr_open x0 ->
      To.Parsetree.Pstr_open
        (copy_open_description x0)
  | From.Parsetree.Pstr_class x0 ->
      To.Parsetree.Pstr_class
        (List.map copy_class_declaration x0)
  | From.Parsetree.Pstr_class_type x0 ->
      To.Parsetree.Pstr_class_type
        (List.map copy_class_type_declaration x0)
  | From.Parsetree.Pstr_include x0 ->
      To.Parsetree.Pstr_include
        (copy_include_declaration x0)
  | From.Parsetree.Pstr_attribute x0 ->
      To.Parsetree.Pstr_attribute (copy_attribute x0)
  | From.Parsetree.Pstr_extension (x0,x1) ->
      To.Parsetree.Pstr_extension
        ((copy_extension x0),
          (copy_attributes x1))

and copy_include_declaration :
  From.Parsetree.include_declaration ->
    To.Parsetree.include_declaration
  =
  fun x  ->
    copy_include_infos copy_module_expr x

and copy_class_declaration :
  From.Parsetree.class_declaration -> To.Parsetree.class_declaration
  =
  fun x  ->
    copy_class_infos copy_class_expr x

and copy_class_expr :
  From.Parsetree.class_expr -> To.Parsetree.class_expr =
  fun
    { From.Parsetree.pcl_desc = pcl_desc;
      From.Parsetree.pcl_loc = pcl_loc;
      From.Parsetree.pcl_attributes = pcl_attributes }
     ->
    {
      To.Parsetree.pcl_desc =
        (copy_class_expr_desc pcl_desc);
      To.Parsetree.pcl_loc = (copy_location pcl_loc);
      To.Parsetree.pcl_attributes =
        (copy_attributes pcl_attributes)
    }

and copy_class_expr_desc :
  From.Parsetree.class_expr_desc -> To.Parsetree.class_expr_desc =
  function
  | From.Parsetree.Pcl_constr (x0,x1) ->
      To.Parsetree.Pcl_constr
        ((copy_loc copy_longident x0),
          (List.map copy_core_type x1))
  | From.Parsetree.Pcl_structure x0 ->
      To.Parsetree.Pcl_structure
        (copy_class_structure x0)
  | From.Parsetree.Pcl_fun (x0,x1,x2,x3) ->
      To.Parsetree.Pcl_fun
        ((copy_arg_label x0),
          (copy_option copy_expression x1),
          (copy_pattern x2),
          (copy_class_expr x3))
  | From.Parsetree.Pcl_apply (x0,x1) ->
      To.Parsetree.Pcl_apply
        ((copy_class_expr x0),
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                ((copy_arg_label x0),
                  (copy_expression x1))) x1))
  | From.Parsetree.Pcl_let (x0,x1,x2) ->
      To.Parsetree.Pcl_let
        ((copy_rec_flag x0),
          (List.map copy_value_binding x1),
          (copy_class_expr x2))
  | From.Parsetree.Pcl_constraint (x0,x1) ->
      To.Parsetree.Pcl_constraint
        ((copy_class_expr x0),
          (copy_class_type x1))
  | From.Parsetree.Pcl_extension x0 ->
      To.Parsetree.Pcl_extension (copy_extension x0)

and copy_class_structure :
  From.Parsetree.class_structure -> To.Parsetree.class_structure =
  fun
    { From.Parsetree.pcstr_self = pcstr_self;
      From.Parsetree.pcstr_fields = pcstr_fields }
     ->
    {
      To.Parsetree.pcstr_self =
        (copy_pattern pcstr_self);
      To.Parsetree.pcstr_fields =
        (List.map copy_class_field pcstr_fields)
    }

and copy_class_field :
  From.Parsetree.class_field -> To.Parsetree.class_field =
  fun
    { From.Parsetree.pcf_desc = pcf_desc;
      From.Parsetree.pcf_loc = pcf_loc;
      From.Parsetree.pcf_attributes = pcf_attributes }
     ->
    {
      To.Parsetree.pcf_desc =
        (copy_class_field_desc pcf_desc);
      To.Parsetree.pcf_loc = (copy_location pcf_loc);
      To.Parsetree.pcf_attributes =
        (copy_attributes pcf_attributes)
    }

and copy_class_field_desc :
  From.Parsetree.class_field_desc -> To.Parsetree.class_field_desc =
  function
  | From.Parsetree.Pcf_inherit (x0,x1,x2) ->
      To.Parsetree.Pcf_inherit
        ((copy_override_flag x0),
          (copy_class_expr x1),
          (copy_option (copy_loc (fun x  -> x)) x2))
  | From.Parsetree.Pcf_val x0 ->
      To.Parsetree.Pcf_val
        (let (x0,x1,x2) = x0  in
         ((copy_loc (fun x  -> x) x0),
           (copy_mutable_flag x1),
           (copy_class_field_kind x2)))
  | From.Parsetree.Pcf_method x0 ->
      To.Parsetree.Pcf_method
        (let (x0,x1,x2) = x0  in
         ((copy_loc (fun x  -> x) x0),
           (copy_private_flag x1),
           (copy_class_field_kind x2)))
  | From.Parsetree.Pcf_constraint x0 ->
      To.Parsetree.Pcf_constraint
        (let (x0,x1) = x0  in
         ((copy_core_type x0),
           (copy_core_type x1)))
  | From.Parsetree.Pcf_initializer x0 ->
      To.Parsetree.Pcf_initializer
        (copy_expression x0)
  | From.Parsetree.Pcf_attribute x0 ->
      To.Parsetree.Pcf_attribute (copy_attribute x0)
  | From.Parsetree.Pcf_extension x0 ->
      To.Parsetree.Pcf_extension (copy_extension x0)

and copy_class_field_kind :
  From.Parsetree.class_field_kind -> To.Parsetree.class_field_kind =
  function
  | From.Parsetree.Cfk_virtual x0 ->
      To.Parsetree.Cfk_virtual (copy_core_type x0)
  | From.Parsetree.Cfk_concrete (x0,x1) ->
      To.Parsetree.Cfk_concrete
        ((copy_override_flag x0),
          (copy_expression x1))

and copy_module_binding :
  From.Parsetree.module_binding -> To.Parsetree.module_binding =
  fun
    { From.Parsetree.pmb_name = pmb_name;
      From.Parsetree.pmb_expr = pmb_expr;
      From.Parsetree.pmb_attributes = pmb_attributes;
      From.Parsetree.pmb_loc = pmb_loc }
     ->
    {
      To.Parsetree.pmb_name =
        (copy_loc (fun x  -> x) pmb_name);
      To.Parsetree.pmb_expr =
        (copy_module_expr pmb_expr);
      To.Parsetree.pmb_attributes =
        (copy_attributes pmb_attributes);
      To.Parsetree.pmb_loc = (copy_location pmb_loc)
    }

and copy_module_expr :
  From.Parsetree.module_expr -> To.Parsetree.module_expr =
  fun
    { From.Parsetree.pmod_desc = pmod_desc;
      From.Parsetree.pmod_loc = pmod_loc;
      From.Parsetree.pmod_attributes = pmod_attributes }
     ->
    {
      To.Parsetree.pmod_desc =
        (copy_module_expr_desc pmod_desc);
      To.Parsetree.pmod_loc = (copy_location pmod_loc);
      To.Parsetree.pmod_attributes =
        (copy_attributes pmod_attributes)
    }

and copy_module_expr_desc :
  From.Parsetree.module_expr_desc -> To.Parsetree.module_expr_desc =
  function
  | From.Parsetree.Pmod_ident x0 ->
      To.Parsetree.Pmod_ident
        (copy_loc copy_longident x0)
  | From.Parsetree.Pmod_structure x0 ->
      To.Parsetree.Pmod_structure (copy_structure x0)
  | From.Parsetree.Pmod_functor (x0,x1,x2) ->
      To.Parsetree.Pmod_functor
        ((copy_loc (fun x  -> x) x0),
          (copy_option copy_module_type x1),
          (copy_module_expr x2))
  | From.Parsetree.Pmod_apply (x0,x1) ->
      To.Parsetree.Pmod_apply
        ((copy_module_expr x0),
          (copy_module_expr x1))
  | From.Parsetree.Pmod_constraint (x0,x1) ->
      To.Parsetree.Pmod_constraint
        ((copy_module_expr x0),
          (copy_module_type x1))
  | From.Parsetree.Pmod_unpack x0 ->
      To.Parsetree.Pmod_unpack (copy_expression x0)
  | From.Parsetree.Pmod_extension x0 ->
      To.Parsetree.Pmod_extension (copy_extension x0)

and copy_module_type :
  From.Parsetree.module_type -> To.Parsetree.module_type =
  fun
    { From.Parsetree.pmty_desc = pmty_desc;
      From.Parsetree.pmty_loc = pmty_loc;
      From.Parsetree.pmty_attributes = pmty_attributes }
     ->
    {
      To.Parsetree.pmty_desc =
        (copy_module_type_desc pmty_desc);
      To.Parsetree.pmty_loc = (copy_location pmty_loc);
      To.Parsetree.pmty_attributes =
        (copy_attributes pmty_attributes)
    }

and copy_module_type_desc :
  From.Parsetree.module_type_desc -> To.Parsetree.module_type_desc =
  function
  | From.Parsetree.Pmty_ident x0 ->
      To.Parsetree.Pmty_ident
        (copy_loc copy_longident x0)
  | From.Parsetree.Pmty_signature x0 ->
      To.Parsetree.Pmty_signature (copy_signature x0)
  | From.Parsetree.Pmty_functor (x0,x1,x2) ->
      To.Parsetree.Pmty_functor
        ((copy_loc (fun x  -> x) x0),
          (copy_option copy_module_type x1),
          (copy_module_type x2))
  | From.Parsetree.Pmty_with (x0,x1) ->
      To.Parsetree.Pmty_with
        ((copy_module_type x0),
          (List.map copy_with_constraint x1))
  | From.Parsetree.Pmty_typeof x0 ->
      To.Parsetree.Pmty_typeof (copy_module_expr x0)
  | From.Parsetree.Pmty_extension x0 ->
      To.Parsetree.Pmty_extension (copy_extension x0)
  | From.Parsetree.Pmty_alias x0 ->
      To.Parsetree.Pmty_alias
        (copy_loc copy_longident x0)

and copy_with_constraint :
  From.Parsetree.with_constraint -> To.Parsetree.with_constraint =
  function
  | From.Parsetree.Pwith_type (x0,x1) ->
      To.Parsetree.Pwith_type
        ((copy_loc copy_longident x0),
          (copy_type_declaration x1))
  | From.Parsetree.Pwith_module (x0,x1) ->
      To.Parsetree.Pwith_module
        ((copy_loc copy_longident x0),
          (copy_loc copy_longident x1))
  | From.Parsetree.Pwith_typesubst x0 ->
      To.Parsetree.Pwith_typesubst
        (copy_loc (fun x -> Longident.Lident x) x0.From.Parsetree.ptype_name,
         copy_type_declaration x0)
  | From.Parsetree.Pwith_modsubst (x0,x1) ->
      To.Parsetree.Pwith_modsubst
        (copy_loc (fun x -> Longident.Lident x) x0,
         copy_loc copy_longident x1)

and copy_signature :
  From.Parsetree.signature -> To.Parsetree.signature =
  fun x  -> List.map copy_signature_item x

and copy_signature_item :
  From.Parsetree.signature_item -> To.Parsetree.signature_item =
  fun
    { From.Parsetree.psig_desc = psig_desc;
      From.Parsetree.psig_loc = psig_loc }
     ->
    {
      To.Parsetree.psig_desc =
        (copy_signature_item_desc psig_desc);
      To.Parsetree.psig_loc = (copy_location psig_loc)
    }

and copy_signature_item_desc :
  From.Parsetree.signature_item_desc ->
    To.Parsetree.signature_item_desc
  =
  function
  | From.Parsetree.Psig_value x0 ->
      To.Parsetree.Psig_value
        (copy_value_description x0)
  | From.Parsetree.Psig_type (x0,x1) ->
      To.Parsetree.Psig_type
        ((copy_rec_flag x0),
          (List.map copy_type_declaration x1))
  | From.Parsetree.Psig_typext x0 ->
      To.Parsetree.Psig_typext
        (copy_type_extension x0)
  | From.Parsetree.Psig_exception x0 ->
      To.Parsetree.Psig_exception
        (copy_extension_constructor x0)
  | From.Parsetree.Psig_module x0 ->
      To.Parsetree.Psig_module
        (copy_module_declaration x0)
  | From.Parsetree.Psig_recmodule x0 ->
      To.Parsetree.Psig_recmodule
        (List.map copy_module_declaration x0)
  | From.Parsetree.Psig_modtype x0 ->
      To.Parsetree.Psig_modtype
        (copy_module_type_declaration x0)
  | From.Parsetree.Psig_open x0 ->
      To.Parsetree.Psig_open
        (copy_open_description x0)
  | From.Parsetree.Psig_include x0 ->
      To.Parsetree.Psig_include
        (copy_include_description x0)
  | From.Parsetree.Psig_class x0 ->
      To.Parsetree.Psig_class
        (List.map copy_class_description x0)
  | From.Parsetree.Psig_class_type x0 ->
      To.Parsetree.Psig_class_type
        (List.map copy_class_type_declaration x0)
  | From.Parsetree.Psig_attribute x0 ->
      To.Parsetree.Psig_attribute (copy_attribute x0)
  | From.Parsetree.Psig_extension (x0,x1) ->
      To.Parsetree.Psig_extension
        ((copy_extension x0),
          (copy_attributes x1))

and copy_class_type_declaration :
  From.Parsetree.class_type_declaration ->
    To.Parsetree.class_type_declaration
  =
  fun x  ->
    copy_class_infos copy_class_type x

and copy_class_description :
  From.Parsetree.class_description -> To.Parsetree.class_description
  =
  fun x  ->
    copy_class_infos copy_class_type x

and copy_class_type :
  From.Parsetree.class_type -> To.Parsetree.class_type =
  fun
    { From.Parsetree.pcty_desc = pcty_desc;
      From.Parsetree.pcty_loc = pcty_loc;
      From.Parsetree.pcty_attributes = pcty_attributes }
     ->
    {
      To.Parsetree.pcty_desc =
        (copy_class_type_desc pcty_desc);
      To.Parsetree.pcty_loc = (copy_location pcty_loc);
      To.Parsetree.pcty_attributes =
        (copy_attributes pcty_attributes)
    }

and copy_class_type_desc :
  From.Parsetree.class_type_desc -> To.Parsetree.class_type_desc =
  function
  | From.Parsetree.Pcty_constr (x0,x1) ->
      To.Parsetree.Pcty_constr
        ((copy_loc copy_longident x0),
          (List.map copy_core_type x1))
  | From.Parsetree.Pcty_signature x0 ->
      To.Parsetree.Pcty_signature
        (copy_class_signature x0)
  | From.Parsetree.Pcty_arrow (x0,x1,x2) ->
      To.Parsetree.Pcty_arrow
        ((copy_arg_label x0),
          (copy_core_type x1),
          (copy_class_type x2))
  | From.Parsetree.Pcty_extension x0 ->
      To.Parsetree.Pcty_extension (copy_extension x0)

and copy_class_signature :
  From.Parsetree.class_signature -> To.Parsetree.class_signature =
  fun
    { From.Parsetree.pcsig_self = pcsig_self;
      From.Parsetree.pcsig_fields = pcsig_fields }
     ->
    {
      To.Parsetree.pcsig_self =
        (copy_core_type pcsig_self);
      To.Parsetree.pcsig_fields =
        (List.map copy_class_type_field pcsig_fields)
    }

and copy_class_type_field :
  From.Parsetree.class_type_field -> To.Parsetree.class_type_field =
  fun
    { From.Parsetree.pctf_desc = pctf_desc;
      From.Parsetree.pctf_loc = pctf_loc;
      From.Parsetree.pctf_attributes = pctf_attributes }
     ->
    {
      To.Parsetree.pctf_desc =
        (copy_class_type_field_desc pctf_desc);
      To.Parsetree.pctf_loc = (copy_location pctf_loc);
      To.Parsetree.pctf_attributes =
        (copy_attributes pctf_attributes)
    }

and copy_class_type_field_desc :
  From.Parsetree.class_type_field_desc ->
    To.Parsetree.class_type_field_desc
  =
  function
  | From.Parsetree.Pctf_inherit x0 ->
      To.Parsetree.Pctf_inherit (copy_class_type x0)
  | From.Parsetree.Pctf_val x0 ->
      To.Parsetree.Pctf_val
        (let (x0,x1,x2,x3) = x0  in
         (copy_loc (fun x  -> x) x0, (copy_mutable_flag x1),
           (copy_virtual_flag x2),
           (copy_core_type x3)))
  | From.Parsetree.Pctf_method x0 ->
      To.Parsetree.Pctf_method
        (let (x0,x1,x2,x3) = x0  in
         (copy_loc (fun x  -> x) x0, (copy_private_flag x1),
           (copy_virtual_flag x2),
           (copy_core_type x3)))
  | From.Parsetree.Pctf_constraint x0 ->
      To.Parsetree.Pctf_constraint
        (let (x0,x1) = x0  in
         ((copy_core_type x0),
           (copy_core_type x1)))
  | From.Parsetree.Pctf_attribute x0 ->
      To.Parsetree.Pctf_attribute (copy_attribute x0)
  | From.Parsetree.Pctf_extension x0 ->
      To.Parsetree.Pctf_extension (copy_extension x0)

and copy_extension :
  From.Parsetree.extension -> To.Parsetree.extension =
  fun x  ->
    let (x0,x1) = x  in
    ((copy_loc (fun x  -> x) x0),
      (copy_payload x1))

and copy_class_infos :
  'f0 'g0 .
    ('f0 -> 'g0) ->
      'f0 From.Parsetree.class_infos -> 'g0 To.Parsetree.class_infos
  =
  fun f0  ->
    fun
      { From.Parsetree.pci_virt = pci_virt;
        From.Parsetree.pci_params = pci_params;
        From.Parsetree.pci_name = pci_name;
        From.Parsetree.pci_expr = pci_expr;
        From.Parsetree.pci_loc = pci_loc;
        From.Parsetree.pci_attributes = pci_attributes }
       ->
      {
        To.Parsetree.pci_virt =
          (copy_virtual_flag pci_virt);
        To.Parsetree.pci_params =
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                ((copy_core_type x0),
                  (copy_variance x1))) pci_params);
        To.Parsetree.pci_name =
          (copy_loc (fun x  -> x) pci_name);
        To.Parsetree.pci_expr = (f0 pci_expr);
        To.Parsetree.pci_loc = (copy_location pci_loc);
        To.Parsetree.pci_attributes =
          (copy_attributes pci_attributes)
      }

and copy_virtual_flag :
  From.Asttypes.virtual_flag -> To.Asttypes.virtual_flag =
  function
  | From.Asttypes.Virtual  -> To.Asttypes.Virtual
  | From.Asttypes.Concrete  -> To.Asttypes.Concrete

and copy_include_description :
  From.Parsetree.include_description ->
    To.Parsetree.include_description
  =
  fun x  ->
    copy_include_infos copy_module_type x

and copy_include_infos :
  'f0 'g0 .
    ('f0 -> 'g0) ->
      'f0 From.Parsetree.include_infos ->
        'g0 To.Parsetree.include_infos
  =
  fun f0  ->
    fun
      { From.Parsetree.pincl_mod = pincl_mod;
        From.Parsetree.pincl_loc = pincl_loc;
        From.Parsetree.pincl_attributes = pincl_attributes }
       ->
      {
        To.Parsetree.pincl_mod = (f0 pincl_mod);
        To.Parsetree.pincl_loc = (copy_location pincl_loc);
        To.Parsetree.pincl_attributes =
          (copy_attributes pincl_attributes)
      }

and copy_open_description :
  From.Parsetree.open_description -> To.Parsetree.open_description =
  fun
    { From.Parsetree.popen_lid = popen_lid;
      From.Parsetree.popen_override = popen_override;
      From.Parsetree.popen_loc = popen_loc;
      From.Parsetree.popen_attributes = popen_attributes }
     ->
    {
      To.Parsetree.popen_lid =
        (copy_loc copy_longident popen_lid);
      To.Parsetree.popen_override =
        (copy_override_flag popen_override);
      To.Parsetree.popen_loc = (copy_location popen_loc);
      To.Parsetree.popen_attributes =
        (copy_attributes popen_attributes)
    }

and copy_override_flag :
  From.Asttypes.override_flag -> To.Asttypes.override_flag =
  function
  | From.Asttypes.Override  -> To.Asttypes.Override
  | From.Asttypes.Fresh  -> To.Asttypes.Fresh

and copy_module_type_declaration :
  From.Parsetree.module_type_declaration ->
    To.Parsetree.module_type_declaration
  =
  fun
    { From.Parsetree.pmtd_name = pmtd_name;
      From.Parsetree.pmtd_type = pmtd_type;
      From.Parsetree.pmtd_attributes = pmtd_attributes;
      From.Parsetree.pmtd_loc = pmtd_loc }
     ->
    {
      To.Parsetree.pmtd_name =
        (copy_loc (fun x  -> x) pmtd_name);
      To.Parsetree.pmtd_type =
        (copy_option copy_module_type pmtd_type);
      To.Parsetree.pmtd_attributes =
        (copy_attributes pmtd_attributes);
      To.Parsetree.pmtd_loc = (copy_location pmtd_loc)
    }

and copy_module_declaration :
  From.Parsetree.module_declaration ->
    To.Parsetree.module_declaration
  =
  fun
    { From.Parsetree.pmd_name = pmd_name;
      From.Parsetree.pmd_type = pmd_type;
      From.Parsetree.pmd_attributes = pmd_attributes;
      From.Parsetree.pmd_loc = pmd_loc }
     ->
    {
      To.Parsetree.pmd_name =
        (copy_loc (fun x  -> x) pmd_name);
      To.Parsetree.pmd_type =
        (copy_module_type pmd_type);
      To.Parsetree.pmd_attributes =
        (copy_attributes pmd_attributes);
      To.Parsetree.pmd_loc = (copy_location pmd_loc)
    }

and copy_type_extension :
  From.Parsetree.type_extension -> To.Parsetree.type_extension =
  fun
    { From.Parsetree.ptyext_path = ptyext_path;
      From.Parsetree.ptyext_params = ptyext_params;
      From.Parsetree.ptyext_constructors = ptyext_constructors;
      From.Parsetree.ptyext_private = ptyext_private;
      From.Parsetree.ptyext_attributes = ptyext_attributes }
     ->
    {
      To.Parsetree.ptyext_path =
        (copy_loc copy_longident ptyext_path);
      To.Parsetree.ptyext_params =
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_core_type x0),
                (copy_variance x1))) ptyext_params);
      To.Parsetree.ptyext_constructors =
        (List.map copy_extension_constructor
           ptyext_constructors);
      To.Parsetree.ptyext_private =
        (copy_private_flag ptyext_private);
      To.Parsetree.ptyext_attributes =
        (copy_attributes ptyext_attributes)
    }

and copy_extension_constructor :
  From.Parsetree.extension_constructor ->
    To.Parsetree.extension_constructor
  =
  fun
    { From.Parsetree.pext_name = pext_name;
      From.Parsetree.pext_kind = pext_kind;
      From.Parsetree.pext_loc = pext_loc;
      From.Parsetree.pext_attributes = pext_attributes }
     ->
    {
      To.Parsetree.pext_name =
        (copy_loc (fun x  -> x) pext_name);
      To.Parsetree.pext_kind =
        (copy_extension_constructor_kind pext_kind);
      To.Parsetree.pext_loc = (copy_location pext_loc);
      To.Parsetree.pext_attributes =
        (copy_attributes pext_attributes)
    }

and copy_extension_constructor_kind :
  From.Parsetree.extension_constructor_kind ->
    To.Parsetree.extension_constructor_kind
  =
  function
  | From.Parsetree.Pext_decl (x0,x1) ->
      To.Parsetree.Pext_decl
        ((copy_constructor_arguments x0),
          (copy_option copy_core_type x1))
  | From.Parsetree.Pext_rebind x0 ->
      To.Parsetree.Pext_rebind
        (copy_loc copy_longident x0)

and copy_type_declaration :
  From.Parsetree.type_declaration -> To.Parsetree.type_declaration =
  fun
    { From.Parsetree.ptype_name = ptype_name;
      From.Parsetree.ptype_params = ptype_params;
      From.Parsetree.ptype_cstrs = ptype_cstrs;
      From.Parsetree.ptype_kind = ptype_kind;
      From.Parsetree.ptype_private = ptype_private;
      From.Parsetree.ptype_manifest = ptype_manifest;
      From.Parsetree.ptype_attributes = ptype_attributes;
      From.Parsetree.ptype_loc = ptype_loc }
     ->
    {
      To.Parsetree.ptype_name =
        (copy_loc (fun x  -> x) ptype_name);
      To.Parsetree.ptype_params =
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_core_type x0),
                (copy_variance x1))) ptype_params);
      To.Parsetree.ptype_cstrs =
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              ((copy_core_type x0),
                (copy_core_type x1),
                (copy_location x2))) ptype_cstrs);
      To.Parsetree.ptype_kind =
        (copy_type_kind ptype_kind);
      To.Parsetree.ptype_private =
        (copy_private_flag ptype_private);
      To.Parsetree.ptype_manifest =
        (copy_option copy_core_type ptype_manifest);
      To.Parsetree.ptype_attributes =
        (copy_attributes ptype_attributes);
      To.Parsetree.ptype_loc = (copy_location ptype_loc)
    }

and copy_private_flag :
  From.Asttypes.private_flag -> To.Asttypes.private_flag =
  function
  | From.Asttypes.Private  -> To.Asttypes.Private
  | From.Asttypes.Public  -> To.Asttypes.Public

and copy_type_kind :
  From.Parsetree.type_kind -> To.Parsetree.type_kind =
  function
  | From.Parsetree.Ptype_abstract  -> To.Parsetree.Ptype_abstract
  | From.Parsetree.Ptype_variant x0 ->
      To.Parsetree.Ptype_variant
        (List.map copy_constructor_declaration x0)
  | From.Parsetree.Ptype_record x0 ->
      To.Parsetree.Ptype_record
        (List.map copy_label_declaration x0)
  | From.Parsetree.Ptype_open  -> To.Parsetree.Ptype_open

and copy_constructor_declaration :
  From.Parsetree.constructor_declaration ->
    To.Parsetree.constructor_declaration
  =
  fun
    { From.Parsetree.pcd_name = pcd_name;
      From.Parsetree.pcd_args = pcd_args;
      From.Parsetree.pcd_res = pcd_res;
      From.Parsetree.pcd_loc = pcd_loc;
      From.Parsetree.pcd_attributes = pcd_attributes }
     ->
    {
      To.Parsetree.pcd_name =
        (copy_loc (fun x  -> x) pcd_name);
      To.Parsetree.pcd_args =
        (copy_constructor_arguments pcd_args);
      To.Parsetree.pcd_res =
        (copy_option copy_core_type pcd_res);
      To.Parsetree.pcd_loc = (copy_location pcd_loc);
      To.Parsetree.pcd_attributes =
        (copy_attributes pcd_attributes)
    }

and copy_constructor_arguments :
  From.Parsetree.constructor_arguments ->
    To.Parsetree.constructor_arguments
  =
  function
  | From.Parsetree.Pcstr_tuple x0 ->
      To.Parsetree.Pcstr_tuple
        (List.map copy_core_type x0)
  | From.Parsetree.Pcstr_record x0 ->
      To.Parsetree.Pcstr_record
        (List.map copy_label_declaration x0)

and copy_label_declaration :
  From.Parsetree.label_declaration -> To.Parsetree.label_declaration
  =
  fun
    { From.Parsetree.pld_name = pld_name;
      From.Parsetree.pld_mutable = pld_mutable;
      From.Parsetree.pld_type = pld_type;
      From.Parsetree.pld_loc = pld_loc;
      From.Parsetree.pld_attributes = pld_attributes }
     ->
    {
      To.Parsetree.pld_name =
        (copy_loc (fun x  -> x) pld_name);
      To.Parsetree.pld_mutable =
        (copy_mutable_flag pld_mutable);
      To.Parsetree.pld_type =
        (copy_core_type pld_type);
      To.Parsetree.pld_loc = (copy_location pld_loc);
      To.Parsetree.pld_attributes =
        (copy_attributes pld_attributes)
    }

and copy_mutable_flag :
  From.Asttypes.mutable_flag -> To.Asttypes.mutable_flag =
  function
  | From.Asttypes.Immutable  -> To.Asttypes.Immutable
  | From.Asttypes.Mutable  -> To.Asttypes.Mutable

and copy_variance :
  From.Asttypes.variance -> To.Asttypes.variance =
  function
  | From.Asttypes.Covariant  -> To.Asttypes.Covariant
  | From.Asttypes.Contravariant  -> To.Asttypes.Contravariant
  | From.Asttypes.Invariant  -> To.Asttypes.Invariant

and copy_value_description :
  From.Parsetree.value_description -> To.Parsetree.value_description
  =
  fun
    { From.Parsetree.pval_name = pval_name;
      From.Parsetree.pval_type = pval_type;
      From.Parsetree.pval_prim = pval_prim;
      From.Parsetree.pval_attributes = pval_attributes;
      From.Parsetree.pval_loc = pval_loc }
     ->
    {
      To.Parsetree.pval_name =
        (copy_loc (fun x  -> x) pval_name);
      To.Parsetree.pval_type =
        (copy_core_type pval_type);
      To.Parsetree.pval_prim = (List.map (fun x  -> x) pval_prim);
      To.Parsetree.pval_attributes =
        (copy_attributes pval_attributes);
      To.Parsetree.pval_loc = (copy_location pval_loc)
    }

and copy_arg_label :
  From.Asttypes.arg_label -> To.Asttypes.arg_label =
  function
  | From.Asttypes.Nolabel  -> To.Asttypes.Nolabel
  | From.Asttypes.Labelled x0 -> To.Asttypes.Labelled x0
  | From.Asttypes.Optional x0 -> To.Asttypes.Optional x0

and copy_closed_flag :
  From.Asttypes.closed_flag -> To.Asttypes.closed_flag =
  function
  | From.Asttypes.Closed  -> To.Asttypes.Closed
  | From.Asttypes.Open  -> To.Asttypes.Open

and copy_label :
  From.Asttypes.label -> To.Asttypes.label = fun x  -> x

and copy_rec_flag :
  From.Asttypes.rec_flag -> To.Asttypes.rec_flag =
  function
  | From.Asttypes.Nonrecursive  -> To.Asttypes.Nonrecursive
  | From.Asttypes.Recursive  -> To.Asttypes.Recursive

and copy_constant :
  From.Parsetree.constant -> To.Parsetree.constant =
  function
  | From.Parsetree.Pconst_integer (x0,x1) ->
      To.Parsetree.Pconst_integer (x0, (copy_option (fun x  -> x) x1))
  | From.Parsetree.Pconst_char x0 -> To.Parsetree.Pconst_char x0
  | From.Parsetree.Pconst_string (x0,x1) ->
      To.Parsetree.Pconst_string (x0, (copy_option (fun x  -> x) x1))
  | From.Parsetree.Pconst_float (x0,x1) ->
      To.Parsetree.Pconst_float (x0, (copy_option (fun x  -> x) x1))

and copy_option : 'f0 'g0 . ('f0 -> 'g0) -> 'f0 option -> 'g0 option =
  fun f0  -> function | None  -> None | Some x0 -> Some (f0 x0)

and copy_longident : From.Longident.t -> To.Longident.t =
  function
  | From.Longident.Lident x0 -> To.Longident.Lident x0
  | From.Longident.Ldot (x0,x1) ->
      To.Longident.Ldot ((copy_longident x0), x1)
  | From.Longident.Lapply (x0,x1) ->
      To.Longident.Lapply
        ((copy_longident x0), (copy_longident x1))

and copy_loc :
  'f0 'g0 .
    ('f0 -> 'g0) -> 'f0 From.Asttypes.loc -> 'g0 To.Asttypes.loc
  =
  fun f0  ->
    fun { From.Asttypes.txt = txt; From.Asttypes.loc = loc }  ->
      {
        To.Asttypes.txt = (f0 txt);
        To.Asttypes.loc = (copy_location loc)
      }

and copy_location : From.Location.t -> To.Location.t =
  fun
    { From.Location.loc_start = loc_start;
      From.Location.loc_end = loc_end;
      From.Location.loc_ghost = loc_ghost }
     ->
    {
      To.Location.loc_start = (copy_Lexing_position loc_start);
      To.Location.loc_end = (copy_Lexing_position loc_end);
      To.Location.loc_ghost = (copy_bool loc_ghost)
    }

and copy_bool : bool -> bool = function | false  -> false | true  -> true

and copy_Lexing_position : Lexing.position -> Lexing.position =
  fun
    { Lexing.pos_fname = pos_fname; Lexing.pos_lnum = pos_lnum;
      Lexing.pos_bol = pos_bol; Lexing.pos_cnum = pos_cnum }
     ->
    {
      Lexing.pos_fname = pos_fname;
      Lexing.pos_lnum = pos_lnum;
      Lexing.pos_bol = pos_bol;
      Lexing.pos_cnum = pos_cnum
    }

let rec copy_out_phrase :
  From.Outcometree.out_phrase -> To.Outcometree.out_phrase =
  function
  | From.Outcometree.Ophr_eval (x0,x1) ->
      To.Outcometree.Ophr_eval
        ((copy_out_value x0),
          (copy_out_type x1))
  | From.Outcometree.Ophr_signature x0 ->
      To.Outcometree.Ophr_signature
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_out_sig_item x0),
                (copy_option copy_out_value x1))) x0)
  | From.Outcometree.Ophr_exception x0 ->
      To.Outcometree.Ophr_exception
        (let (x0,x1) = x0  in
         ((copy_exn x0), (copy_out_value x1)))

and copy_exn : exn -> exn = fun x  -> x

and copy_out_sig_item :
  From.Outcometree.out_sig_item -> To.Outcometree.out_sig_item =
  function
  | From.Outcometree.Osig_class (x0,x1,x2,x3,x4) ->
      To.Outcometree.Osig_class
        ((copy_bool x0), x1,
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                (x0, (let (x0,x1) = x1  in ((copy_bool x0), (copy_bool x1)))))
             x2), (copy_out_class_type x3),
          (copy_out_rec_status x4))
  | From.Outcometree.Osig_class_type (x0,x1,x2,x3,x4) ->
      To.Outcometree.Osig_class_type
        ((copy_bool x0), x1,
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                (x0, (let (x0,x1) = x1  in ((copy_bool x0), (copy_bool x1)))))
             x2), (copy_out_class_type x3),
          (copy_out_rec_status x4))
  | From.Outcometree.Osig_typext (x0,x1) ->
      To.Outcometree.Osig_typext
        ((copy_out_extension_constructor x0),
          (copy_out_ext_status x1))
  | From.Outcometree.Osig_modtype (x0,x1) ->
      To.Outcometree.Osig_modtype
        (x0, (copy_out_module_type x1))
  | From.Outcometree.Osig_module (x0,x1,x2) ->
      To.Outcometree.Osig_module
        (x0, (copy_out_module_type x1),
          (copy_out_rec_status x2))
  | From.Outcometree.Osig_type (x0,x1) ->
      To.Outcometree.Osig_type
        ((copy_out_type_decl x0),
          (copy_out_rec_status x1))
  | From.Outcometree.Osig_value x0 ->
      To.Outcometree.Osig_value
        (copy_out_val_decl x0)
  | From.Outcometree.Osig_ellipsis  -> To.Outcometree.Osig_ellipsis

and copy_out_val_decl :
  From.Outcometree.out_val_decl -> To.Outcometree.out_val_decl =
  fun
    { From.Outcometree.oval_name = oval_name;
      From.Outcometree.oval_type = oval_type;
      From.Outcometree.oval_prims = oval_prims;
      From.Outcometree.oval_attributes = oval_attributes }
     ->
    {
      To.Outcometree.oval_name = oval_name;
      To.Outcometree.oval_type =
        (copy_out_type oval_type);
      To.Outcometree.oval_prims = (List.map (fun x  -> x) oval_prims);
      To.Outcometree.oval_attributes =
        (List.map copy_out_attribute oval_attributes)
    }

and copy_out_type_decl :
  From.Outcometree.out_type_decl -> To.Outcometree.out_type_decl =
  fun
    { From.Outcometree.otype_name = otype_name;
      From.Outcometree.otype_params = otype_params;
      From.Outcometree.otype_type = otype_type;
      From.Outcometree.otype_private = otype_private;
      From.Outcometree.otype_immediate = otype_immediate;
      From.Outcometree.otype_unboxed = otype_unboxed;
      From.Outcometree.otype_cstrs = otype_cstrs }
     ->
    {
      To.Outcometree.otype_name = otype_name;
      To.Outcometree.otype_params =
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              (x0, (let (x0,x1) = x1  in ((copy_bool x0), (copy_bool x1)))))
           otype_params);
      To.Outcometree.otype_type =
        (copy_out_type otype_type);
      To.Outcometree.otype_private =
        (copy_From_Asttypes_private_flag otype_private);
      To.Outcometree.otype_immediate = (copy_bool otype_immediate);
      To.Outcometree.otype_unboxed = (copy_bool otype_unboxed);
      To.Outcometree.otype_cstrs =
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_out_type x0),
                (copy_out_type x1))) otype_cstrs)
    }

and copy_out_module_type :
  From.Outcometree.out_module_type -> To.Outcometree.out_module_type
  =
  function
  | From.Outcometree.Omty_abstract  -> To.Outcometree.Omty_abstract
  | From.Outcometree.Omty_functor (x0,x1,x2) ->
      To.Outcometree.Omty_functor
        (x0, (copy_option copy_out_module_type x1),
          (copy_out_module_type x2))
  | From.Outcometree.Omty_ident x0 ->
      To.Outcometree.Omty_ident (copy_out_ident x0)
  | From.Outcometree.Omty_signature x0 ->
      To.Outcometree.Omty_signature
        (List.map copy_out_sig_item x0)
  | From.Outcometree.Omty_alias x0 ->
      To.Outcometree.Omty_alias (copy_out_ident x0)

and copy_out_ext_status :
  From.Outcometree.out_ext_status -> To.Outcometree.out_ext_status =
  function
  | From.Outcometree.Oext_first  -> To.Outcometree.Oext_first
  | From.Outcometree.Oext_next  -> To.Outcometree.Oext_next
  | From.Outcometree.Oext_exception  -> To.Outcometree.Oext_exception

and copy_out_extension_constructor :
  From.Outcometree.out_extension_constructor ->
    To.Outcometree.out_extension_constructor
  =
  fun
    { From.Outcometree.oext_name = oext_name;
      From.Outcometree.oext_type_name = oext_type_name;
      From.Outcometree.oext_type_params = oext_type_params;
      From.Outcometree.oext_args = oext_args;
      From.Outcometree.oext_ret_type = oext_ret_type;
      From.Outcometree.oext_private = oext_private }
     ->
    {
      To.Outcometree.oext_name = oext_name;
      To.Outcometree.oext_type_name = oext_type_name;
      To.Outcometree.oext_type_params =
        (List.map (fun x  -> x) oext_type_params);
      To.Outcometree.oext_args =
        (List.map copy_out_type oext_args);
      To.Outcometree.oext_ret_type =
        (copy_option copy_out_type oext_ret_type);
      To.Outcometree.oext_private =
        (copy_From_Asttypes_private_flag oext_private)
    }

and copy_From_Asttypes_private_flag :
  From.Asttypes.private_flag -> To.Asttypes.private_flag =
  function
  | From.Asttypes.Private  -> To.Asttypes.Private
  | From.Asttypes.Public  -> To.Asttypes.Public

and copy_out_rec_status :
  From.Outcometree.out_rec_status -> To.Outcometree.out_rec_status =
  function
  | From.Outcometree.Orec_not  -> To.Outcometree.Orec_not
  | From.Outcometree.Orec_first  -> To.Outcometree.Orec_first
  | From.Outcometree.Orec_next  -> To.Outcometree.Orec_next

and copy_out_class_type :
  From.Outcometree.out_class_type -> To.Outcometree.out_class_type =
  function
  | From.Outcometree.Octy_constr (x0,x1) ->
      To.Outcometree.Octy_constr
        ((copy_out_ident x0),
          (List.map copy_out_type x1))
  | From.Outcometree.Octy_arrow (x0,x1,x2) ->
      To.Outcometree.Octy_arrow
        (x0, (copy_out_type x1),
          (copy_out_class_type x2))
  | From.Outcometree.Octy_signature (x0,x1) ->
      To.Outcometree.Octy_signature
        ((copy_option copy_out_type x0),
          (List.map copy_out_class_sig_item x1))

and copy_out_class_sig_item :
  From.Outcometree.out_class_sig_item ->
    To.Outcometree.out_class_sig_item
  =
  function
  | From.Outcometree.Ocsg_constraint (x0,x1) ->
      To.Outcometree.Ocsg_constraint
        ((copy_out_type x0),
          (copy_out_type x1))
  | From.Outcometree.Ocsg_method (x0,x1,x2,x3) ->
      To.Outcometree.Ocsg_method
        (x0, (copy_bool x1), (copy_bool x2),
          (copy_out_type x3))
  | From.Outcometree.Ocsg_value (x0,x1,x2,x3) ->
      To.Outcometree.Ocsg_value
        (x0, (copy_bool x1), (copy_bool x2),
          (copy_out_type x3))

and copy_out_type :
  From.Outcometree.out_type -> To.Outcometree.out_type =
  function
  | From.Outcometree.Otyp_abstract  -> To.Outcometree.Otyp_abstract
  | From.Outcometree.Otyp_open  -> To.Outcometree.Otyp_open
  | From.Outcometree.Otyp_alias (x0,x1) ->
      To.Outcometree.Otyp_alias
        ((copy_out_type x0), x1)
  | From.Outcometree.Otyp_arrow (x0,x1,x2) ->
      To.Outcometree.Otyp_arrow
        (x0, (copy_out_type x1),
          (copy_out_type x2))
  | From.Outcometree.Otyp_class (x0,x1,x2) ->
      To.Outcometree.Otyp_class
        ((copy_bool x0), (copy_out_ident x1),
          (List.map copy_out_type x2))
  | From.Outcometree.Otyp_constr (x0,x1) ->
      To.Outcometree.Otyp_constr
        ((copy_out_ident x0),
          (List.map copy_out_type x1))
  | From.Outcometree.Otyp_manifest (x0,x1) ->
      To.Outcometree.Otyp_manifest
        ((copy_out_type x0),
          (copy_out_type x1))
  | From.Outcometree.Otyp_object (x0,x1) ->
      To.Outcometree.Otyp_object
        ((List.map
            (fun x  ->
               let (x0,x1) = x  in
               (x0, (copy_out_type x1))) x0),
          (copy_option copy_bool x1))
  | From.Outcometree.Otyp_record x0 ->
      To.Outcometree.Otyp_record
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              (x0, (copy_bool x1), (copy_out_type x2)))
           x0)
  | From.Outcometree.Otyp_stuff x0 -> To.Outcometree.Otyp_stuff x0
  | From.Outcometree.Otyp_sum x0 ->
      To.Outcometree.Otyp_sum
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              (x0, (List.map copy_out_type x1),
                (copy_option copy_out_type x2))) x0)
  | From.Outcometree.Otyp_tuple x0 ->
      To.Outcometree.Otyp_tuple
        (List.map copy_out_type x0)
  | From.Outcometree.Otyp_var (x0,x1) ->
      To.Outcometree.Otyp_var ((copy_bool x0), x1)
  | From.Outcometree.Otyp_variant (x0,x1,x2,x3) ->
      To.Outcometree.Otyp_variant
        ((copy_bool x0), (copy_out_variant x1),
          (copy_bool x2),
          (copy_option (fun x  -> List.map (fun x  -> x) x) x3))
  | From.Outcometree.Otyp_poly (x0,x1) ->
      To.Outcometree.Otyp_poly
        ((List.map (fun x  -> x) x0), (copy_out_type x1))
  | From.Outcometree.Otyp_module (x0,x1,x2) ->
      To.Outcometree.Otyp_module
        (x0, (List.map (fun x  -> x) x1),
          (List.map copy_out_type x2))
  | From.Outcometree.Otyp_attribute (x0,x1) ->
      To.Outcometree.Otyp_attribute
        ((copy_out_type x0),
          (copy_out_attribute x1))

and copy_out_attribute :
  From.Outcometree.out_attribute -> To.Outcometree.out_attribute =
  fun { From.Outcometree.oattr_name = oattr_name }  ->
    { To.Outcometree.oattr_name = oattr_name }

and copy_out_variant :
  From.Outcometree.out_variant -> To.Outcometree.out_variant =
  function
  | From.Outcometree.Ovar_fields x0 ->
      To.Outcometree.Ovar_fields
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              (x0, (copy_bool x1),
                (List.map copy_out_type x2))) x0)
  | From.Outcometree.Ovar_typ x0 ->
      To.Outcometree.Ovar_typ (copy_out_type x0)

and copy_out_value :
  From.Outcometree.out_value -> To.Outcometree.out_value =
  function
  | From.Outcometree.Oval_array x0 ->
      To.Outcometree.Oval_array
        (List.map copy_out_value x0)
  | From.Outcometree.Oval_char x0 -> To.Outcometree.Oval_char x0
  | From.Outcometree.Oval_constr (x0,x1) ->
      To.Outcometree.Oval_constr
        ((copy_out_ident x0),
          (List.map copy_out_value x1))
  | From.Outcometree.Oval_ellipsis  -> To.Outcometree.Oval_ellipsis
  | From.Outcometree.Oval_float x0 ->
      To.Outcometree.Oval_float (copy_float x0)
  | From.Outcometree.Oval_int x0 -> To.Outcometree.Oval_int x0
  | From.Outcometree.Oval_int32 x0 -> To.Outcometree.Oval_int32 x0
  | From.Outcometree.Oval_int64 x0 -> To.Outcometree.Oval_int64 x0
  | From.Outcometree.Oval_nativeint x0 ->
      To.Outcometree.Oval_nativeint x0
  | From.Outcometree.Oval_list x0 ->
      To.Outcometree.Oval_list
        (List.map copy_out_value x0)
  | From.Outcometree.Oval_printer x0 ->
      To.Outcometree.Oval_printer x0
  | From.Outcometree.Oval_record x0 ->
      To.Outcometree.Oval_record
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_out_ident x0),
                (copy_out_value x1))) x0)
  | From.Outcometree.Oval_string x0 ->
      To.Outcometree.Oval_string (x0, max_int, Ostr_string)
  | From.Outcometree.Oval_stuff x0 -> To.Outcometree.Oval_stuff x0
  | From.Outcometree.Oval_tuple x0 ->
      To.Outcometree.Oval_tuple
        (List.map copy_out_value x0)
  | From.Outcometree.Oval_variant (x0,x1) ->
      To.Outcometree.Oval_variant
        (x0, (copy_option copy_out_value x1))

and copy_float : float -> float = fun x  -> x

and copy_out_ident :
  From.Outcometree.out_ident -> To.Outcometree.out_ident =
  function
  | From.Outcometree.Oide_apply (x0,x1) ->
      To.Outcometree.Oide_apply
        ((copy_out_ident x0),
          (copy_out_ident x1))
  | From.Outcometree.Oide_dot (x0,x1) ->
      To.Outcometree.Oide_dot
        ((copy_out_ident x0), x1)
  | From.Outcometree.Oide_ident x0 -> To.Outcometree.Oide_ident x0

let rec copy_toplevel_phrase :
  From.Parsetree.toplevel_phrase -> To.Parsetree.toplevel_phrase =
  function
  | From.Parsetree.Ptop_def x0 ->
      To.Parsetree.Ptop_def (copy_structure x0)
  | From.Parsetree.Ptop_dir (x0,x1) ->
      To.Parsetree.Ptop_dir
        (x0, (copy_directive_argument x1))

and copy_directive_argument :
  From.Parsetree.directive_argument -> To.Parsetree.directive_argument =
  function
  | From.Parsetree.Pdir_none  -> To.Parsetree.Pdir_none
  | From.Parsetree.Pdir_string x0 -> To.Parsetree.Pdir_string x0
  | From.Parsetree.Pdir_int (x0,x1) ->
      To.Parsetree.Pdir_int (x0, (copy_option (fun x  -> x) x1))
  | From.Parsetree.Pdir_ident x0 ->
      To.Parsetree.Pdir_ident (copy_longident x0)
  | From.Parsetree.Pdir_bool x0 ->
      To.Parsetree.Pdir_bool (copy_bool x0)

let copy_out_type_extension :
  From.Outcometree.out_type_extension -> To.Outcometree.out_type_extension =
  fun
    { From.Outcometree.otyext_name = otyext_name;
      From.Outcometree.otyext_params = otyext_params;
      From.Outcometree.otyext_constructors = otyext_constructors;
      From.Outcometree.otyext_private = otyext_private }
     ->
    {
      To.Outcometree.otyext_name = otyext_name;
      To.Outcometree.otyext_params =
        (List.map (fun x  -> x) otyext_params);
      To.Outcometree.otyext_constructors =
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              (x0, (List.map copy_out_type x1),
                (copy_option copy_out_type x2)))
           otyext_constructors);
      To.Outcometree.otyext_private =
        (copy_private_flag otyext_private)
    }

let copy_cases x = List.map copy_case x
let copy_pat = copy_pattern
let copy_expr = copy_expression
let copy_typ = copy_core_type

end
module Migrate_parsetree_406_405_migrate
= struct
#1 "migrate_parsetree_406_405_migrate.ml"
# 1 "src/migrate_parsetree_406_405_migrate.ml"
(**************************************************************************)
(*                                                                        *)
(*                         OCaml Migrate Parsetree                        *)
(*                                                                        *)
(*                             Frédéric Bour                              *)
(*                         Alain Frisch, LexiFi                           *)
(*                                                                        *)
(*   Copyright 2017 Institut National de Recherche en Informatique et     *)
(*     en Automatique (INRIA).                                            *)
(*                                                                        *)
(*   All rights reserved.  This file is distributed under the terms of    *)
(*   the GNU Lesser General Public License version 2.1, with the          *)
(*   special exception on linking described in the file LICENSE.          *)
(*                                                                        *)
(**************************************************************************)

module Def = Migrate_parsetree_def
module From = Ast_406
module To = Ast_405

let migration_error location feature =
  raise (Def.Migration_error (feature, location))

let rec copy_expression :
  From.Parsetree.expression -> To.Parsetree.expression =
  fun
    { From.Parsetree.pexp_desc = pexp_desc;
      From.Parsetree.pexp_loc = pexp_loc;
      From.Parsetree.pexp_attributes = pexp_attributes }
     ->
    {
      To.Parsetree.pexp_desc = (copy_expression_desc pexp_desc);
      To.Parsetree.pexp_loc = (copy_location pexp_loc);
      To.Parsetree.pexp_attributes = (copy_attributes pexp_attributes)
    }

and copy_expression_desc :
  From.Parsetree.expression_desc -> To.Parsetree.expression_desc =
  function
  | From.Parsetree.Pexp_ident x0 ->
      To.Parsetree.Pexp_ident
        (copy_loc copy_longident x0)
  | From.Parsetree.Pexp_constant x0 ->
      To.Parsetree.Pexp_constant (copy_constant x0)
  | From.Parsetree.Pexp_let (x0,x1,x2) ->
      To.Parsetree.Pexp_let
        ((copy_rec_flag x0),
          (List.map copy_value_binding x1),
          (copy_expression x2))
  | From.Parsetree.Pexp_function x0 ->
      To.Parsetree.Pexp_function
        (List.map copy_case x0)
  | From.Parsetree.Pexp_fun (x0,x1,x2,x3) ->
      To.Parsetree.Pexp_fun
        ((copy_arg_label x0),
          (copy_option copy_expression x1),
          (copy_pattern x2),
          (copy_expression x3))
  | From.Parsetree.Pexp_apply (x0,x1) ->
      To.Parsetree.Pexp_apply
        ((copy_expression x0),
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                ((copy_arg_label x0),
                  (copy_expression x1))) x1))
  | From.Parsetree.Pexp_match (x0,x1) ->
      To.Parsetree.Pexp_match
        ((copy_expression x0),
          (List.map copy_case x1))
  | From.Parsetree.Pexp_try (x0,x1) ->
      To.Parsetree.Pexp_try
        ((copy_expression x0),
          (List.map copy_case x1))
  | From.Parsetree.Pexp_tuple x0 ->
      To.Parsetree.Pexp_tuple
        (List.map copy_expression x0)
  | From.Parsetree.Pexp_construct (x0,x1) ->
      To.Parsetree.Pexp_construct
        ((copy_loc copy_longident x0),
          (copy_option copy_expression x1))
  | From.Parsetree.Pexp_variant (x0,x1) ->
      To.Parsetree.Pexp_variant
        ((copy_label x0),
          (copy_option copy_expression x1))
  | From.Parsetree.Pexp_record (x0,x1) ->
      To.Parsetree.Pexp_record
        ((List.map
            (fun x  ->
               let (x0,x1) = x  in
               ((copy_loc copy_longident x0),
                 (copy_expression x1))) x0),
          (copy_option copy_expression x1))
  | From.Parsetree.Pexp_field (x0,x1) ->
      To.Parsetree.Pexp_field
        ((copy_expression x0),
          (copy_loc copy_longident x1))
  | From.Parsetree.Pexp_setfield (x0,x1,x2) ->
      To.Parsetree.Pexp_setfield
        ((copy_expression x0),
          (copy_loc copy_longident x1),
          (copy_expression x2))
  | From.Parsetree.Pexp_array x0 ->
      To.Parsetree.Pexp_array
        (List.map copy_expression x0)
  | From.Parsetree.Pexp_ifthenelse (x0,x1,x2) ->
      To.Parsetree.Pexp_ifthenelse
        ((copy_expression x0),
          (copy_expression x1),
          (copy_option copy_expression x2))
  | From.Parsetree.Pexp_sequence (x0,x1) ->
      To.Parsetree.Pexp_sequence
        ((copy_expression x0),
          (copy_expression x1))
  | From.Parsetree.Pexp_while (x0,x1) ->
      To.Parsetree.Pexp_while
        ((copy_expression x0),
          (copy_expression x1))
  | From.Parsetree.Pexp_for (x0,x1,x2,x3,x4) ->
      To.Parsetree.Pexp_for
        ((copy_pattern x0),
          (copy_expression x1),
          (copy_expression x2),
          (copy_direction_flag x3),
          (copy_expression x4))
  | From.Parsetree.Pexp_constraint (x0,x1) ->
      To.Parsetree.Pexp_constraint
        ((copy_expression x0),
          (copy_core_type x1))
  | From.Parsetree.Pexp_coerce (x0,x1,x2) ->
      To.Parsetree.Pexp_coerce
        ((copy_expression x0),
          (copy_option copy_core_type x1),
          (copy_core_type x2))
  | From.Parsetree.Pexp_send (x0,x1) ->
      To.Parsetree.Pexp_send
        ((copy_expression x0), (copy_loc (fun x  -> x) x1))
  | From.Parsetree.Pexp_new x0 ->
      To.Parsetree.Pexp_new
        (copy_loc copy_longident x0)
  | From.Parsetree.Pexp_setinstvar (x0,x1) ->
      To.Parsetree.Pexp_setinstvar
        ((copy_loc (fun x  -> x) x0),
          (copy_expression x1))
  | From.Parsetree.Pexp_override x0 ->
      To.Parsetree.Pexp_override
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_loc (fun x  -> x) x0),
                (copy_expression x1))) x0)
  | From.Parsetree.Pexp_letmodule (x0,x1,x2) ->
      To.Parsetree.Pexp_letmodule
        ((copy_loc (fun x  -> x) x0),
          (copy_module_expr x1),
          (copy_expression x2))
  | From.Parsetree.Pexp_letexception (x0,x1) ->
      To.Parsetree.Pexp_letexception
        ((copy_extension_constructor x0),
          (copy_expression x1))
  | From.Parsetree.Pexp_assert x0 ->
      To.Parsetree.Pexp_assert (copy_expression x0)
  | From.Parsetree.Pexp_lazy x0 ->
      To.Parsetree.Pexp_lazy (copy_expression x0)
  | From.Parsetree.Pexp_poly (x0,x1) ->
      To.Parsetree.Pexp_poly
        ((copy_expression x0),
          (copy_option copy_core_type x1))
  | From.Parsetree.Pexp_object x0 ->
      To.Parsetree.Pexp_object
        (copy_class_structure x0)
  | From.Parsetree.Pexp_newtype (x0,x1) ->
      To.Parsetree.Pexp_newtype
        ((copy_loc (fun x  -> x) x0), (copy_expression x1))
  | From.Parsetree.Pexp_pack x0 ->
      To.Parsetree.Pexp_pack (copy_module_expr x0)
  | From.Parsetree.Pexp_open (x0,x1,x2) ->
      To.Parsetree.Pexp_open
        ((copy_override_flag x0),
          (copy_loc copy_longident x1),
          (copy_expression x2))
  | From.Parsetree.Pexp_extension x0 ->
      To.Parsetree.Pexp_extension (copy_extension x0)
  | From.Parsetree.Pexp_unreachable  -> To.Parsetree.Pexp_unreachable

and copy_direction_flag :
  From.Asttypes.direction_flag -> To.Asttypes.direction_flag =
  function
  | From.Asttypes.Upto  -> To.Asttypes.Upto
  | From.Asttypes.Downto  -> To.Asttypes.Downto

and copy_case :
  From.Parsetree.case -> To.Parsetree.case =
  fun
    { From.Parsetree.pc_lhs = pc_lhs;
      From.Parsetree.pc_guard = pc_guard;
      From.Parsetree.pc_rhs = pc_rhs }
     ->
    {
      To.Parsetree.pc_lhs = (copy_pattern pc_lhs);
      To.Parsetree.pc_guard =
        (copy_option copy_expression pc_guard);
      To.Parsetree.pc_rhs = (copy_expression pc_rhs)
    }

and copy_value_binding :
  From.Parsetree.value_binding -> To.Parsetree.value_binding =
  fun
    { From.Parsetree.pvb_pat = pvb_pat;
      From.Parsetree.pvb_expr = pvb_expr;
      From.Parsetree.pvb_attributes = pvb_attributes;
      From.Parsetree.pvb_loc = pvb_loc }
     ->
    {
      To.Parsetree.pvb_pat = (copy_pattern pvb_pat);
      To.Parsetree.pvb_expr =
        (copy_expression pvb_expr);
      To.Parsetree.pvb_attributes =
        (copy_attributes pvb_attributes);
      To.Parsetree.pvb_loc = (copy_location pvb_loc)
    }

and copy_pattern :
  From.Parsetree.pattern -> To.Parsetree.pattern =
  fun
    { From.Parsetree.ppat_desc = ppat_desc;
      From.Parsetree.ppat_loc = ppat_loc;
      From.Parsetree.ppat_attributes = ppat_attributes }
     ->
    {
      To.Parsetree.ppat_desc =
        (copy_pattern_desc ppat_desc);
      To.Parsetree.ppat_loc = (copy_location ppat_loc);
      To.Parsetree.ppat_attributes =
        (copy_attributes ppat_attributes)
    }

and copy_pattern_desc :
  From.Parsetree.pattern_desc -> To.Parsetree.pattern_desc =
  function
  | From.Parsetree.Ppat_any  -> To.Parsetree.Ppat_any
  | From.Parsetree.Ppat_var x0 ->
      To.Parsetree.Ppat_var (copy_loc (fun x  -> x) x0)
  | From.Parsetree.Ppat_alias (x0,x1) ->
      To.Parsetree.Ppat_alias
        ((copy_pattern x0),
          (copy_loc (fun x  -> x) x1))
  | From.Parsetree.Ppat_constant x0 ->
      To.Parsetree.Ppat_constant (copy_constant x0)
  | From.Parsetree.Ppat_interval (x0,x1) ->
      To.Parsetree.Ppat_interval
        ((copy_constant x0),
          (copy_constant x1))
  | From.Parsetree.Ppat_tuple x0 ->
      To.Parsetree.Ppat_tuple
        (List.map copy_pattern x0)
  | From.Parsetree.Ppat_construct (x0,x1) ->
      To.Parsetree.Ppat_construct
        ((copy_loc copy_longident x0),
          (copy_option copy_pattern x1))
  | From.Parsetree.Ppat_variant (x0,x1) ->
      To.Parsetree.Ppat_variant
        ((copy_label x0),
          (copy_option copy_pattern x1))
  | From.Parsetree.Ppat_record (x0,x1) ->
      To.Parsetree.Ppat_record
        ((List.map
            (fun x  ->
               let (x0,x1) = x  in
               ((copy_loc copy_longident x0),
                 (copy_pattern x1))) x0),
          (copy_closed_flag x1))
  | From.Parsetree.Ppat_array x0 ->
      To.Parsetree.Ppat_array
        (List.map copy_pattern x0)
  | From.Parsetree.Ppat_or (x0,x1) ->
      To.Parsetree.Ppat_or
        ((copy_pattern x0),
          (copy_pattern x1))
  | From.Parsetree.Ppat_constraint (x0,x1) ->
      To.Parsetree.Ppat_constraint
        ((copy_pattern x0),
          (copy_core_type x1))
  | From.Parsetree.Ppat_type x0 ->
      To.Parsetree.Ppat_type
        (copy_loc copy_longident x0)
  | From.Parsetree.Ppat_lazy x0 ->
      To.Parsetree.Ppat_lazy (copy_pattern x0)
  | From.Parsetree.Ppat_unpack x0 ->
      To.Parsetree.Ppat_unpack
        (copy_loc (fun x  -> x) x0)
  | From.Parsetree.Ppat_exception x0 ->
      To.Parsetree.Ppat_exception (copy_pattern x0)
  | From.Parsetree.Ppat_extension x0 ->
      To.Parsetree.Ppat_extension (copy_extension x0)
  | From.Parsetree.Ppat_open (x0,x1) ->
      To.Parsetree.Ppat_open
        ((copy_loc copy_longident x0),
          (copy_pattern x1))

and copy_core_type :
  From.Parsetree.core_type -> To.Parsetree.core_type =
  fun
    { From.Parsetree.ptyp_desc = ptyp_desc;
      From.Parsetree.ptyp_loc = ptyp_loc;
      From.Parsetree.ptyp_attributes = ptyp_attributes }
     ->
    {
      To.Parsetree.ptyp_desc =
        (copy_core_type_desc ptyp_desc);
      To.Parsetree.ptyp_loc = (copy_location ptyp_loc);
      To.Parsetree.ptyp_attributes =
        (copy_attributes ptyp_attributes)
    }

and copy_core_type_desc :
  From.Parsetree.core_type_desc -> To.Parsetree.core_type_desc =
  function
  | From.Parsetree.Ptyp_any  -> To.Parsetree.Ptyp_any
  | From.Parsetree.Ptyp_var x0 -> To.Parsetree.Ptyp_var x0
  | From.Parsetree.Ptyp_arrow (x0,x1,x2) ->
      To.Parsetree.Ptyp_arrow
        ((copy_arg_label x0),
          (copy_core_type x1),
          (copy_core_type x2))
  | From.Parsetree.Ptyp_tuple x0 ->
      To.Parsetree.Ptyp_tuple
        (List.map copy_core_type x0)
  | From.Parsetree.Ptyp_constr (x0,x1) ->
      To.Parsetree.Ptyp_constr
        ((copy_loc copy_longident x0),
          (List.map copy_core_type x1))
  | From.Parsetree.Ptyp_object (x0,x1) ->
      To.Parsetree.Ptyp_object
        ((List.map
            (function
              | From.Parsetree.Otag (x0,x1,x2) ->
               (copy_loc (fun x  -> x) x0, (copy_attributes x1),
                (copy_core_type x2))
              | From.Parsetree.Oinherit _ ->
                migration_error Location.none Def.Oinherit) x0),
          (copy_closed_flag x1))
  | From.Parsetree.Ptyp_class (x0,x1) ->
      To.Parsetree.Ptyp_class
        ((copy_loc copy_longident x0),
          (List.map copy_core_type x1))
  | From.Parsetree.Ptyp_alias (x0,x1) ->
      To.Parsetree.Ptyp_alias
        ((copy_core_type x0), x1)
  | From.Parsetree.Ptyp_variant (x0,x1,x2) ->
      To.Parsetree.Ptyp_variant
        ((List.map copy_row_field x0),
          (copy_closed_flag x1),
          (copy_option (fun x  -> List.map copy_label x) x2))
  | From.Parsetree.Ptyp_poly (x0,x1) ->
      To.Parsetree.Ptyp_poly
        ((List.map (fun x  -> copy_loc (fun x  -> x) x) x0), (copy_core_type x1))
  | From.Parsetree.Ptyp_package x0 ->
      To.Parsetree.Ptyp_package (copy_package_type x0)
  | From.Parsetree.Ptyp_extension x0 ->
      To.Parsetree.Ptyp_extension (copy_extension x0)

and copy_package_type :
  From.Parsetree.package_type -> To.Parsetree.package_type =
  fun x  ->
    let (x0,x1) = x  in
    ((copy_loc copy_longident x0),
      (List.map
         (fun x  ->
            let (x0,x1) = x  in
            ((copy_loc copy_longident x0),
              (copy_core_type x1))) x1))

and copy_row_field :
  From.Parsetree.row_field -> To.Parsetree.row_field =
  function
  | From.Parsetree.Rtag (x0,x1,x2,x3) ->
      To.Parsetree.Rtag
        ((copy_label x0.txt),
          (copy_attributes x1), (copy_bool x2),
          (List.map copy_core_type x3))
  | From.Parsetree.Rinherit x0 ->
      To.Parsetree.Rinherit (copy_core_type x0)

and copy_attributes :
  From.Parsetree.attributes -> To.Parsetree.attributes =
  fun x  -> List.map copy_attribute x

and copy_attribute :
  From.Parsetree.attribute -> To.Parsetree.attribute =
  fun x  ->
    let (x0,x1) = x  in
    ((copy_loc (fun x  -> x) x0),
      (copy_payload x1))

and copy_payload :
  From.Parsetree.payload -> To.Parsetree.payload =
  function
  | From.Parsetree.PStr x0 ->
      To.Parsetree.PStr (copy_structure x0)
  | From.Parsetree.PSig x0 ->
      To.Parsetree.PSig (copy_signature x0)
  | From.Parsetree.PTyp x0 ->
      To.Parsetree.PTyp (copy_core_type x0)
  | From.Parsetree.PPat (x0,x1) ->
      To.Parsetree.PPat
        ((copy_pattern x0),
          (copy_option copy_expression x1))

and copy_structure :
  From.Parsetree.structure -> To.Parsetree.structure =
  fun x  -> List.map copy_structure_item x

and copy_structure_item :
  From.Parsetree.structure_item -> To.Parsetree.structure_item =
  fun
    { From.Parsetree.pstr_desc = pstr_desc;
      From.Parsetree.pstr_loc = pstr_loc }
     ->
    {
      To.Parsetree.pstr_desc =
        (copy_structure_item_desc pstr_desc);
      To.Parsetree.pstr_loc = (copy_location pstr_loc)
    }

and copy_structure_item_desc :
  From.Parsetree.structure_item_desc ->
    To.Parsetree.structure_item_desc
  =
  function
  | From.Parsetree.Pstr_eval (x0,x1) ->
      To.Parsetree.Pstr_eval
        ((copy_expression x0),
          (copy_attributes x1))
  | From.Parsetree.Pstr_value (x0,x1) ->
      To.Parsetree.Pstr_value
        ((copy_rec_flag x0),
          (List.map copy_value_binding x1))
  | From.Parsetree.Pstr_primitive x0 ->
      To.Parsetree.Pstr_primitive
        (copy_value_description x0)
  | From.Parsetree.Pstr_type (x0,x1) ->
      To.Parsetree.Pstr_type
        ((copy_rec_flag x0),
          (List.map copy_type_declaration x1))
  | From.Parsetree.Pstr_typext x0 ->
      To.Parsetree.Pstr_typext
        (copy_type_extension x0)
  | From.Parsetree.Pstr_exception x0 ->
      To.Parsetree.Pstr_exception
        (copy_extension_constructor x0)
  | From.Parsetree.Pstr_module x0 ->
      To.Parsetree.Pstr_module
        (copy_module_binding x0)
  | From.Parsetree.Pstr_recmodule x0 ->
      To.Parsetree.Pstr_recmodule
        (List.map copy_module_binding x0)
  | From.Parsetree.Pstr_modtype x0 ->
      To.Parsetree.Pstr_modtype
        (copy_module_type_declaration x0)
  | From.Parsetree.Pstr_open x0 ->
      To.Parsetree.Pstr_open
        (copy_open_description x0)
  | From.Parsetree.Pstr_class x0 ->
      To.Parsetree.Pstr_class
        (List.map copy_class_declaration x0)
  | From.Parsetree.Pstr_class_type x0 ->
      To.Parsetree.Pstr_class_type
        (List.map copy_class_type_declaration x0)
  | From.Parsetree.Pstr_include x0 ->
      To.Parsetree.Pstr_include
        (copy_include_declaration x0)
  | From.Parsetree.Pstr_attribute x0 ->
      To.Parsetree.Pstr_attribute (copy_attribute x0)
  | From.Parsetree.Pstr_extension (x0,x1) ->
      To.Parsetree.Pstr_extension
        ((copy_extension x0),
          (copy_attributes x1))

and copy_include_declaration :
  From.Parsetree.include_declaration ->
    To.Parsetree.include_declaration
  =
  fun x  ->
    copy_include_infos copy_module_expr x

and copy_class_declaration :
  From.Parsetree.class_declaration -> To.Parsetree.class_declaration
  =
  fun x  ->
    copy_class_infos copy_class_expr x

and copy_class_expr :
  From.Parsetree.class_expr -> To.Parsetree.class_expr =
  fun
    { From.Parsetree.pcl_desc = pcl_desc;
      From.Parsetree.pcl_loc = pcl_loc;
      From.Parsetree.pcl_attributes = pcl_attributes }
     ->
    {
      To.Parsetree.pcl_desc =
        (copy_class_expr_desc pcl_desc);
      To.Parsetree.pcl_loc = (copy_location pcl_loc);
      To.Parsetree.pcl_attributes =
        (copy_attributes pcl_attributes)
    }

and copy_class_expr_desc :
  From.Parsetree.class_expr_desc -> To.Parsetree.class_expr_desc =
  function
  | From.Parsetree.Pcl_constr (x0,x1) ->
      To.Parsetree.Pcl_constr
        ((copy_loc copy_longident x0),
          (List.map copy_core_type x1))
  | From.Parsetree.Pcl_structure x0 ->
      To.Parsetree.Pcl_structure
        (copy_class_structure x0)
  | From.Parsetree.Pcl_fun (x0,x1,x2,x3) ->
      To.Parsetree.Pcl_fun
        ((copy_arg_label x0),
          (copy_option copy_expression x1),
          (copy_pattern x2),
          (copy_class_expr x3))
  | From.Parsetree.Pcl_apply (x0,x1) ->
      To.Parsetree.Pcl_apply
        ((copy_class_expr x0),
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                ((copy_arg_label x0),
                  (copy_expression x1))) x1))
  | From.Parsetree.Pcl_let (x0,x1,x2) ->
      To.Parsetree.Pcl_let
        ((copy_rec_flag x0),
          (List.map copy_value_binding x1),
          (copy_class_expr x2))
  | From.Parsetree.Pcl_constraint (x0,x1) ->
      To.Parsetree.Pcl_constraint
        ((copy_class_expr x0),
          (copy_class_type x1))
  | From.Parsetree.Pcl_extension x0 ->
      To.Parsetree.Pcl_extension (copy_extension x0)
  | From.Parsetree.Pcl_open (_, loc, _) ->
      migration_error loc.From.Location.loc Def.Pcl_open

and copy_class_structure :
  From.Parsetree.class_structure -> To.Parsetree.class_structure =
  fun
    { From.Parsetree.pcstr_self = pcstr_self;
      From.Parsetree.pcstr_fields = pcstr_fields }
     ->
    {
      To.Parsetree.pcstr_self =
        (copy_pattern pcstr_self);
      To.Parsetree.pcstr_fields =
        (List.map copy_class_field pcstr_fields)
    }

and copy_class_field :
  From.Parsetree.class_field -> To.Parsetree.class_field =
  fun
    { From.Parsetree.pcf_desc = pcf_desc;
      From.Parsetree.pcf_loc = pcf_loc;
      From.Parsetree.pcf_attributes = pcf_attributes }
     ->
    {
      To.Parsetree.pcf_desc =
        (copy_class_field_desc pcf_desc);
      To.Parsetree.pcf_loc = (copy_location pcf_loc);
      To.Parsetree.pcf_attributes =
        (copy_attributes pcf_attributes)
    }

and copy_class_field_desc :
  From.Parsetree.class_field_desc -> To.Parsetree.class_field_desc =
  function
  | From.Parsetree.Pcf_inherit (x0,x1,x2) ->
      To.Parsetree.Pcf_inherit
        ((copy_override_flag x0),
          (copy_class_expr x1),
          (copy_option (copy_loc (fun x  -> x)) x2))
  | From.Parsetree.Pcf_val x0 ->
      To.Parsetree.Pcf_val
        (let (x0,x1,x2) = x0  in
         ((copy_loc (fun x  -> x) x0),
           (copy_mutable_flag x1),
           (copy_class_field_kind x2)))
  | From.Parsetree.Pcf_method x0 ->
      To.Parsetree.Pcf_method
        (let (x0,x1,x2) = x0  in
         ((copy_loc (fun x  -> x) x0),
           (copy_private_flag x1),
           (copy_class_field_kind x2)))
  | From.Parsetree.Pcf_constraint x0 ->
      To.Parsetree.Pcf_constraint
        (let (x0,x1) = x0  in
         ((copy_core_type x0),
           (copy_core_type x1)))
  | From.Parsetree.Pcf_initializer x0 ->
      To.Parsetree.Pcf_initializer
        (copy_expression x0)
  | From.Parsetree.Pcf_attribute x0 ->
      To.Parsetree.Pcf_attribute (copy_attribute x0)
  | From.Parsetree.Pcf_extension x0 ->
      To.Parsetree.Pcf_extension (copy_extension x0)

and copy_class_field_kind :
  From.Parsetree.class_field_kind -> To.Parsetree.class_field_kind =
  function
  | From.Parsetree.Cfk_virtual x0 ->
      To.Parsetree.Cfk_virtual (copy_core_type x0)
  | From.Parsetree.Cfk_concrete (x0,x1) ->
      To.Parsetree.Cfk_concrete
        ((copy_override_flag x0),
          (copy_expression x1))

and copy_module_binding :
  From.Parsetree.module_binding -> To.Parsetree.module_binding =
  fun
    { From.Parsetree.pmb_name = pmb_name;
      From.Parsetree.pmb_expr = pmb_expr;
      From.Parsetree.pmb_attributes = pmb_attributes;
      From.Parsetree.pmb_loc = pmb_loc }
     ->
    {
      To.Parsetree.pmb_name =
        (copy_loc (fun x  -> x) pmb_name);
      To.Parsetree.pmb_expr =
        (copy_module_expr pmb_expr);
      To.Parsetree.pmb_attributes =
        (copy_attributes pmb_attributes);
      To.Parsetree.pmb_loc = (copy_location pmb_loc)
    }

and copy_module_expr :
  From.Parsetree.module_expr -> To.Parsetree.module_expr =
  fun
    { From.Parsetree.pmod_desc = pmod_desc;
      From.Parsetree.pmod_loc = pmod_loc;
      From.Parsetree.pmod_attributes = pmod_attributes }
     ->
    {
      To.Parsetree.pmod_desc =
        (copy_module_expr_desc pmod_desc);
      To.Parsetree.pmod_loc = (copy_location pmod_loc);
      To.Parsetree.pmod_attributes =
        (copy_attributes pmod_attributes)
    }

and copy_module_expr_desc :
  From.Parsetree.module_expr_desc -> To.Parsetree.module_expr_desc =
  function
  | From.Parsetree.Pmod_ident x0 ->
      To.Parsetree.Pmod_ident
        (copy_loc copy_longident x0)
  | From.Parsetree.Pmod_structure x0 ->
      To.Parsetree.Pmod_structure (copy_structure x0)
  | From.Parsetree.Pmod_functor (x0,x1,x2) ->
      To.Parsetree.Pmod_functor
        ((copy_loc (fun x  -> x) x0),
          (copy_option copy_module_type x1),
          (copy_module_expr x2))
  | From.Parsetree.Pmod_apply (x0,x1) ->
      To.Parsetree.Pmod_apply
        ((copy_module_expr x0),
          (copy_module_expr x1))
  | From.Parsetree.Pmod_constraint (x0,x1) ->
      To.Parsetree.Pmod_constraint
        ((copy_module_expr x0),
          (copy_module_type x1))
  | From.Parsetree.Pmod_unpack x0 ->
      To.Parsetree.Pmod_unpack (copy_expression x0)
  | From.Parsetree.Pmod_extension x0 ->
      To.Parsetree.Pmod_extension (copy_extension x0)

and copy_module_type :
  From.Parsetree.module_type -> To.Parsetree.module_type =
  fun
    { From.Parsetree.pmty_desc = pmty_desc;
      From.Parsetree.pmty_loc = pmty_loc;
      From.Parsetree.pmty_attributes = pmty_attributes }
     ->
    {
      To.Parsetree.pmty_desc =
        (copy_module_type_desc pmty_desc);
      To.Parsetree.pmty_loc = (copy_location pmty_loc);
      To.Parsetree.pmty_attributes =
        (copy_attributes pmty_attributes)
    }

and copy_module_type_desc :
  From.Parsetree.module_type_desc -> To.Parsetree.module_type_desc =
  function
  | From.Parsetree.Pmty_ident x0 ->
      To.Parsetree.Pmty_ident
        (copy_loc copy_longident x0)
  | From.Parsetree.Pmty_signature x0 ->
      To.Parsetree.Pmty_signature (copy_signature x0)
  | From.Parsetree.Pmty_functor (x0,x1,x2) ->
      To.Parsetree.Pmty_functor
        ((copy_loc (fun x  -> x) x0),
          (copy_option copy_module_type x1),
          (copy_module_type x2))
  | From.Parsetree.Pmty_with (x0,x1) ->
      To.Parsetree.Pmty_with
        ((copy_module_type x0),
          (List.map copy_with_constraint x1))
  | From.Parsetree.Pmty_typeof x0 ->
      To.Parsetree.Pmty_typeof (copy_module_expr x0)
  | From.Parsetree.Pmty_extension x0 ->
      To.Parsetree.Pmty_extension (copy_extension x0)
  | From.Parsetree.Pmty_alias x0 ->
      To.Parsetree.Pmty_alias
        (copy_loc copy_longident x0)

and copy_with_constraint :
  From.Parsetree.with_constraint -> To.Parsetree.with_constraint =
  function
  | From.Parsetree.Pwith_type (x0,x1) ->
      To.Parsetree.Pwith_type
        ((copy_loc copy_longident x0),
          (copy_type_declaration x1))
  | From.Parsetree.Pwith_module (x0,x1) ->
      To.Parsetree.Pwith_module
        ((copy_loc copy_longident x0),
          (copy_loc copy_longident x1))
  | From.Parsetree.Pwith_typesubst ({ txt = Longident.Lident _; _ }, x0) ->
      To.Parsetree.Pwith_typesubst
        (copy_type_declaration x0)
  | From.Parsetree.Pwith_modsubst ({ txt = Longident.Lident x0; loc },x1) ->
      To.Parsetree.Pwith_modsubst
        ({ txt = x0; loc }, (copy_loc copy_longident x1))
  | From.Parsetree.Pwith_typesubst ({ loc; _ }, _x0) ->
      migration_error loc Pwith_typesubst_longident
  | From.Parsetree.Pwith_modsubst ({ loc; _ },_x1) ->
      migration_error loc Pwith_modsubst_longident

and copy_signature :
  From.Parsetree.signature -> To.Parsetree.signature =
  fun x  -> List.map copy_signature_item x

and copy_signature_item :
  From.Parsetree.signature_item -> To.Parsetree.signature_item =
  fun
    { From.Parsetree.psig_desc = psig_desc;
      From.Parsetree.psig_loc = psig_loc }
     ->
    {
      To.Parsetree.psig_desc =
        (copy_signature_item_desc psig_desc);
      To.Parsetree.psig_loc = (copy_location psig_loc)
    }

and copy_signature_item_desc :
  From.Parsetree.signature_item_desc ->
    To.Parsetree.signature_item_desc
  =
  function
  | From.Parsetree.Psig_value x0 ->
      To.Parsetree.Psig_value
        (copy_value_description x0)
  | From.Parsetree.Psig_type (x0,x1) ->
      To.Parsetree.Psig_type
        ((copy_rec_flag x0),
          (List.map copy_type_declaration x1))
  | From.Parsetree.Psig_typext x0 ->
      To.Parsetree.Psig_typext
        (copy_type_extension x0)
  | From.Parsetree.Psig_exception x0 ->
      To.Parsetree.Psig_exception
        (copy_extension_constructor x0)
  | From.Parsetree.Psig_module x0 ->
      To.Parsetree.Psig_module
        (copy_module_declaration x0)
  | From.Parsetree.Psig_recmodule x0 ->
      To.Parsetree.Psig_recmodule
        (List.map copy_module_declaration x0)
  | From.Parsetree.Psig_modtype x0 ->
      To.Parsetree.Psig_modtype
        (copy_module_type_declaration x0)
  | From.Parsetree.Psig_open x0 ->
      To.Parsetree.Psig_open
        (copy_open_description x0)
  | From.Parsetree.Psig_include x0 ->
      To.Parsetree.Psig_include
        (copy_include_description x0)
  | From.Parsetree.Psig_class x0 ->
      To.Parsetree.Psig_class
        (List.map copy_class_description x0)
  | From.Parsetree.Psig_class_type x0 ->
      To.Parsetree.Psig_class_type
        (List.map copy_class_type_declaration x0)
  | From.Parsetree.Psig_attribute x0 ->
      To.Parsetree.Psig_attribute (copy_attribute x0)
  | From.Parsetree.Psig_extension (x0,x1) ->
      To.Parsetree.Psig_extension
        ((copy_extension x0),
          (copy_attributes x1))

and copy_class_type_declaration :
  From.Parsetree.class_type_declaration ->
    To.Parsetree.class_type_declaration
  =
  fun x  ->
    copy_class_infos copy_class_type x

and copy_class_description :
  From.Parsetree.class_description -> To.Parsetree.class_description
  =
  fun x  ->
    copy_class_infos copy_class_type x

and copy_class_type :
  From.Parsetree.class_type -> To.Parsetree.class_type =
  fun
    { From.Parsetree.pcty_desc = pcty_desc;
      From.Parsetree.pcty_loc = pcty_loc;
      From.Parsetree.pcty_attributes = pcty_attributes }
     ->
    {
      To.Parsetree.pcty_desc =
        (copy_class_type_desc pcty_desc);
      To.Parsetree.pcty_loc = (copy_location pcty_loc);
      To.Parsetree.pcty_attributes =
        (copy_attributes pcty_attributes)
    }

and copy_class_type_desc :
  From.Parsetree.class_type_desc -> To.Parsetree.class_type_desc =
  function
  | From.Parsetree.Pcty_constr (x0,x1) ->
      To.Parsetree.Pcty_constr
        ((copy_loc copy_longident x0),
          (List.map copy_core_type x1))
  | From.Parsetree.Pcty_signature x0 ->
      To.Parsetree.Pcty_signature
        (copy_class_signature x0)
  | From.Parsetree.Pcty_arrow (x0,x1,x2) ->
      To.Parsetree.Pcty_arrow
        ((copy_arg_label x0),
          (copy_core_type x1),
          (copy_class_type x2))
  | From.Parsetree.Pcty_extension x0 ->
      To.Parsetree.Pcty_extension (copy_extension x0)
  | From.Parsetree.Pcty_open (_, loc, _) ->
      migration_error loc.From.Location.loc Def.Pcty_open

and copy_class_signature :
  From.Parsetree.class_signature -> To.Parsetree.class_signature =
  fun
    { From.Parsetree.pcsig_self = pcsig_self;
      From.Parsetree.pcsig_fields = pcsig_fields }
     ->
    {
      To.Parsetree.pcsig_self =
        (copy_core_type pcsig_self);
      To.Parsetree.pcsig_fields =
        (List.map copy_class_type_field pcsig_fields)
    }

and copy_class_type_field :
  From.Parsetree.class_type_field -> To.Parsetree.class_type_field =
  fun
    { From.Parsetree.pctf_desc = pctf_desc;
      From.Parsetree.pctf_loc = pctf_loc;
      From.Parsetree.pctf_attributes = pctf_attributes }
     ->
    {
      To.Parsetree.pctf_desc =
        (copy_class_type_field_desc pctf_desc);
      To.Parsetree.pctf_loc = (copy_location pctf_loc);
      To.Parsetree.pctf_attributes =
        (copy_attributes pctf_attributes)
    }

and copy_class_type_field_desc :
  From.Parsetree.class_type_field_desc ->
    To.Parsetree.class_type_field_desc
  =
  function
  | From.Parsetree.Pctf_inherit x0 ->
      To.Parsetree.Pctf_inherit (copy_class_type x0)
  | From.Parsetree.Pctf_val x0 ->
      To.Parsetree.Pctf_val
        (let (x0,x1,x2,x3) = x0  in
         (copy_loc (fun x  -> x) x0, (copy_mutable_flag x1),
           (copy_virtual_flag x2),
           (copy_core_type x3)))
  | From.Parsetree.Pctf_method x0 ->
      To.Parsetree.Pctf_method
        (let (x0,x1,x2,x3) = x0  in
         (copy_loc (fun x  -> x) x0, (copy_private_flag x1),
           (copy_virtual_flag x2),
           (copy_core_type x3)))
  | From.Parsetree.Pctf_constraint x0 ->
      To.Parsetree.Pctf_constraint
        (let (x0,x1) = x0  in
         ((copy_core_type x0),
           (copy_core_type x1)))
  | From.Parsetree.Pctf_attribute x0 ->
      To.Parsetree.Pctf_attribute (copy_attribute x0)
  | From.Parsetree.Pctf_extension x0 ->
      To.Parsetree.Pctf_extension (copy_extension x0)

and copy_extension :
  From.Parsetree.extension -> To.Parsetree.extension =
  fun x  ->
    let (x0,x1) = x  in
    ((copy_loc (fun x  -> x) x0),
      (copy_payload x1))

and copy_class_infos :
  'f0 'g0 .
    ('f0 -> 'g0) ->
      'f0 From.Parsetree.class_infos -> 'g0 To.Parsetree.class_infos
  =
  fun f0  ->
    fun
      { From.Parsetree.pci_virt = pci_virt;
        From.Parsetree.pci_params = pci_params;
        From.Parsetree.pci_name = pci_name;
        From.Parsetree.pci_expr = pci_expr;
        From.Parsetree.pci_loc = pci_loc;
        From.Parsetree.pci_attributes = pci_attributes }
       ->
      {
        To.Parsetree.pci_virt =
          (copy_virtual_flag pci_virt);
        To.Parsetree.pci_params =
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                ((copy_core_type x0),
                  (copy_variance x1))) pci_params);
        To.Parsetree.pci_name =
          (copy_loc (fun x  -> x) pci_name);
        To.Parsetree.pci_expr = (f0 pci_expr);
        To.Parsetree.pci_loc = (copy_location pci_loc);
        To.Parsetree.pci_attributes =
          (copy_attributes pci_attributes)
      }

and copy_virtual_flag :
  From.Asttypes.virtual_flag -> To.Asttypes.virtual_flag =
  function
  | From.Asttypes.Virtual  -> To.Asttypes.Virtual
  | From.Asttypes.Concrete  -> To.Asttypes.Concrete

and copy_include_description :
  From.Parsetree.include_description ->
    To.Parsetree.include_description
  =
  fun x  ->
    copy_include_infos copy_module_type x

and copy_include_infos :
  'f0 'g0 .
    ('f0 -> 'g0) ->
      'f0 From.Parsetree.include_infos ->
        'g0 To.Parsetree.include_infos
  =
  fun f0  ->
    fun
      { From.Parsetree.pincl_mod = pincl_mod;
        From.Parsetree.pincl_loc = pincl_loc;
        From.Parsetree.pincl_attributes = pincl_attributes }
       ->
      {
        To.Parsetree.pincl_mod = (f0 pincl_mod);
        To.Parsetree.pincl_loc = (copy_location pincl_loc);
        To.Parsetree.pincl_attributes =
          (copy_attributes pincl_attributes)
      }

and copy_open_description :
  From.Parsetree.open_description -> To.Parsetree.open_description =
  fun
    { From.Parsetree.popen_lid = popen_lid;
      From.Parsetree.popen_override = popen_override;
      From.Parsetree.popen_loc = popen_loc;
      From.Parsetree.popen_attributes = popen_attributes }
     ->
    {
      To.Parsetree.popen_lid =
        (copy_loc copy_longident popen_lid);
      To.Parsetree.popen_override =
        (copy_override_flag popen_override);
      To.Parsetree.popen_loc = (copy_location popen_loc);
      To.Parsetree.popen_attributes =
        (copy_attributes popen_attributes)
    }

and copy_override_flag :
  From.Asttypes.override_flag -> To.Asttypes.override_flag =
  function
  | From.Asttypes.Override  -> To.Asttypes.Override
  | From.Asttypes.Fresh  -> To.Asttypes.Fresh

and copy_module_type_declaration :
  From.Parsetree.module_type_declaration ->
    To.Parsetree.module_type_declaration
  =
  fun
    { From.Parsetree.pmtd_name = pmtd_name;
      From.Parsetree.pmtd_type = pmtd_type;
      From.Parsetree.pmtd_attributes = pmtd_attributes;
      From.Parsetree.pmtd_loc = pmtd_loc }
     ->
    {
      To.Parsetree.pmtd_name =
        (copy_loc (fun x  -> x) pmtd_name);
      To.Parsetree.pmtd_type =
        (copy_option copy_module_type pmtd_type);
      To.Parsetree.pmtd_attributes =
        (copy_attributes pmtd_attributes);
      To.Parsetree.pmtd_loc = (copy_location pmtd_loc)
    }

and copy_module_declaration :
  From.Parsetree.module_declaration ->
    To.Parsetree.module_declaration
  =
  fun
    { From.Parsetree.pmd_name = pmd_name;
      From.Parsetree.pmd_type = pmd_type;
      From.Parsetree.pmd_attributes = pmd_attributes;
      From.Parsetree.pmd_loc = pmd_loc }
     ->
    {
      To.Parsetree.pmd_name =
        (copy_loc (fun x  -> x) pmd_name);
      To.Parsetree.pmd_type =
        (copy_module_type pmd_type);
      To.Parsetree.pmd_attributes =
        (copy_attributes pmd_attributes);
      To.Parsetree.pmd_loc = (copy_location pmd_loc)
    }

and copy_type_extension :
  From.Parsetree.type_extension -> To.Parsetree.type_extension =
  fun
    { From.Parsetree.ptyext_path = ptyext_path;
      From.Parsetree.ptyext_params = ptyext_params;
      From.Parsetree.ptyext_constructors = ptyext_constructors;
      From.Parsetree.ptyext_private = ptyext_private;
      From.Parsetree.ptyext_attributes = ptyext_attributes }
     ->
    {
      To.Parsetree.ptyext_path =
        (copy_loc copy_longident ptyext_path);
      To.Parsetree.ptyext_params =
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_core_type x0),
                (copy_variance x1))) ptyext_params);
      To.Parsetree.ptyext_constructors =
        (List.map copy_extension_constructor
           ptyext_constructors);
      To.Parsetree.ptyext_private =
        (copy_private_flag ptyext_private);
      To.Parsetree.ptyext_attributes =
        (copy_attributes ptyext_attributes)
    }

and copy_extension_constructor :
  From.Parsetree.extension_constructor ->
    To.Parsetree.extension_constructor
  =
  fun
    { From.Parsetree.pext_name = pext_name;
      From.Parsetree.pext_kind = pext_kind;
      From.Parsetree.pext_loc = pext_loc;
      From.Parsetree.pext_attributes = pext_attributes }
     ->
    {
      To.Parsetree.pext_name =
        (copy_loc (fun x  -> x) pext_name);
      To.Parsetree.pext_kind =
        (copy_extension_constructor_kind pext_kind);
      To.Parsetree.pext_loc = (copy_location pext_loc);
      To.Parsetree.pext_attributes =
        (copy_attributes pext_attributes)
    }

and copy_extension_constructor_kind :
  From.Parsetree.extension_constructor_kind ->
    To.Parsetree.extension_constructor_kind
  =
  function
  | From.Parsetree.Pext_decl (x0,x1) ->
      To.Parsetree.Pext_decl
        ((copy_constructor_arguments x0),
          (copy_option copy_core_type x1))
  | From.Parsetree.Pext_rebind x0 ->
      To.Parsetree.Pext_rebind
        (copy_loc copy_longident x0)

and copy_type_declaration :
  From.Parsetree.type_declaration -> To.Parsetree.type_declaration =
  fun
    { From.Parsetree.ptype_name = ptype_name;
      From.Parsetree.ptype_params = ptype_params;
      From.Parsetree.ptype_cstrs = ptype_cstrs;
      From.Parsetree.ptype_kind = ptype_kind;
      From.Parsetree.ptype_private = ptype_private;
      From.Parsetree.ptype_manifest = ptype_manifest;
      From.Parsetree.ptype_attributes = ptype_attributes;
      From.Parsetree.ptype_loc = ptype_loc }
     ->
    {
      To.Parsetree.ptype_name =
        (copy_loc (fun x  -> x) ptype_name);
      To.Parsetree.ptype_params =
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_core_type x0),
                (copy_variance x1))) ptype_params);
      To.Parsetree.ptype_cstrs =
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              ((copy_core_type x0),
                (copy_core_type x1),
                (copy_location x2))) ptype_cstrs);
      To.Parsetree.ptype_kind =
        (copy_type_kind ptype_kind);
      To.Parsetree.ptype_private =
        (copy_private_flag ptype_private);
      To.Parsetree.ptype_manifest =
        (copy_option copy_core_type ptype_manifest);
      To.Parsetree.ptype_attributes =
        (copy_attributes ptype_attributes);
      To.Parsetree.ptype_loc = (copy_location ptype_loc)
    }

and copy_private_flag :
  From.Asttypes.private_flag -> To.Asttypes.private_flag =
  function
  | From.Asttypes.Private  -> To.Asttypes.Private
  | From.Asttypes.Public  -> To.Asttypes.Public

and copy_type_kind :
  From.Parsetree.type_kind -> To.Parsetree.type_kind =
  function
  | From.Parsetree.Ptype_abstract  -> To.Parsetree.Ptype_abstract
  | From.Parsetree.Ptype_variant x0 ->
      To.Parsetree.Ptype_variant
        (List.map copy_constructor_declaration x0)
  | From.Parsetree.Ptype_record x0 ->
      To.Parsetree.Ptype_record
        (List.map copy_label_declaration x0)
  | From.Parsetree.Ptype_open  -> To.Parsetree.Ptype_open

and copy_constructor_declaration :
  From.Parsetree.constructor_declaration ->
    To.Parsetree.constructor_declaration
  =
  fun
    { From.Parsetree.pcd_name = pcd_name;
      From.Parsetree.pcd_args = pcd_args;
      From.Parsetree.pcd_res = pcd_res;
      From.Parsetree.pcd_loc = pcd_loc;
      From.Parsetree.pcd_attributes = pcd_attributes }
     ->
    {
      To.Parsetree.pcd_name =
        (copy_loc (fun x  -> x) pcd_name);
      To.Parsetree.pcd_args =
        (copy_constructor_arguments pcd_args);
      To.Parsetree.pcd_res =
        (copy_option copy_core_type pcd_res);
      To.Parsetree.pcd_loc = (copy_location pcd_loc);
      To.Parsetree.pcd_attributes =
        (copy_attributes pcd_attributes)
    }

and copy_constructor_arguments :
  From.Parsetree.constructor_arguments ->
    To.Parsetree.constructor_arguments
  =
  function
  | From.Parsetree.Pcstr_tuple x0 ->
      To.Parsetree.Pcstr_tuple
        (List.map copy_core_type x0)
  | From.Parsetree.Pcstr_record x0 ->
      To.Parsetree.Pcstr_record
        (List.map copy_label_declaration x0)

and copy_label_declaration :
  From.Parsetree.label_declaration -> To.Parsetree.label_declaration
  =
  fun
    { From.Parsetree.pld_name = pld_name;
      From.Parsetree.pld_mutable = pld_mutable;
      From.Parsetree.pld_type = pld_type;
      From.Parsetree.pld_loc = pld_loc;
      From.Parsetree.pld_attributes = pld_attributes }
     ->
    {
      To.Parsetree.pld_name =
        (copy_loc (fun x  -> x) pld_name);
      To.Parsetree.pld_mutable =
        (copy_mutable_flag pld_mutable);
      To.Parsetree.pld_type =
        (copy_core_type pld_type);
      To.Parsetree.pld_loc = (copy_location pld_loc);
      To.Parsetree.pld_attributes =
        (copy_attributes pld_attributes)
    }

and copy_mutable_flag :
  From.Asttypes.mutable_flag -> To.Asttypes.mutable_flag =
  function
  | From.Asttypes.Immutable  -> To.Asttypes.Immutable
  | From.Asttypes.Mutable  -> To.Asttypes.Mutable

and copy_variance :
  From.Asttypes.variance -> To.Asttypes.variance =
  function
  | From.Asttypes.Covariant  -> To.Asttypes.Covariant
  | From.Asttypes.Contravariant  -> To.Asttypes.Contravariant
  | From.Asttypes.Invariant  -> To.Asttypes.Invariant

and copy_value_description :
  From.Parsetree.value_description -> To.Parsetree.value_description
  =
  fun
    { From.Parsetree.pval_name = pval_name;
      From.Parsetree.pval_type = pval_type;
      From.Parsetree.pval_prim = pval_prim;
      From.Parsetree.pval_attributes = pval_attributes;
      From.Parsetree.pval_loc = pval_loc }
     ->
    {
      To.Parsetree.pval_name =
        (copy_loc (fun x  -> x) pval_name);
      To.Parsetree.pval_type =
        (copy_core_type pval_type);
      To.Parsetree.pval_prim = (List.map (fun x  -> x) pval_prim);
      To.Parsetree.pval_attributes =
        (copy_attributes pval_attributes);
      To.Parsetree.pval_loc = (copy_location pval_loc)
    }

and copy_arg_label :
  From.Asttypes.arg_label -> To.Asttypes.arg_label =
  function
  | From.Asttypes.Nolabel  -> To.Asttypes.Nolabel
  | From.Asttypes.Labelled x0 -> To.Asttypes.Labelled x0
  | From.Asttypes.Optional x0 -> To.Asttypes.Optional x0

and copy_closed_flag :
  From.Asttypes.closed_flag -> To.Asttypes.closed_flag =
  function
  | From.Asttypes.Closed  -> To.Asttypes.Closed
  | From.Asttypes.Open  -> To.Asttypes.Open

and copy_label :
  From.Asttypes.label -> To.Asttypes.label = fun x  -> x

and copy_rec_flag :
  From.Asttypes.rec_flag -> To.Asttypes.rec_flag =
  function
  | From.Asttypes.Nonrecursive  -> To.Asttypes.Nonrecursive
  | From.Asttypes.Recursive  -> To.Asttypes.Recursive

and copy_constant :
  From.Parsetree.constant -> To.Parsetree.constant =
  function
  | From.Parsetree.Pconst_integer (x0,x1) ->
      To.Parsetree.Pconst_integer (x0, (copy_option (fun x  -> x) x1))
  | From.Parsetree.Pconst_char x0 -> To.Parsetree.Pconst_char x0
  | From.Parsetree.Pconst_string (x0,x1) ->
      To.Parsetree.Pconst_string (x0, (copy_option (fun x  -> x) x1))
  | From.Parsetree.Pconst_float (x0,x1) ->
      To.Parsetree.Pconst_float (x0, (copy_option (fun x  -> x) x1))

and copy_option : 'f0 'g0 . ('f0 -> 'g0) -> 'f0 option -> 'g0 option =
  fun f0  -> function | None  -> None | Some x0 -> Some (f0 x0)

and copy_longident : From.Longident.t -> To.Longident.t =
  function
  | From.Longident.Lident x0 -> To.Longident.Lident x0
  | From.Longident.Ldot (x0,x1) ->
      To.Longident.Ldot ((copy_longident x0), x1)
  | From.Longident.Lapply (x0,x1) ->
      To.Longident.Lapply
        ((copy_longident x0), (copy_longident x1))

and copy_loc :
  'f0 'g0 .
    ('f0 -> 'g0) -> 'f0 From.Asttypes.loc -> 'g0 To.Asttypes.loc
  =
  fun f0  ->
    fun { From.Asttypes.txt = txt; From.Asttypes.loc = loc }  ->
      {
        To.Asttypes.txt = (f0 txt);
        To.Asttypes.loc = (copy_location loc)
      }

and copy_location : From.Location.t -> To.Location.t =
  fun
    { From.Location.loc_start = loc_start;
      From.Location.loc_end = loc_end;
      From.Location.loc_ghost = loc_ghost }
     ->
    {
      To.Location.loc_start = (copy_Lexing_position loc_start);
      To.Location.loc_end = (copy_Lexing_position loc_end);
      To.Location.loc_ghost = (copy_bool loc_ghost)
    }

and copy_bool : bool -> bool = function | false  -> false | true  -> true

and copy_Lexing_position : Lexing.position -> Lexing.position =
  fun
    { Lexing.pos_fname = pos_fname; Lexing.pos_lnum = pos_lnum;
      Lexing.pos_bol = pos_bol; Lexing.pos_cnum = pos_cnum }
     ->
    {
      Lexing.pos_fname = pos_fname;
      Lexing.pos_lnum = pos_lnum;
      Lexing.pos_bol = pos_bol;
      Lexing.pos_cnum = pos_cnum
    }

let rec copy_out_phrase :
  From.Outcometree.out_phrase -> To.Outcometree.out_phrase =
  function
  | From.Outcometree.Ophr_eval (x0,x1) ->
      To.Outcometree.Ophr_eval
        ((copy_out_value x0),
          (copy_out_type x1))
  | From.Outcometree.Ophr_signature x0 ->
      To.Outcometree.Ophr_signature
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_out_sig_item x0),
                (copy_option copy_out_value x1))) x0)
  | From.Outcometree.Ophr_exception x0 ->
      To.Outcometree.Ophr_exception
        (let (x0,x1) = x0  in
         ((copy_exn x0), (copy_out_value x1)))

and copy_exn : exn -> exn = fun x  -> x

and copy_out_sig_item :
  From.Outcometree.out_sig_item -> To.Outcometree.out_sig_item =
  function
  | From.Outcometree.Osig_class (x0,x1,x2,x3,x4) ->
      To.Outcometree.Osig_class
        ((copy_bool x0), x1,
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                (x0, (let (x0,x1) = x1  in ((copy_bool x0), (copy_bool x1)))))
             x2), (copy_out_class_type x3),
          (copy_out_rec_status x4))
  | From.Outcometree.Osig_class_type (x0,x1,x2,x3,x4) ->
      To.Outcometree.Osig_class_type
        ((copy_bool x0), x1,
          (List.map
             (fun x  ->
                let (x0,x1) = x  in
                (x0, (let (x0,x1) = x1  in ((copy_bool x0), (copy_bool x1)))))
             x2), (copy_out_class_type x3),
          (copy_out_rec_status x4))
  | From.Outcometree.Osig_typext (x0,x1) ->
      To.Outcometree.Osig_typext
        ((copy_out_extension_constructor x0),
          (copy_out_ext_status x1))
  | From.Outcometree.Osig_modtype (x0,x1) ->
      To.Outcometree.Osig_modtype
        (x0, (copy_out_module_type x1))
  | From.Outcometree.Osig_module (x0,x1,x2) ->
      To.Outcometree.Osig_module
        (x0, (copy_out_module_type x1),
          (copy_out_rec_status x2))
  | From.Outcometree.Osig_type (x0,x1) ->
      To.Outcometree.Osig_type
        ((copy_out_type_decl x0),
          (copy_out_rec_status x1))
  | From.Outcometree.Osig_value x0 ->
      To.Outcometree.Osig_value
        (copy_out_val_decl x0)
  | From.Outcometree.Osig_ellipsis  -> To.Outcometree.Osig_ellipsis

and copy_out_val_decl :
  From.Outcometree.out_val_decl -> To.Outcometree.out_val_decl =
  fun
    { From.Outcometree.oval_name = oval_name;
      From.Outcometree.oval_type = oval_type;
      From.Outcometree.oval_prims = oval_prims;
      From.Outcometree.oval_attributes = oval_attributes }
     ->
    {
      To.Outcometree.oval_name = oval_name;
      To.Outcometree.oval_type =
        (copy_out_type oval_type);
      To.Outcometree.oval_prims = (List.map (fun x  -> x) oval_prims);
      To.Outcometree.oval_attributes =
        (List.map copy_out_attribute oval_attributes)
    }

and copy_out_type_decl :
  From.Outcometree.out_type_decl -> To.Outcometree.out_type_decl =
  fun
    { From.Outcometree.otype_name = otype_name;
      From.Outcometree.otype_params = otype_params;
      From.Outcometree.otype_type = otype_type;
      From.Outcometree.otype_private = otype_private;
      From.Outcometree.otype_immediate = otype_immediate;
      From.Outcometree.otype_unboxed = otype_unboxed;
      From.Outcometree.otype_cstrs = otype_cstrs }
     ->
    {
      To.Outcometree.otype_name = otype_name;
      To.Outcometree.otype_params =
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              (x0, (let (x0,x1) = x1  in ((copy_bool x0), (copy_bool x1)))))
           otype_params);
      To.Outcometree.otype_type =
        (copy_out_type otype_type);
      To.Outcometree.otype_private =
        (copy_From_Asttypes_private_flag otype_private);
      To.Outcometree.otype_immediate = (copy_bool otype_immediate);
      To.Outcometree.otype_unboxed = (copy_bool otype_unboxed);
      To.Outcometree.otype_cstrs =
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_out_type x0),
                (copy_out_type x1))) otype_cstrs)
    }

and copy_out_module_type :
  From.Outcometree.out_module_type -> To.Outcometree.out_module_type
  =
  function
  | From.Outcometree.Omty_abstract  -> To.Outcometree.Omty_abstract
  | From.Outcometree.Omty_functor (x0,x1,x2) ->
      To.Outcometree.Omty_functor
        (x0, (copy_option copy_out_module_type x1),
          (copy_out_module_type x2))
  | From.Outcometree.Omty_ident x0 ->
      To.Outcometree.Omty_ident (copy_out_ident x0)
  | From.Outcometree.Omty_signature x0 ->
      To.Outcometree.Omty_signature
        (List.map copy_out_sig_item x0)
  | From.Outcometree.Omty_alias x0 ->
      To.Outcometree.Omty_alias (copy_out_ident x0)

and copy_out_ext_status :
  From.Outcometree.out_ext_status -> To.Outcometree.out_ext_status =
  function
  | From.Outcometree.Oext_first  -> To.Outcometree.Oext_first
  | From.Outcometree.Oext_next  -> To.Outcometree.Oext_next
  | From.Outcometree.Oext_exception  -> To.Outcometree.Oext_exception

and copy_out_extension_constructor :
  From.Outcometree.out_extension_constructor ->
    To.Outcometree.out_extension_constructor
  =
  fun
    { From.Outcometree.oext_name = oext_name;
      From.Outcometree.oext_type_name = oext_type_name;
      From.Outcometree.oext_type_params = oext_type_params;
      From.Outcometree.oext_args = oext_args;
      From.Outcometree.oext_ret_type = oext_ret_type;
      From.Outcometree.oext_private = oext_private }
     ->
    {
      To.Outcometree.oext_name = oext_name;
      To.Outcometree.oext_type_name = oext_type_name;
      To.Outcometree.oext_type_params =
        (List.map (fun x  -> x) oext_type_params);
      To.Outcometree.oext_args =
        (List.map copy_out_type oext_args);
      To.Outcometree.oext_ret_type =
        (copy_option copy_out_type oext_ret_type);
      To.Outcometree.oext_private =
        (copy_From_Asttypes_private_flag oext_private)
    }

and copy_From_Asttypes_private_flag :
  From.Asttypes.private_flag -> To.Asttypes.private_flag =
  function
  | From.Asttypes.Private  -> To.Asttypes.Private
  | From.Asttypes.Public  -> To.Asttypes.Public

and copy_out_rec_status :
  From.Outcometree.out_rec_status -> To.Outcometree.out_rec_status =
  function
  | From.Outcometree.Orec_not  -> To.Outcometree.Orec_not
  | From.Outcometree.Orec_first  -> To.Outcometree.Orec_first
  | From.Outcometree.Orec_next  -> To.Outcometree.Orec_next

and copy_out_class_type :
  From.Outcometree.out_class_type -> To.Outcometree.out_class_type =
  function
  | From.Outcometree.Octy_constr (x0,x1) ->
      To.Outcometree.Octy_constr
        ((copy_out_ident x0),
          (List.map copy_out_type x1))
  | From.Outcometree.Octy_arrow (x0,x1,x2) ->
      To.Outcometree.Octy_arrow
        (x0, (copy_out_type x1),
          (copy_out_class_type x2))
  | From.Outcometree.Octy_signature (x0,x1) ->
      To.Outcometree.Octy_signature
        ((copy_option copy_out_type x0),
          (List.map copy_out_class_sig_item x1))

and copy_out_class_sig_item :
  From.Outcometree.out_class_sig_item ->
    To.Outcometree.out_class_sig_item
  =
  function
  | From.Outcometree.Ocsg_constraint (x0,x1) ->
      To.Outcometree.Ocsg_constraint
        ((copy_out_type x0),
          (copy_out_type x1))
  | From.Outcometree.Ocsg_method (x0,x1,x2,x3) ->
      To.Outcometree.Ocsg_method
        (x0, (copy_bool x1), (copy_bool x2),
          (copy_out_type x3))
  | From.Outcometree.Ocsg_value (x0,x1,x2,x3) ->
      To.Outcometree.Ocsg_value
        (x0, (copy_bool x1), (copy_bool x2),
          (copy_out_type x3))

and copy_out_type :
  From.Outcometree.out_type -> To.Outcometree.out_type =
  function
  | From.Outcometree.Otyp_abstract  -> To.Outcometree.Otyp_abstract
  | From.Outcometree.Otyp_open  -> To.Outcometree.Otyp_open
  | From.Outcometree.Otyp_alias (x0,x1) ->
      To.Outcometree.Otyp_alias
        ((copy_out_type x0), x1)
  | From.Outcometree.Otyp_arrow (x0,x1,x2) ->
      To.Outcometree.Otyp_arrow
        (x0, (copy_out_type x1),
          (copy_out_type x2))
  | From.Outcometree.Otyp_class (x0,x1,x2) ->
      To.Outcometree.Otyp_class
        ((copy_bool x0), (copy_out_ident x1),
          (List.map copy_out_type x2))
  | From.Outcometree.Otyp_constr (x0,x1) ->
      To.Outcometree.Otyp_constr
        ((copy_out_ident x0),
          (List.map copy_out_type x1))
  | From.Outcometree.Otyp_manifest (x0,x1) ->
      To.Outcometree.Otyp_manifest
        ((copy_out_type x0),
          (copy_out_type x1))
  | From.Outcometree.Otyp_object (x0,x1) ->
      To.Outcometree.Otyp_object
        ((List.map
            (fun x  ->
               let (x0,x1) = x  in
               (x0, (copy_out_type x1))) x0),
          (copy_option copy_bool x1))
  | From.Outcometree.Otyp_record x0 ->
      To.Outcometree.Otyp_record
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              (x0, (copy_bool x1), (copy_out_type x2)))
           x0)
  | From.Outcometree.Otyp_stuff x0 -> To.Outcometree.Otyp_stuff x0
  | From.Outcometree.Otyp_sum x0 ->
      To.Outcometree.Otyp_sum
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              (x0, (List.map copy_out_type x1),
                (copy_option copy_out_type x2))) x0)
  | From.Outcometree.Otyp_tuple x0 ->
      To.Outcometree.Otyp_tuple
        (List.map copy_out_type x0)
  | From.Outcometree.Otyp_var (x0,x1) ->
      To.Outcometree.Otyp_var ((copy_bool x0), x1)
  | From.Outcometree.Otyp_variant (x0,x1,x2,x3) ->
      To.Outcometree.Otyp_variant
        ((copy_bool x0), (copy_out_variant x1),
          (copy_bool x2),
          (copy_option (fun x  -> List.map (fun x  -> x) x) x3))
  | From.Outcometree.Otyp_poly (x0,x1) ->
      To.Outcometree.Otyp_poly
        ((List.map (fun x  -> x) x0), (copy_out_type x1))
  | From.Outcometree.Otyp_module (x0,x1,x2) ->
      To.Outcometree.Otyp_module
        (x0, (List.map (fun x  -> x) x1),
          (List.map copy_out_type x2))
  | From.Outcometree.Otyp_attribute (x0,x1) ->
      To.Outcometree.Otyp_attribute
        ((copy_out_type x0),
          (copy_out_attribute x1))

and copy_out_attribute :
  From.Outcometree.out_attribute -> To.Outcometree.out_attribute =
  fun { From.Outcometree.oattr_name = oattr_name }  ->
    { To.Outcometree.oattr_name = oattr_name }

and copy_out_variant :
  From.Outcometree.out_variant -> To.Outcometree.out_variant =
  function
  | From.Outcometree.Ovar_fields x0 ->
      To.Outcometree.Ovar_fields
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              (x0, (copy_bool x1),
                (List.map copy_out_type x2))) x0)
  | From.Outcometree.Ovar_typ x0 ->
      To.Outcometree.Ovar_typ (copy_out_type x0)

and copy_out_value :
  From.Outcometree.out_value -> To.Outcometree.out_value =
  function
  | From.Outcometree.Oval_array x0 ->
      To.Outcometree.Oval_array
        (List.map copy_out_value x0)
  | From.Outcometree.Oval_char x0 -> To.Outcometree.Oval_char x0
  | From.Outcometree.Oval_constr (x0,x1) ->
      To.Outcometree.Oval_constr
        ((copy_out_ident x0),
          (List.map copy_out_value x1))
  | From.Outcometree.Oval_ellipsis  -> To.Outcometree.Oval_ellipsis
  | From.Outcometree.Oval_float x0 ->
      To.Outcometree.Oval_float (copy_float x0)
  | From.Outcometree.Oval_int x0 -> To.Outcometree.Oval_int x0
  | From.Outcometree.Oval_int32 x0 -> To.Outcometree.Oval_int32 x0
  | From.Outcometree.Oval_int64 x0 -> To.Outcometree.Oval_int64 x0
  | From.Outcometree.Oval_nativeint x0 ->
      To.Outcometree.Oval_nativeint x0
  | From.Outcometree.Oval_list x0 ->
      To.Outcometree.Oval_list
        (List.map copy_out_value x0)
  | From.Outcometree.Oval_printer x0 ->
      To.Outcometree.Oval_printer x0
  | From.Outcometree.Oval_record x0 ->
      To.Outcometree.Oval_record
        (List.map
           (fun x  ->
              let (x0,x1) = x  in
              ((copy_out_ident x0),
                (copy_out_value x1))) x0)
  | From.Outcometree.Oval_string (x0, _, _) -> To.Outcometree.Oval_string x0
  | From.Outcometree.Oval_stuff x0 -> To.Outcometree.Oval_stuff x0
  | From.Outcometree.Oval_tuple x0 ->
      To.Outcometree.Oval_tuple
        (List.map copy_out_value x0)
  | From.Outcometree.Oval_variant (x0,x1) ->
      To.Outcometree.Oval_variant
        (x0, (copy_option copy_out_value x1))

and copy_float : float -> float = fun x  -> x

and copy_out_ident :
  From.Outcometree.out_ident -> To.Outcometree.out_ident =
  function
  | From.Outcometree.Oide_apply (x0,x1) ->
      To.Outcometree.Oide_apply
        ((copy_out_ident x0),
          (copy_out_ident x1))
  | From.Outcometree.Oide_dot (x0,x1) ->
      To.Outcometree.Oide_dot
        ((copy_out_ident x0), x1)
  | From.Outcometree.Oide_ident x0 -> To.Outcometree.Oide_ident x0

let rec copy_toplevel_phrase :
  From.Parsetree.toplevel_phrase -> To.Parsetree.toplevel_phrase =
  function
  | From.Parsetree.Ptop_def x0 ->
      To.Parsetree.Ptop_def (copy_structure x0)
  | From.Parsetree.Ptop_dir (x0,x1) ->
      To.Parsetree.Ptop_dir
        (x0, (copy_directive_argument x1))

and copy_directive_argument :
  From.Parsetree.directive_argument -> To.Parsetree.directive_argument =
  function
  | From.Parsetree.Pdir_none  -> To.Parsetree.Pdir_none
  | From.Parsetree.Pdir_string x0 -> To.Parsetree.Pdir_string x0
  | From.Parsetree.Pdir_int (x0,x1) ->
      To.Parsetree.Pdir_int (x0, (copy_option (fun x  -> x) x1))
  | From.Parsetree.Pdir_ident x0 ->
      To.Parsetree.Pdir_ident (copy_longident x0)
  | From.Parsetree.Pdir_bool x0 ->
      To.Parsetree.Pdir_bool (copy_bool x0)

let copy_out_type_extension :
  From.Outcometree.out_type_extension -> To.Outcometree.out_type_extension =
  fun
    { From.Outcometree.otyext_name = otyext_name;
      From.Outcometree.otyext_params = otyext_params;
      From.Outcometree.otyext_constructors = otyext_constructors;
      From.Outcometree.otyext_private = otyext_private }
     ->
    {
      To.Outcometree.otyext_name = otyext_name;
      To.Outcometree.otyext_params =
        (List.map (fun x  -> x) otyext_params);
      To.Outcometree.otyext_constructors =
        (List.map
           (fun x  ->
              let (x0,x1,x2) = x  in
              (x0, (List.map copy_out_type x1),
                (copy_option copy_out_type x2)))
           otyext_constructors);
      To.Outcometree.otyext_private =
        (copy_private_flag otyext_private)
    }

let copy_cases x = List.map copy_case x
let copy_pat = copy_pattern
let copy_expr = copy_expression
let copy_typ = copy_core_type

end
module Migrate_parsetree_405_406
= struct
#1 "migrate_parsetree_405_406.ml"
# 1 "src/migrate_parsetree_405_406.ml"
(**************************************************************************)
(*                                                                        *)
(*                         OCaml Migrate Parsetree                        *)
(*                                                                        *)
(*                             Frédéric Bour                              *)
(*                                                                        *)
(*   Copyright 2017 Institut National de Recherche en Informatique et     *)
(*     en Automatique (INRIA).                                            *)
(*                                                                        *)
(*   All rights reserved.  This file is distributed under the terms of    *)
(*   the GNU Lesser General Public License version 2.1, with the          *)
(*   special exception on linking described in the file LICENSE.          *)
(*                                                                        *)
(**************************************************************************)

include Migrate_parsetree_405_406_migrate

(*$ open Printf
    let fields = [
      "attribute"; "attributes"; "case"; "cases"; "class_declaration";
      "class_description"; "class_expr"; "class_field"; "class_signature";
      "class_structure"; "class_type"; "class_type_declaration";
      "class_type_field"; "constructor_declaration"; "expr"; "extension";
      "extension_constructor"; "include_declaration"; "include_description";
      "label_declaration"; "location"; "module_binding"; "module_declaration";
      "module_expr"; "module_type"; "module_type_declaration";
      "open_description"; "pat"; "signature"; "signature_item"; "structure";
      "structure_item"; "typ"; "type_declaration"; "type_extension";
      "type_kind"; "value_binding"; "value_description";
      "with_constraint"; "payload"
    ]
  let foreach_field f =
    printf "\n";
    List.iter f fields
*)(*$*)

let copy_mapper = fun
  ({ From.Ast_mapper.
     (*$ foreach_field (printf "%s;\n")*)
     attribute;
     attributes;
     case;
     cases;
     class_declaration;
     class_description;
     class_expr;
     class_field;
     class_signature;
     class_structure;
     class_type;
     class_type_declaration;
     class_type_field;
     constructor_declaration;
     expr;
     extension;
     extension_constructor;
     include_declaration;
     include_description;
     label_declaration;
     location;
     module_binding;
     module_declaration;
     module_expr;
     module_type;
     module_type_declaration;
     open_description;
     pat;
     signature;
     signature_item;
     structure;
     structure_item;
     typ;
     type_declaration;
     type_extension;
     type_kind;
     value_binding;
     value_description;
     with_constraint;
     payload;
     (*$*)
   } as mapper) ->
  let module R = Migrate_parsetree_406_405_migrate in
  {
    To.Ast_mapper.
    (*$ foreach_field (fun s ->
          printf
          "%s = (fun _ x -> copy_%s (%s mapper (R.copy_%s x)));\n" s s s s)
    *)
    attribute = (fun _ x -> copy_attribute (attribute mapper (R.copy_attribute x)));
    attributes = (fun _ x -> copy_attributes (attributes mapper (R.copy_attributes x)));
    case = (fun _ x -> copy_case (case mapper (R.copy_case x)));
    cases = (fun _ x -> copy_cases (cases mapper (R.copy_cases x)));
    class_declaration = (fun _ x -> copy_class_declaration (class_declaration mapper (R.copy_class_declaration x)));
    class_description = (fun _ x -> copy_class_description (class_description mapper (R.copy_class_description x)));
    class_expr = (fun _ x -> copy_class_expr (class_expr mapper (R.copy_class_expr x)));
    class_field = (fun _ x -> copy_class_field (class_field mapper (R.copy_class_field x)));
    class_signature = (fun _ x -> copy_class_signature (class_signature mapper (R.copy_class_signature x)));
    class_structure = (fun _ x -> copy_class_structure (class_structure mapper (R.copy_class_structure x)));
    class_type = (fun _ x -> copy_class_type (class_type mapper (R.copy_class_type x)));
    class_type_declaration = (fun _ x -> copy_class_type_declaration (class_type_declaration mapper (R.copy_class_type_declaration x)));
    class_type_field = (fun _ x -> copy_class_type_field (class_type_field mapper (R.copy_class_type_field x)));
    constructor_declaration = (fun _ x -> copy_constructor_declaration (constructor_declaration mapper (R.copy_constructor_declaration x)));
    expr = (fun _ x -> copy_expr (expr mapper (R.copy_expr x)));
    extension = (fun _ x -> copy_extension (extension mapper (R.copy_extension x)));
    extension_constructor = (fun _ x -> copy_extension_constructor (extension_constructor mapper (R.copy_extension_constructor x)));
    include_declaration = (fun _ x -> copy_include_declaration (include_declaration mapper (R.copy_include_declaration x)));
    include_description = (fun _ x -> copy_include_description (include_description mapper (R.copy_include_description x)));
    label_declaration = (fun _ x -> copy_label_declaration (label_declaration mapper (R.copy_label_declaration x)));
    location = (fun _ x -> copy_location (location mapper (R.copy_location x)));
    module_binding = (fun _ x -> copy_module_binding (module_binding mapper (R.copy_module_binding x)));
    module_declaration = (fun _ x -> copy_module_declaration (module_declaration mapper (R.copy_module_declaration x)));
    module_expr = (fun _ x -> copy_module_expr (module_expr mapper (R.copy_module_expr x)));
    module_type = (fun _ x -> copy_module_type (module_type mapper (R.copy_module_type x)));
    module_type_declaration = (fun _ x -> copy_module_type_declaration (module_type_declaration mapper (R.copy_module_type_declaration x)));
    open_description = (fun _ x -> copy_open_description (open_description mapper (R.copy_open_description x)));
    pat = (fun _ x -> copy_pat (pat mapper (R.copy_pat x)));
    signature = (fun _ x -> copy_signature (signature mapper (R.copy_signature x)));
    signature_item = (fun _ x -> copy_signature_item (signature_item mapper (R.copy_signature_item x)));
    structure = (fun _ x -> copy_structure (structure mapper (R.copy_structure x)));
    structure_item = (fun _ x -> copy_structure_item (structure_item mapper (R.copy_structure_item x)));
    typ = (fun _ x -> copy_typ (typ mapper (R.copy_typ x)));
    type_declaration = (fun _ x -> copy_type_declaration (type_declaration mapper (R.copy_type_declaration x)));
    type_extension = (fun _ x -> copy_type_extension (type_extension mapper (R.copy_type_extension x)));
    type_kind = (fun _ x -> copy_type_kind (type_kind mapper (R.copy_type_kind x)));
    value_binding = (fun _ x -> copy_value_binding (value_binding mapper (R.copy_value_binding x)));
    value_description = (fun _ x -> copy_value_description (value_description mapper (R.copy_value_description x)));
    with_constraint = (fun _ x -> copy_with_constraint (with_constraint mapper (R.copy_with_constraint x)));
    payload = (fun _ x -> copy_payload (payload mapper (R.copy_payload x)));
    (*$*)
  }

end
module Migrate_parsetree_406_405
= struct
#1 "migrate_parsetree_406_405.ml"
# 1 "src/migrate_parsetree_406_405.ml"
(**************************************************************************)
(*                                                                        *)
(*                         OCaml Migrate Parsetree                        *)
(*                                                                        *)
(*                             Frédéric Bour                              *)
(*                                                                        *)
(*   Copyright 2017 Institut National de Recherche en Informatique et     *)
(*     en Automatique (INRIA).                                            *)
(*                                                                        *)
(*   All rights reserved.  This file is distributed under the terms of    *)
(*   the GNU Lesser General Public License version 2.1, with the          *)
(*   special exception on linking described in the file LICENSE.          *)
(*                                                                        *)
(**************************************************************************)

include Migrate_parsetree_406_405_migrate

(*$ open Printf
    let fields = [
      "attribute"; "attributes"; "case"; "cases"; "class_declaration";
      "class_description"; "class_expr"; "class_field"; "class_signature";
      "class_structure"; "class_type"; "class_type_declaration";
      "class_type_field"; "constructor_declaration"; "expr"; "extension";
      "extension_constructor"; "include_declaration"; "include_description";
      "label_declaration"; "location"; "module_binding"; "module_declaration";
      "module_expr"; "module_type"; "module_type_declaration";
      "open_description"; "pat"; "signature"; "signature_item"; "structure";
      "structure_item"; "typ"; "type_declaration"; "type_extension";
      "type_kind"; "value_binding"; "value_description";
      "with_constraint"; "payload"
    ]
  let foreach_field f =
    printf "\n";
    List.iter f fields
*)(*$*)

let copy_mapper = fun
  ({ From.Ast_mapper.
     (*$ foreach_field (printf "%s;\n")*)
     attribute;
     attributes;
     case;
     cases;
     class_declaration;
     class_description;
     class_expr;
     class_field;
     class_signature;
     class_structure;
     class_type;
     class_type_declaration;
     class_type_field;
     constructor_declaration;
     expr;
     extension;
     extension_constructor;
     include_declaration;
     include_description;
     label_declaration;
     location;
     module_binding;
     module_declaration;
     module_expr;
     module_type;
     module_type_declaration;
     open_description;
     pat;
     signature;
     signature_item;
     structure;
     structure_item;
     typ;
     type_declaration;
     type_extension;
     type_kind;
     value_binding;
     value_description;
     with_constraint;
     payload;
     (*$*)
   } as mapper) ->
  let module R = Migrate_parsetree_405_406_migrate in
  {
    To.Ast_mapper.
    (*$ foreach_field (fun s ->
          printf
          "%s = (fun _ x -> copy_%s (%s mapper (R.copy_%s x)));\n" s s s s)
    *)
    attribute = (fun _ x -> copy_attribute (attribute mapper (R.copy_attribute x)));
    attributes = (fun _ x -> copy_attributes (attributes mapper (R.copy_attributes x)));
    case = (fun _ x -> copy_case (case mapper (R.copy_case x)));
    cases = (fun _ x -> copy_cases (cases mapper (R.copy_cases x)));
    class_declaration = (fun _ x -> copy_class_declaration (class_declaration mapper (R.copy_class_declaration x)));
    class_description = (fun _ x -> copy_class_description (class_description mapper (R.copy_class_description x)));
    class_expr = (fun _ x -> copy_class_expr (class_expr mapper (R.copy_class_expr x)));
    class_field = (fun _ x -> copy_class_field (class_field mapper (R.copy_class_field x)));
    class_signature = (fun _ x -> copy_class_signature (class_signature mapper (R.copy_class_signature x)));
    class_structure = (fun _ x -> copy_class_structure (class_structure mapper (R.copy_class_structure x)));
    class_type = (fun _ x -> copy_class_type (class_type mapper (R.copy_class_type x)));
    class_type_declaration = (fun _ x -> copy_class_type_declaration (class_type_declaration mapper (R.copy_class_type_declaration x)));
    class_type_field = (fun _ x -> copy_class_type_field (class_type_field mapper (R.copy_class_type_field x)));
    constructor_declaration = (fun _ x -> copy_constructor_declaration (constructor_declaration mapper (R.copy_constructor_declaration x)));
    expr = (fun _ x -> copy_expr (expr mapper (R.copy_expr x)));
    extension = (fun _ x -> copy_extension (extension mapper (R.copy_extension x)));
    extension_constructor = (fun _ x -> copy_extension_constructor (extension_constructor mapper (R.copy_extension_constructor x)));
    include_declaration = (fun _ x -> copy_include_declaration (include_declaration mapper (R.copy_include_declaration x)));
    include_description = (fun _ x -> copy_include_description (include_description mapper (R.copy_include_description x)));
    label_declaration = (fun _ x -> copy_label_declaration (label_declaration mapper (R.copy_label_declaration x)));
    location = (fun _ x -> copy_location (location mapper (R.copy_location x)));
    module_binding = (fun _ x -> copy_module_binding (module_binding mapper (R.copy_module_binding x)));
    module_declaration = (fun _ x -> copy_module_declaration (module_declaration mapper (R.copy_module_declaration x)));
    module_expr = (fun _ x -> copy_module_expr (module_expr mapper (R.copy_module_expr x)));
    module_type = (fun _ x -> copy_module_type (module_type mapper (R.copy_module_type x)));
    module_type_declaration = (fun _ x -> copy_module_type_declaration (module_type_declaration mapper (R.copy_module_type_declaration x)));
    open_description = (fun _ x -> copy_open_description (open_description mapper (R.copy_open_description x)));
    pat = (fun _ x -> copy_pat (pat mapper (R.copy_pat x)));
    signature = (fun _ x -> copy_signature (signature mapper (R.copy_signature x)));
    signature_item = (fun _ x -> copy_signature_item (signature_item mapper (R.copy_signature_item x)));
    structure = (fun _ x -> copy_structure (structure mapper (R.copy_structure x)));
    structure_item = (fun _ x -> copy_structure_item (structure_item mapper (R.copy_structure_item x)));
    typ = (fun _ x -> copy_typ (typ mapper (R.copy_typ x)));
    type_declaration = (fun _ x -> copy_type_declaration (type_declaration mapper (R.copy_type_declaration x)));
    type_extension = (fun _ x -> copy_type_extension (type_extension mapper (R.copy_type_extension x)));
    type_kind = (fun _ x -> copy_type_kind (type_kind mapper (R.copy_type_kind x)));
    value_binding = (fun _ x -> copy_value_binding (value_binding mapper (R.copy_value_binding x)));
    value_description = (fun _ x -> copy_value_description (value_description mapper (R.copy_value_description x)));
    with_constraint = (fun _ x -> copy_with_constraint (with_constraint mapper (R.copy_with_constraint x)));
    payload = (fun _ x -> copy_payload (payload mapper (R.copy_payload x)));
    (*$*)
  }

end
module Migrate_parsetree_versions : sig 
#1 "migrate_parsetree_versions.mli"
# 1 "src/migrate_parsetree_versions.mli"
(**************************************************************************)
(*                                                                        *)
(*                         OCaml Migrate Parsetree                        *)
(*                                                                        *)
(*                             Frédéric Bour                              *)
(*                   Jérémie Dimino, Jane Street Europe                   *)
(*                                                                        *)
(*   Copyright 2017 Institut National de Recherche en Informatique et     *)
(*     en Automatique (INRIA).                                            *)
(*                                                                        *)
(*   All rights reserved.  This file is distributed under the terms of    *)
(*   the GNU Lesser General Public License version 2.1, with the          *)
(*   special exception on linking described in the file LICENSE.          *)
(*                                                                        *)
(**************************************************************************)

(*$ #use "src/cinaps_helpers" $*)

(** {1 Abstracting an OCaml frontend} *)

(** Abstract view of a version of an OCaml Ast *)
module type Ast = sig
  (*$ foreach_module (fun m types ->
        printf "module %s : sig\n" m;
        List.iter types ~f:(printf "type %s\n");
        printf "end\n"
      )
  *)
  module Parsetree : sig
    type structure
    type signature
    type toplevel_phrase
    type core_type
    type expression
    type pattern
    type case
    type type_declaration
    type type_extension
    type extension_constructor
  end
  module Outcometree : sig
    type out_value
    type out_type
    type out_class_type
    type out_module_type
    type out_sig_item
    type out_type_extension
    type out_phrase
  end
  module Ast_mapper : sig
    type mapper
  end
  (*$*)
  module Config : sig
    val ast_impl_magic_number : string
    val ast_intf_magic_number : string
  end
  val shallow_identity : Ast_mapper.mapper
  val map_signature : Ast_mapper.mapper -> Parsetree.signature -> Parsetree.signature
  val map_structure : Ast_mapper.mapper -> Parsetree.structure -> Parsetree.structure
  val make_top_mapper
    :  signature:(Parsetree.signature -> Parsetree.signature)
    -> structure:(Parsetree.structure -> Parsetree.structure)
    -> Ast_mapper.mapper
end

(* Shortcuts for talking about ast types outside of the module language *)

type 'a _types = 'a constraint 'a
  = <
  (*$ foreach_type (fun _ s -> printf "%-21s : _;\n" s) *)
  structure             : _;
  signature             : _;
  toplevel_phrase       : _;
  core_type             : _;
  expression            : _;
  pattern               : _;
  case                  : _;
  type_declaration      : _;
  type_extension        : _;
  extension_constructor : _;
  out_value             : _;
  out_type              : _;
  out_class_type        : _;
  out_module_type       : _;
  out_sig_item          : _;
  out_type_extension    : _;
  out_phrase            : _;
  mapper                : _;
  (*$*)
  >
;;

(*$ foreach_type (fun _ s ->
      printf "type 'a get_%s = 'x constraint 'a _types = < %s : 'x; .. >\n" s s
    );
    printf ";;\n" *)
type 'a get_structure = 'x constraint 'a _types = < structure : 'x; .. >
type 'a get_signature = 'x constraint 'a _types = < signature : 'x; .. >
type 'a get_toplevel_phrase = 'x constraint 'a _types = < toplevel_phrase : 'x; .. >
type 'a get_core_type = 'x constraint 'a _types = < core_type : 'x; .. >
type 'a get_expression = 'x constraint 'a _types = < expression : 'x; .. >
type 'a get_pattern = 'x constraint 'a _types = < pattern : 'x; .. >
type 'a get_case = 'x constraint 'a _types = < case : 'x; .. >
type 'a get_type_declaration = 'x constraint 'a _types = < type_declaration : 'x; .. >
type 'a get_type_extension = 'x constraint 'a _types = < type_extension : 'x; .. >
type 'a get_extension_constructor = 'x constraint 'a _types = < extension_constructor : 'x; .. >
type 'a get_out_value = 'x constraint 'a _types = < out_value : 'x; .. >
type 'a get_out_type = 'x constraint 'a _types = < out_type : 'x; .. >
type 'a get_out_class_type = 'x constraint 'a _types = < out_class_type : 'x; .. >
type 'a get_out_module_type = 'x constraint 'a _types = < out_module_type : 'x; .. >
type 'a get_out_sig_item = 'x constraint 'a _types = < out_sig_item : 'x; .. >
type 'a get_out_type_extension = 'x constraint 'a _types = < out_type_extension : 'x; .. >
type 'a get_out_phrase = 'x constraint 'a _types = < out_phrase : 'x; .. >
type 'a get_mapper = 'x constraint 'a _types = < mapper : 'x; .. >
;;
(*$*)

(** A version of the OCaml frontend packs the ast with type witnesses
    so that equalities can be recovered dynamically. *)
type _ witnesses                  = private ..  

(** [migration_info] is an opaque type that is used to generate migration
    functions. *)
type _ migration_info

(** An OCaml frontend versions an Ast, version number and some witnesses for
    conversion. *)
module type OCaml_version = sig

  (** Ast definition for this version *)
  module Ast : Ast

  (* Version number as an integer, 402, 403, 404, ... *)
  val version : int

  (* Version number as a user-friendly string *)
  val string_version : string (* 4.02, 4.03, 4.04, ... *)

  (** Shortcut for talking about Ast types *)
  type types = <
    (*$ foreach_type (fun m s -> printf "%-21s : Ast.%s.%s;\n" s m s) *)
    structure             : Ast.Parsetree.structure;
    signature             : Ast.Parsetree.signature;
    toplevel_phrase       : Ast.Parsetree.toplevel_phrase;
    core_type             : Ast.Parsetree.core_type;
    expression            : Ast.Parsetree.expression;
    pattern               : Ast.Parsetree.pattern;
    case                  : Ast.Parsetree.case;
    type_declaration      : Ast.Parsetree.type_declaration;
    type_extension        : Ast.Parsetree.type_extension;
    extension_constructor : Ast.Parsetree.extension_constructor;
    out_value             : Ast.Outcometree.out_value;
    out_type              : Ast.Outcometree.out_type;
    out_class_type        : Ast.Outcometree.out_class_type;
    out_module_type       : Ast.Outcometree.out_module_type;
    out_sig_item          : Ast.Outcometree.out_sig_item;
    out_type_extension    : Ast.Outcometree.out_type_extension;
    out_phrase            : Ast.Outcometree.out_phrase;
    mapper                : Ast.Ast_mapper.mapper;
    (*$*)
  > _types

  (** A construtor for recovering type equalities between two arbitrary
      versions. *)
  type _ witnesses += Version : types witnesses

  (** Information used to derive migration functions, see below *)
  val migration_info : types migration_info
end

(** Representing an ocaml version in type language *)
type 'types ocaml_version =
  (module OCaml_version
    (*$ let sep = with_then_and () in
        foreach_type (fun m s ->
          printf "%t type Ast.%s.%s = 'types get_%s\n" sep m s s) *)
    with type Ast.Parsetree.structure = 'types get_structure
     and type Ast.Parsetree.signature = 'types get_signature
     and type Ast.Parsetree.toplevel_phrase = 'types get_toplevel_phrase
     and type Ast.Parsetree.core_type = 'types get_core_type
     and type Ast.Parsetree.expression = 'types get_expression
     and type Ast.Parsetree.pattern = 'types get_pattern
     and type Ast.Parsetree.case = 'types get_case
     and type Ast.Parsetree.type_declaration = 'types get_type_declaration
     and type Ast.Parsetree.type_extension = 'types get_type_extension
     and type Ast.Parsetree.extension_constructor = 'types get_extension_constructor
     and type Ast.Outcometree.out_value = 'types get_out_value
     and type Ast.Outcometree.out_type = 'types get_out_type
     and type Ast.Outcometree.out_class_type = 'types get_out_class_type
     and type Ast.Outcometree.out_module_type = 'types get_out_module_type
     and type Ast.Outcometree.out_sig_item = 'types get_out_sig_item
     and type Ast.Outcometree.out_type_extension = 'types get_out_type_extension
     and type Ast.Outcometree.out_phrase = 'types get_out_phrase
     and type Ast.Ast_mapper.mapper = 'types get_mapper
     (*$*)
  )

(** {1 Concrete frontend instances} *)

(*$foreach_version (fun suffix _ ->
     printf "module OCaml_%s : OCaml_version with module Ast = Ast_%s\n"
       suffix suffix;
     printf "val ocaml_%s : OCaml_%s.types ocaml_version\n" suffix suffix;
  )*)
module OCaml_402 : OCaml_version with module Ast = Ast_402
val ocaml_402 : OCaml_402.types ocaml_version
module OCaml_403 : OCaml_version with module Ast = Ast_403
val ocaml_403 : OCaml_403.types ocaml_version
module OCaml_404 : OCaml_version with module Ast = Ast_404
val ocaml_404 : OCaml_404.types ocaml_version
module OCaml_405 : OCaml_version with module Ast = Ast_405
val ocaml_405 : OCaml_405.types ocaml_version
module OCaml_406 : OCaml_version with module Ast = Ast_406
val ocaml_406 : OCaml_406.types ocaml_version
(*$*)

(* An alias to the current compiler version *)
module OCaml_current = OCaml_406          
val ocaml_current : OCaml_current.types ocaml_version

val all_versions : (module OCaml_version) list

(** {1 Migrating between different versions} *)

type ('a, 'b) type_comparison =
  | Lt : ('a, 'b) type_comparison
  | Eq : ('a, 'a) type_comparison
  | Gt : ('a, 'b) type_comparison

val compare_ocaml_version : 'a ocaml_version -> 'b ocaml_version -> ('a, 'b) type_comparison

(** A record for migrating each AST construct between two known versions *)
type ('from, 'to_) migration_functions = {
  (*$ foreach_type (fun _ s ->
        printf "copy_%s: 'from get_%s -> 'to_ get_%s;\n" s s s) *)
  copy_structure: 'from get_structure -> 'to_ get_structure;
  copy_signature: 'from get_signature -> 'to_ get_signature;
  copy_toplevel_phrase: 'from get_toplevel_phrase -> 'to_ get_toplevel_phrase;
  copy_core_type: 'from get_core_type -> 'to_ get_core_type;
  copy_expression: 'from get_expression -> 'to_ get_expression;
  copy_pattern: 'from get_pattern -> 'to_ get_pattern;
  copy_case: 'from get_case -> 'to_ get_case;
  copy_type_declaration: 'from get_type_declaration -> 'to_ get_type_declaration;
  copy_type_extension: 'from get_type_extension -> 'to_ get_type_extension;
  copy_extension_constructor: 'from get_extension_constructor -> 'to_ get_extension_constructor;
  copy_out_value: 'from get_out_value -> 'to_ get_out_value;
  copy_out_type: 'from get_out_type -> 'to_ get_out_type;
  copy_out_class_type: 'from get_out_class_type -> 'to_ get_out_class_type;
  copy_out_module_type: 'from get_out_module_type -> 'to_ get_out_module_type;
  copy_out_sig_item: 'from get_out_sig_item -> 'to_ get_out_sig_item;
  copy_out_type_extension: 'from get_out_type_extension -> 'to_ get_out_type_extension;
  copy_out_phrase: 'from get_out_phrase -> 'to_ get_out_phrase;
  copy_mapper: 'from get_mapper -> 'to_ get_mapper;
  (*$*)
}

(** Migrating to the same version is no-op *)
val migration_identity : ('a, 'a) migration_functions

(** Migrations can be composed *)
val migration_compose : ('a, 'b) migration_functions -> ('b, 'c) migration_functions -> ('a, 'c) migration_functions

(** Represent the next or previous version of an Ast *)

type 'from immediate_migration =
  | No_migration : 'from immediate_migration
  (** Cannot migrate earliest or latest supported version *)
  |
    Immediate_migration :
      ('from, 'to_) migration_functions * 'to_ ocaml_version -> 'from immediate_migration
  (** Pack the migration functions and the new version *)

val immediate_migration : 'types ocaml_version -> [< `Next | `Previous ] -> 'types immediate_migration

val migrate : 'from ocaml_version -> 'to_ ocaml_version -> ('from, 'to_) migration_functions

(** {1 Convenience definitions} *)

(** Module level migration *)
module Convert (A : OCaml_version) (B : OCaml_version) : sig
  (*$ foreach_type (fun m s ->
        let fq = sprintf "%s.%s" m s in
        printf "  val copy_%-21s : A.Ast.%-31s -> B.Ast.%s\n" s fq fq) *)
  val copy_structure             : A.Ast.Parsetree.structure             -> B.Ast.Parsetree.structure
  val copy_signature             : A.Ast.Parsetree.signature             -> B.Ast.Parsetree.signature
  val copy_toplevel_phrase       : A.Ast.Parsetree.toplevel_phrase       -> B.Ast.Parsetree.toplevel_phrase
  val copy_core_type             : A.Ast.Parsetree.core_type             -> B.Ast.Parsetree.core_type
  val copy_expression            : A.Ast.Parsetree.expression            -> B.Ast.Parsetree.expression
  val copy_pattern               : A.Ast.Parsetree.pattern               -> B.Ast.Parsetree.pattern
  val copy_case                  : A.Ast.Parsetree.case                  -> B.Ast.Parsetree.case
  val copy_type_declaration      : A.Ast.Parsetree.type_declaration      -> B.Ast.Parsetree.type_declaration
  val copy_type_extension        : A.Ast.Parsetree.type_extension        -> B.Ast.Parsetree.type_extension
  val copy_extension_constructor : A.Ast.Parsetree.extension_constructor -> B.Ast.Parsetree.extension_constructor
  val copy_out_value             : A.Ast.Outcometree.out_value           -> B.Ast.Outcometree.out_value
  val copy_out_type              : A.Ast.Outcometree.out_type            -> B.Ast.Outcometree.out_type
  val copy_out_class_type        : A.Ast.Outcometree.out_class_type      -> B.Ast.Outcometree.out_class_type
  val copy_out_module_type       : A.Ast.Outcometree.out_module_type     -> B.Ast.Outcometree.out_module_type
  val copy_out_sig_item          : A.Ast.Outcometree.out_sig_item        -> B.Ast.Outcometree.out_sig_item
  val copy_out_type_extension    : A.Ast.Outcometree.out_type_extension  -> B.Ast.Outcometree.out_type_extension
  val copy_out_phrase            : A.Ast.Outcometree.out_phrase          -> B.Ast.Outcometree.out_phrase
  val copy_mapper                : A.Ast.Ast_mapper.mapper               -> B.Ast.Ast_mapper.mapper
  (*$*)
end

end = struct
#1 "migrate_parsetree_versions.ml"
# 1 "src/migrate_parsetree_versions.ml"
(**************************************************************************)
(*                                                                        *)
(*                         OCaml Migrate Parsetree                        *)
(*                                                                        *)
(*                             Frédéric Bour                              *)
(*                   Jérémie Dimino, Jane Street Europe                   *)
(*                                                                        *)
(*   Copyright 2017 Institut National de Recherche en Informatique et     *)
(*     en Automatique (INRIA).                                            *)
(*                                                                        *)
(*   All rights reserved.  This file is distributed under the terms of    *)
(*   the GNU Lesser General Public License version 2.1, with the          *)
(*   special exception on linking described in the file LICENSE.          *)
(*                                                                        *)
(**************************************************************************)

(* BEGIN of BLACK MAGIC *)
(*$ #use "src/cinaps_helpers" $*)

type _ witnesses = ..

type _ migration = ..
type _ migration += Undefined : _ migration

type 'a migration_info = {
  mutable next_version : 'a migration;
  mutable previous_version : 'a migration;
}

(** Abstract view of a version of an OCaml Ast *)
module type Ast = sig
  (*$ foreach_module (fun m types ->
        printf "module %s : sig\n" m;
        List.iter types ~f:(printf "type %s\n");
        printf "end\n"
      )
  *)
  module Parsetree : sig
    type structure
    type signature
    type toplevel_phrase
    type core_type
    type expression
    type pattern
    type case
    type type_declaration
    type type_extension
    type extension_constructor
  end
  module Outcometree : sig
    type out_value
    type out_type
    type out_class_type
    type out_module_type
    type out_sig_item
    type out_type_extension
    type out_phrase
  end
  module Ast_mapper : sig
    type mapper
  end
  (*$*)
  module Config : sig
    val ast_impl_magic_number : string
    val ast_intf_magic_number : string
  end
  val shallow_identity : Ast_mapper.mapper
  val map_signature : Ast_mapper.mapper -> Parsetree.signature -> Parsetree.signature
  val map_structure : Ast_mapper.mapper -> Parsetree.structure -> Parsetree.structure
  val make_top_mapper
    :  signature:(Parsetree.signature -> Parsetree.signature)
    -> structure:(Parsetree.structure -> Parsetree.structure)
    -> Ast_mapper.mapper
end

(* Shortcuts for talking about ast types outside of the module language *)

type 'a _types = 'a constraint 'a
  = <
  (*$ foreach_type (fun _ s -> printf "%-21s : _;\n" s) *)
  structure             : _;
  signature             : _;
  toplevel_phrase       : _;
  core_type             : _;
  expression            : _;
  pattern               : _;
  case                  : _;
  type_declaration      : _;
  type_extension        : _;
  extension_constructor : _;
  out_value             : _;
  out_type              : _;
  out_class_type        : _;
  out_module_type       : _;
  out_sig_item          : _;
  out_type_extension    : _;
  out_phrase            : _;
  mapper                : _;
  (*$*)
  >
;;

(*$ foreach_type (fun _ s ->
      printf "type 'a get_%s =\n" s;
      printf " 'x constraint 'a _types = < %s : 'x; .. >\n" s
    ) *)
type 'a get_structure =
  'x constraint 'a _types = < structure : 'x; .. >
type 'a get_signature =
  'x constraint 'a _types = < signature : 'x; .. >
type 'a get_toplevel_phrase =
  'x constraint 'a _types = < toplevel_phrase : 'x; .. >
type 'a get_core_type =
  'x constraint 'a _types = < core_type : 'x; .. >
type 'a get_expression =
  'x constraint 'a _types = < expression : 'x; .. >
type 'a get_pattern =
  'x constraint 'a _types = < pattern : 'x; .. >
type 'a get_case =
  'x constraint 'a _types = < case : 'x; .. >
type 'a get_type_declaration =
  'x constraint 'a _types = < type_declaration : 'x; .. >
type 'a get_type_extension =
  'x constraint 'a _types = < type_extension : 'x; .. >
type 'a get_extension_constructor =
  'x constraint 'a _types = < extension_constructor : 'x; .. >
type 'a get_out_value =
  'x constraint 'a _types = < out_value : 'x; .. >
type 'a get_out_type =
  'x constraint 'a _types = < out_type : 'x; .. >
type 'a get_out_class_type =
  'x constraint 'a _types = < out_class_type : 'x; .. >
type 'a get_out_module_type =
  'x constraint 'a _types = < out_module_type : 'x; .. >
type 'a get_out_sig_item =
  'x constraint 'a _types = < out_sig_item : 'x; .. >
type 'a get_out_type_extension =
  'x constraint 'a _types = < out_type_extension : 'x; .. >
type 'a get_out_phrase =
  'x constraint 'a _types = < out_phrase : 'x; .. >
type 'a get_mapper =
  'x constraint 'a _types = < mapper : 'x; .. >
       (*$*)

module type OCaml_version = sig
  module Ast : Ast
  val version : int
  val string_version : string
  type types = <
    (*$ foreach_type (fun m s -> printf "%-21s : Ast.%s.%s;\n" s m s)*)
    structure             : Ast.Parsetree.structure;
    signature             : Ast.Parsetree.signature;
    toplevel_phrase       : Ast.Parsetree.toplevel_phrase;
    core_type             : Ast.Parsetree.core_type;
    expression            : Ast.Parsetree.expression;
    pattern               : Ast.Parsetree.pattern;
    case                  : Ast.Parsetree.case;
    type_declaration      : Ast.Parsetree.type_declaration;
    type_extension        : Ast.Parsetree.type_extension;
    extension_constructor : Ast.Parsetree.extension_constructor;
    out_value             : Ast.Outcometree.out_value;
    out_type              : Ast.Outcometree.out_type;
    out_class_type        : Ast.Outcometree.out_class_type;
    out_module_type       : Ast.Outcometree.out_module_type;
    out_sig_item          : Ast.Outcometree.out_sig_item;
    out_type_extension    : Ast.Outcometree.out_type_extension;
    out_phrase            : Ast.Outcometree.out_phrase;
    mapper                : Ast.Ast_mapper.mapper;
    (*$*)
  > _types
  type _ witnesses += Version : types witnesses
  val migration_info : types migration_info
end

module Make_witness(Ast : Ast) =
struct
  type types = <
    (*$ foreach_type (fun m s -> printf "%-21s : Ast.%s.%s;\n" s m s)*)
    structure             : Ast.Parsetree.structure;
    signature             : Ast.Parsetree.signature;
    toplevel_phrase       : Ast.Parsetree.toplevel_phrase;
    core_type             : Ast.Parsetree.core_type;
    expression            : Ast.Parsetree.expression;
    pattern               : Ast.Parsetree.pattern;
    case                  : Ast.Parsetree.case;
    type_declaration      : Ast.Parsetree.type_declaration;
    type_extension        : Ast.Parsetree.type_extension;
    extension_constructor : Ast.Parsetree.extension_constructor;
    out_value             : Ast.Outcometree.out_value;
    out_type              : Ast.Outcometree.out_type;
    out_class_type        : Ast.Outcometree.out_class_type;
    out_module_type       : Ast.Outcometree.out_module_type;
    out_sig_item          : Ast.Outcometree.out_sig_item;
    out_type_extension    : Ast.Outcometree.out_type_extension;
    out_phrase            : Ast.Outcometree.out_phrase;
    mapper                : Ast.Ast_mapper.mapper;
    (*$*)
  > _types
  type _ witnesses += Version : types witnesses
  let migration_info : types migration_info =
    { next_version = Undefined; previous_version = Undefined }
end

type 'types ocaml_version =
  (module OCaml_version
    (*$ let sep = with_then_and () in
        foreach_type (fun m s ->
          printf "%t type Ast.%s.%s = 'types get_%s\n" sep m s s) *)
    with type Ast.Parsetree.structure = 'types get_structure
     and type Ast.Parsetree.signature = 'types get_signature
     and type Ast.Parsetree.toplevel_phrase = 'types get_toplevel_phrase
     and type Ast.Parsetree.core_type = 'types get_core_type
     and type Ast.Parsetree.expression = 'types get_expression
     and type Ast.Parsetree.pattern = 'types get_pattern
     and type Ast.Parsetree.case = 'types get_case
     and type Ast.Parsetree.type_declaration = 'types get_type_declaration
     and type Ast.Parsetree.type_extension = 'types get_type_extension
     and type Ast.Parsetree.extension_constructor = 'types get_extension_constructor
     and type Ast.Outcometree.out_value = 'types get_out_value
     and type Ast.Outcometree.out_type = 'types get_out_type
     and type Ast.Outcometree.out_class_type = 'types get_out_class_type
     and type Ast.Outcometree.out_module_type = 'types get_out_module_type
     and type Ast.Outcometree.out_sig_item = 'types get_out_sig_item
     and type Ast.Outcometree.out_type_extension = 'types get_out_type_extension
     and type Ast.Outcometree.out_phrase = 'types get_out_phrase
     and type Ast.Ast_mapper.mapper = 'types get_mapper
     (*$*)
  )

type ('a, 'b) type_comparison =
  | Lt : ('a, 'b) type_comparison
  | Eq : ('a, 'a) type_comparison
  | Gt : ('a, 'b) type_comparison

let compare_ocaml_version
    (*$ foreach_type (fun _ s -> printf "(type %s1) (type %s2)\n" s s) *)
    (type structure1) (type structure2)
    (type signature1) (type signature2)
    (type toplevel_phrase1) (type toplevel_phrase2)
    (type core_type1) (type core_type2)
    (type expression1) (type expression2)
    (type pattern1) (type pattern2)
    (type case1) (type case2)
    (type type_declaration1) (type type_declaration2)
    (type type_extension1) (type type_extension2)
    (type extension_constructor1) (type extension_constructor2)
    (type out_value1) (type out_value2)
    (type out_type1) (type out_type2)
    (type out_class_type1) (type out_class_type2)
    (type out_module_type1) (type out_module_type2)
    (type out_sig_item1) (type out_sig_item2)
    (type out_type_extension1) (type out_type_extension2)
    (type out_phrase1) (type out_phrase2)
    (type mapper1) (type mapper2)
    (*$*)
    ((module A) : <
     (*$ foreach_type (fun _ s -> printf "%-21s : %s1;\n" s s) *)
     structure             : structure1;
     signature             : signature1;
     toplevel_phrase       : toplevel_phrase1;
     core_type             : core_type1;
     expression            : expression1;
     pattern               : pattern1;
     case                  : case1;
     type_declaration      : type_declaration1;
     type_extension        : type_extension1;
     extension_constructor : extension_constructor1;
     out_value             : out_value1;
     out_type              : out_type1;
     out_class_type        : out_class_type1;
     out_module_type       : out_module_type1;
     out_sig_item          : out_sig_item1;
     out_type_extension    : out_type_extension1;
     out_phrase            : out_phrase1;
     mapper                : mapper1;
     (*$*)
     > ocaml_version)
    ((module B) : <
     (*$ foreach_type (fun _ s -> printf "%-21s : %s2;\n" s s) *)
     structure             : structure2;
     signature             : signature2;
     toplevel_phrase       : toplevel_phrase2;
     core_type             : core_type2;
     expression            : expression2;
     pattern               : pattern2;
     case                  : case2;
     type_declaration      : type_declaration2;
     type_extension        : type_extension2;
     extension_constructor : extension_constructor2;
     out_value             : out_value2;
     out_type              : out_type2;
     out_class_type        : out_class_type2;
     out_module_type       : out_module_type2;
     out_sig_item          : out_sig_item2;
     out_type_extension    : out_type_extension2;
     out_phrase            : out_phrase2;
     mapper                : mapper2;
     (*$*)
     > ocaml_version)
  : (A.types, B.types) type_comparison
  =
  match A.Version with
  | B.Version -> Eq
  | _ when A.version < B.version -> Lt
  | _ when A.version > B.version -> Gt
  | _ -> assert false

type ('from, 'to_) migration_functions = {
  (*$ foreach_type (fun _ s ->
        printf "copy_%s: 'from get_%s -> 'to_ get_%s;\n" s s s) *)
  copy_structure: 'from get_structure -> 'to_ get_structure;
  copy_signature: 'from get_signature -> 'to_ get_signature;
  copy_toplevel_phrase: 'from get_toplevel_phrase -> 'to_ get_toplevel_phrase;
  copy_core_type: 'from get_core_type -> 'to_ get_core_type;
  copy_expression: 'from get_expression -> 'to_ get_expression;
  copy_pattern: 'from get_pattern -> 'to_ get_pattern;
  copy_case: 'from get_case -> 'to_ get_case;
  copy_type_declaration: 'from get_type_declaration -> 'to_ get_type_declaration;
  copy_type_extension: 'from get_type_extension -> 'to_ get_type_extension;
  copy_extension_constructor: 'from get_extension_constructor -> 'to_ get_extension_constructor;
  copy_out_value: 'from get_out_value -> 'to_ get_out_value;
  copy_out_type: 'from get_out_type -> 'to_ get_out_type;
  copy_out_class_type: 'from get_out_class_type -> 'to_ get_out_class_type;
  copy_out_module_type: 'from get_out_module_type -> 'to_ get_out_module_type;
  copy_out_sig_item: 'from get_out_sig_item -> 'to_ get_out_sig_item;
  copy_out_type_extension: 'from get_out_type_extension -> 'to_ get_out_type_extension;
  copy_out_phrase: 'from get_out_phrase -> 'to_ get_out_phrase;
  copy_mapper: 'from get_mapper -> 'to_ get_mapper;
  (*$*)
}

let id x = x
let migration_identity : ('a, 'a) migration_functions = {
  (*$ foreach_type (fun _ s -> printf "copy_%s = id;\n" s) *)
  copy_structure = id;
  copy_signature = id;
  copy_toplevel_phrase = id;
  copy_core_type = id;
  copy_expression = id;
  copy_pattern = id;
  copy_case = id;
  copy_type_declaration = id;
  copy_type_extension = id;
  copy_extension_constructor = id;
  copy_out_value = id;
  copy_out_type = id;
  copy_out_class_type = id;
  copy_out_module_type = id;
  copy_out_sig_item = id;
  copy_out_type_extension = id;
  copy_out_phrase = id;
  copy_mapper = id;
  (*$*)
}

let compose f g x = f (g x)
let migration_compose (ab : ('a, 'b) migration_functions) (bc : ('b, 'c) migration_functions) : ('a, 'c) migration_functions = {
  (*$ foreach_type (fun _ s ->
        printf "copy_%-21s = compose bc.copy_%-21s ab.copy_%s;\n" s s s) *)
  copy_structure             = compose bc.copy_structure             ab.copy_structure;
  copy_signature             = compose bc.copy_signature             ab.copy_signature;
  copy_toplevel_phrase       = compose bc.copy_toplevel_phrase       ab.copy_toplevel_phrase;
  copy_core_type             = compose bc.copy_core_type             ab.copy_core_type;
  copy_expression            = compose bc.copy_expression            ab.copy_expression;
  copy_pattern               = compose bc.copy_pattern               ab.copy_pattern;
  copy_case                  = compose bc.copy_case                  ab.copy_case;
  copy_type_declaration      = compose bc.copy_type_declaration      ab.copy_type_declaration;
  copy_type_extension        = compose bc.copy_type_extension        ab.copy_type_extension;
  copy_extension_constructor = compose bc.copy_extension_constructor ab.copy_extension_constructor;
  copy_out_value             = compose bc.copy_out_value             ab.copy_out_value;
  copy_out_type              = compose bc.copy_out_type              ab.copy_out_type;
  copy_out_class_type        = compose bc.copy_out_class_type        ab.copy_out_class_type;
  copy_out_module_type       = compose bc.copy_out_module_type       ab.copy_out_module_type;
  copy_out_sig_item          = compose bc.copy_out_sig_item          ab.copy_out_sig_item;
  copy_out_type_extension    = compose bc.copy_out_type_extension    ab.copy_out_type_extension;
  copy_out_phrase            = compose bc.copy_out_phrase            ab.copy_out_phrase;
  copy_mapper                = compose bc.copy_mapper                ab.copy_mapper;
  (*$*)
}

type _ migration += Migration : 'from ocaml_version * ('from, 'to_) migration_functions * 'to_ ocaml_version -> 'from migration

module type Migrate_module = sig
  module From : Ast
  module To : Ast
  (*$ foreach_type (fun m s ->
        printf "val copy_%-21s: From.%s.%s -> To.%s.%s\n" s m s m s) *)
  val copy_structure            : From.Parsetree.structure -> To.Parsetree.structure
  val copy_signature            : From.Parsetree.signature -> To.Parsetree.signature
  val copy_toplevel_phrase      : From.Parsetree.toplevel_phrase -> To.Parsetree.toplevel_phrase
  val copy_core_type            : From.Parsetree.core_type -> To.Parsetree.core_type
  val copy_expression           : From.Parsetree.expression -> To.Parsetree.expression
  val copy_pattern              : From.Parsetree.pattern -> To.Parsetree.pattern
  val copy_case                 : From.Parsetree.case -> To.Parsetree.case
  val copy_type_declaration     : From.Parsetree.type_declaration -> To.Parsetree.type_declaration
  val copy_type_extension       : From.Parsetree.type_extension -> To.Parsetree.type_extension
  val copy_extension_constructor: From.Parsetree.extension_constructor -> To.Parsetree.extension_constructor
  val copy_out_value            : From.Outcometree.out_value -> To.Outcometree.out_value
  val copy_out_type             : From.Outcometree.out_type -> To.Outcometree.out_type
  val copy_out_class_type       : From.Outcometree.out_class_type -> To.Outcometree.out_class_type
  val copy_out_module_type      : From.Outcometree.out_module_type -> To.Outcometree.out_module_type
  val copy_out_sig_item         : From.Outcometree.out_sig_item -> To.Outcometree.out_sig_item
  val copy_out_type_extension   : From.Outcometree.out_type_extension -> To.Outcometree.out_type_extension
  val copy_out_phrase           : From.Outcometree.out_phrase -> To.Outcometree.out_phrase
  val copy_mapper               : From.Ast_mapper.mapper -> To.Ast_mapper.mapper
  (*$*)
end

module Migration_functions
    (A : OCaml_version) (B : OCaml_version)
    (A_to_B : Migrate_module with module From = A.Ast and module To = B.Ast)
=
struct
  let migration_functions : (A.types, B.types) migration_functions =
    let open A_to_B in
    {
      (*$ foreach_type (fun _ s -> printf "copy_%s;\n" s) *)
      copy_structure;
      copy_signature;
      copy_toplevel_phrase;
      copy_core_type;
      copy_expression;
      copy_pattern;
      copy_case;
      copy_type_declaration;
      copy_type_extension;
      copy_extension_constructor;
      copy_out_value;
      copy_out_type;
      copy_out_class_type;
      copy_out_module_type;
      copy_out_sig_item;
      copy_out_type_extension;
      copy_out_phrase;
      copy_mapper;
      (*$*)
    }
end

module Register_migration (A : OCaml_version) (B : OCaml_version)
    (A_to_B : Migrate_module with module From = A.Ast and module To = B.Ast)
    (B_to_A : Migrate_module with module From = B.Ast and module To = A.Ast)
=
struct
  let () = (
    let is_undefined : type a. a migration -> bool = function
      | Undefined -> true
      | _ -> false
    in
    assert (A.version < B.version);
    assert (is_undefined A.migration_info.next_version);
    assert (is_undefined B.migration_info.previous_version);
    let module A_to_B_fun = Migration_functions(A)(B)(A_to_B) in
    let module B_to_A_fun = Migration_functions(B)(A)(B_to_A) in
    A.migration_info.next_version <-
      Migration ((module A), A_to_B_fun.migration_functions, (module B));
    B.migration_info.previous_version <-
      Migration ((module B), B_to_A_fun.migration_functions, (module A));
  )
end

type 'from immediate_migration =
  | No_migration : 'from immediate_migration
  | Immediate_migration
    :  ('from, 'to_) migration_functions * 'to_ ocaml_version
    -> 'from immediate_migration

let immediate_migration
    (*$ foreach_type (fun _ s -> printf "(type %s)\n" s) *)
    (type structure)
    (type signature)
    (type toplevel_phrase)
    (type core_type)
    (type expression)
    (type pattern)
    (type case)
    (type type_declaration)
    (type type_extension)
    (type extension_constructor)
    (type out_value)
    (type out_type)
    (type out_class_type)
    (type out_module_type)
    (type out_sig_item)
    (type out_type_extension)
    (type out_phrase)
    (type mapper)
    (*$*)
    ((module A) : <
     (*$ foreach_type (fun _ s -> printf "%-21s : %s;\n" s s) *)
     structure             : structure;
     signature             : signature;
     toplevel_phrase       : toplevel_phrase;
     core_type             : core_type;
     expression            : expression;
     pattern               : pattern;
     case                  : case;
     type_declaration      : type_declaration;
     type_extension        : type_extension;
     extension_constructor : extension_constructor;
     out_value             : out_value;
     out_type              : out_type;
     out_class_type        : out_class_type;
     out_module_type       : out_module_type;
     out_sig_item          : out_sig_item;
     out_type_extension    : out_type_extension;
     out_phrase            : out_phrase;
     mapper                : mapper;
     (*$*)
     > ocaml_version)
    direction
  =
  let version = match direction with
    | `Next -> A.migration_info.next_version
    | `Previous -> A.migration_info.previous_version
  in
  match version with
  | Undefined -> No_migration
  | Migration (_, funs, to_) -> Immediate_migration (funs, to_)
  | _ -> assert false

let migrate
    (*$ foreach_type (fun _ s -> printf "(type %s1) (type %s2)\n" s s) *)
    (type structure1) (type structure2)
    (type signature1) (type signature2)
    (type toplevel_phrase1) (type toplevel_phrase2)
    (type core_type1) (type core_type2)
    (type expression1) (type expression2)
    (type pattern1) (type pattern2)
    (type case1) (type case2)
    (type type_declaration1) (type type_declaration2)
    (type type_extension1) (type type_extension2)
    (type extension_constructor1) (type extension_constructor2)
    (type out_value1) (type out_value2)
    (type out_type1) (type out_type2)
    (type out_class_type1) (type out_class_type2)
    (type out_module_type1) (type out_module_type2)
    (type out_sig_item1) (type out_sig_item2)
    (type out_type_extension1) (type out_type_extension2)
    (type out_phrase1) (type out_phrase2)
    (type mapper1) (type mapper2)
    (*$*)
    ((module A) : <
     (*$ foreach_type (fun _ s -> printf "%-21s : %s1;\n" s s) *)
     structure             : structure1;
     signature             : signature1;
     toplevel_phrase       : toplevel_phrase1;
     core_type             : core_type1;
     expression            : expression1;
     pattern               : pattern1;
     case                  : case1;
     type_declaration      : type_declaration1;
     type_extension        : type_extension1;
     extension_constructor : extension_constructor1;
     out_value             : out_value1;
     out_type              : out_type1;
     out_class_type        : out_class_type1;
     out_module_type       : out_module_type1;
     out_sig_item          : out_sig_item1;
     out_type_extension    : out_type_extension1;
     out_phrase            : out_phrase1;
     mapper                : mapper1;
     (*$*)
     > ocaml_version)
    ((module B) : <
     (*$ foreach_type (fun _ s -> printf "%-21s : %s2;\n" s s) *)
     structure             : structure2;
     signature             : signature2;
     toplevel_phrase       : toplevel_phrase2;
     core_type             : core_type2;
     expression            : expression2;
     pattern               : pattern2;
     case                  : case2;
     type_declaration      : type_declaration2;
     type_extension        : type_extension2;
     extension_constructor : extension_constructor2;
     out_value             : out_value2;
     out_type              : out_type2;
     out_class_type        : out_class_type2;
     out_module_type       : out_module_type2;
     out_sig_item          : out_sig_item2;
     out_type_extension    : out_type_extension2;
     out_phrase            : out_phrase2;
     mapper                : mapper2;
     (*$*)
     > ocaml_version)
  : (A.types, B.types) migration_functions
  =
  match A.Version with
  | B.Version -> migration_identity
  | _ ->
    let direction = if A.version < B.version then `Next else `Previous in
    let rec migrate (m : A.types immediate_migration) : (A.types, B.types) migration_functions =
      match m with
      | No_migration -> assert false
      | Immediate_migration (f, (module To)) ->
        match To.Version with
        | B.Version -> f
        | _ ->
          match immediate_migration (module To) direction with
          | No_migration -> assert false
          | Immediate_migration (g, to2) ->
            migrate (Immediate_migration (migration_compose f g, to2))
    in
    migrate (immediate_migration (module A) direction)

module Convert (A : OCaml_version) (B : OCaml_version) = struct
  let {
    (*$ foreach_type (fun _ s -> printf "copy_%s;\n" s) *)
    copy_structure;
    copy_signature;
    copy_toplevel_phrase;
    copy_core_type;
    copy_expression;
    copy_pattern;
    copy_case;
    copy_type_declaration;
    copy_type_extension;
    copy_extension_constructor;
    copy_out_value;
    copy_out_type;
    copy_out_class_type;
    copy_out_module_type;
    copy_out_sig_item;
    copy_out_type_extension;
    copy_out_phrase;
    copy_mapper;
    (*$*)
  } : (A.types, B.types) migration_functions =
    migrate (module A) (module B)
end

(*$ foreach_version (fun suffix version ->
      printf "module OCaml_%s = struct\n" suffix;
      printf "  module Ast = Ast_%s\n" suffix;
      printf "  include Make_witness(Ast_%s)\n" suffix;
      printf "  let version = %s\n" suffix;
      printf "  let string_version = %S\n" version;
      printf "end\n";
      printf "let ocaml_%s : OCaml_%s.types ocaml_version = (module OCaml_%s)\n"
        suffix suffix suffix;
    )
*)
module OCaml_402 = struct
  module Ast = Ast_402
  include Make_witness(Ast_402)
  let version = 402
  let string_version = "4.02"
end
let ocaml_402 : OCaml_402.types ocaml_version = (module OCaml_402)
module OCaml_403 = struct
  module Ast = Ast_403
  include Make_witness(Ast_403)
  let version = 403
  let string_version = "4.03"
end
let ocaml_403 : OCaml_403.types ocaml_version = (module OCaml_403)
module OCaml_404 = struct
  module Ast = Ast_404
  include Make_witness(Ast_404)
  let version = 404
  let string_version = "4.04"
end
let ocaml_404 : OCaml_404.types ocaml_version = (module OCaml_404)
module OCaml_405 = struct
  module Ast = Ast_405
  include Make_witness(Ast_405)
  let version = 405
  let string_version = "4.05"
end
let ocaml_405 : OCaml_405.types ocaml_version = (module OCaml_405)
module OCaml_406 = struct
  module Ast = Ast_406
  include Make_witness(Ast_406)
  let version = 406
  let string_version = "4.06"
end
let ocaml_406 : OCaml_406.types ocaml_version = (module OCaml_406)
(*$*)

let all_versions : (module OCaml_version) list = [
  (*$foreach_version (fun suffix _ ->
       printf "(module OCaml_%s : OCaml_version);\n" suffix)*)
  (module OCaml_402 : OCaml_version);
  (module OCaml_403 : OCaml_version);
  (module OCaml_404 : OCaml_version);
  (module OCaml_405 : OCaml_version);
  (module OCaml_406 : OCaml_version);
  (*$*)
]

(*$foreach_version_pair (fun a b ->
   printf "include Register_migration(OCaml_%s)(OCaml_%s)\n" a b;
   printf "  (Migrate_parsetree_%s_%s)(Migrate_parsetree_%s_%s)\n" a b b a
  )
*)
include Register_migration(OCaml_402)(OCaml_403)
    (Migrate_parsetree_402_403)(Migrate_parsetree_403_402)
include Register_migration(OCaml_403)(OCaml_404)
    (Migrate_parsetree_403_404)(Migrate_parsetree_404_403)
include Register_migration(OCaml_404)(OCaml_405)
    (Migrate_parsetree_404_405)(Migrate_parsetree_405_404)
include Register_migration(OCaml_405)(OCaml_406)
    (Migrate_parsetree_405_406)(Migrate_parsetree_406_405)
(*$*)

module OCaml_current = OCaml_406          
let ocaml_current : OCaml_current.types ocaml_version = (module OCaml_current)

(* Make sure the preprocessing worked as expected *)
let _f (x : Parsetree.expression) : OCaml_current.Ast.Parsetree.expression = x

end
module Migrate_parsetree_ast_io : sig 
#1 "migrate_parsetree_ast_io.mli"
# 1 "src/migrate_parsetree_ast_io.mli"
(**************************************************************************)
(*                                                                        *)
(*                         OCaml Migrate Parsetree                        *)
(*                                                                        *)
(*                             Frédéric Bour                              *)
(*                                                                        *)
(*   Copyright 2017 Institut National de Recherche en Informatique et     *)
(*     en Automatique (INRIA).                                            *)
(*                                                                        *)
(*   All rights reserved.  This file is distributed under the terms of    *)
(*   the GNU Lesser General Public License version 2.1, with the          *)
(*   special exception on linking described in the file LICENSE.          *)
(*                                                                        *)
(**************************************************************************)

(** A marshalled ast packs the ast with the corresponding version of the
    frontend *)
type ast =
  | Impl : (module Migrate_parsetree_versions.OCaml_version with
             type Ast.Parsetree.structure = 'concrete) * 'concrete -> ast
  | Intf : (module Migrate_parsetree_versions.OCaml_version with
             type Ast.Parsetree.signature = 'concrete) * 'concrete -> ast

(** A simple alias used for the filename of the source that produced an AST *)
type filename = string

type read_error =
  | Not_a_binary_ast of string
  (** The input doesn't contain a binary AST. The argument corresponds
      to the bytes from the input that were consumed. *)
  | Unknown_version of string
  (** The input contains a binary AST for an unknown version of OCaml.
      The argument is the unknown magic number. *)

(** Load a marshalled AST from a channel

    Any exception raised during unmarshalling (see [Marshal]) can escape.  *)
val from_channel : in_channel -> (filename * ast, read_error) result

(** Load a marshalled AST from a byte string.

    See [from_channel] description for exception that can be raised. *)
val from_bytes : bytes -> int -> (filename * ast, read_error) result

(** Marshal an AST to a channel *)
val to_channel : out_channel -> filename -> ast -> unit

(** Marshal an AST to a byte string *)
val to_bytes : filename -> ast -> bytes

end = struct
#1 "migrate_parsetree_ast_io.ml"
# 1 "src/migrate_parsetree_ast_io.ml"
(**************************************************************************)
(*                                                                        *)
(*                         OCaml Migrate Parsetree                        *)
(*                                                                        *)
(*                             Frédéric Bour                              *)
(*                                                                        *)
(*   Copyright 2017 Institut National de Recherche en Informatique et     *)
(*     en Automatique (INRIA).                                            *)
(*                                                                        *)
(*   All rights reserved.  This file is distributed under the terms of    *)
(*   the GNU Lesser General Public License version 2.1, with the          *)
(*   special exception on linking described in the file LICENSE.          *)
(*                                                                        *)
(**************************************************************************)

type ast =
  | Impl : (module Migrate_parsetree_versions.OCaml_version with
             type Ast.Parsetree.structure = 'concrete) * 'concrete -> ast
  | Intf : (module Migrate_parsetree_versions.OCaml_version with
             type Ast.Parsetree.signature = 'concrete) * 'concrete -> ast

type filename = string

let magic_length = String.length Ast_402.Config.ast_impl_magic_number

let read_magic ic =
  let buf = Bytes.create magic_length in
  let len = input ic buf 0 magic_length in
  let s = Bytes.sub_string buf 0 len in
  if len = magic_length then
    Ok s
  else
    Error s

type read_error =
  | Not_a_binary_ast of string
  | Unknown_version of string

let find_magic magic =
  let rec loop = function
    | [] ->
        let prefix = String.sub magic 0 9 in
        if prefix = String.sub Ast_402.Config.ast_impl_magic_number 0 9 ||
           prefix = String.sub Ast_402.Config.ast_intf_magic_number 0 9 then
          Error (Unknown_version magic)
        else
          Error (Not_a_binary_ast magic)
    | (module Frontend : Migrate_parsetree_versions.OCaml_version) :: tail ->
        if Frontend.Ast.Config.ast_impl_magic_number = magic then
          Ok (fun x -> Impl ((module Frontend), Obj.obj x))
        else if Frontend.Ast.Config.ast_intf_magic_number = magic then
          Ok (fun x -> Intf ((module Frontend), Obj.obj x))
        else
          loop tail
  in
  loop Migrate_parsetree_versions.all_versions

let from_channel ic =
  match read_magic ic with
  | Error s -> Error (Not_a_binary_ast s)
  | Ok s ->
    match find_magic s with
    | Ok inj ->
      let filename : filename = input_value ic in
      let payload = inj (input_value ic) in
      Ok (filename, payload)
    | Error _ as e  -> e

let from_bytes bytes pos =
  if Bytes.length bytes - pos < magic_length then
    Error (Not_a_binary_ast "")
  else
    let magic = Bytes.to_string (Bytes.sub bytes pos magic_length) in
    match find_magic magic with
    | Ok inj ->
      let filename_pos = pos + magic_length in
      let filename : filename = Marshal.from_bytes bytes filename_pos in
      let payload_pos = filename_pos + Marshal.total_size bytes filename_pos in
      let payload = inj (Marshal.from_bytes bytes payload_pos) in
      Ok (filename, payload)
    | Error _ as e -> e

let decompose_ast = function
  | Impl ((module Frontend), tree) ->
      (Frontend.Ast.Config.ast_impl_magic_number, Obj.repr tree)
  | Intf ((module Frontend), tree) ->
      (Frontend.Ast.Config.ast_intf_magic_number, Obj.repr tree)

let to_channel oc (filename : filename) x =
  let magic_number, payload = decompose_ast x in
  output_string oc magic_number;
  output_value oc filename;
  output_value oc payload

let to_bytes (filename : filename) x =
  let magic_number, payload = decompose_ast x in
  Bytes.cat (
    Bytes.cat
      (Bytes.of_string magic_number)
      (Marshal.to_bytes filename [])
  ) (Marshal.to_bytes payload [])

end
module Migrate_parsetree_compiler_functions
= struct
#1 "migrate_parsetree_compiler_functions.ml"
# 1 "src/migrate_parsetree_compiler_functions.ml"
# 1 "src/compiler-functions/ge_406.ml"
let error_of_exn exn =
  match Location.error_of_exn exn with
  | Some (`Ok exn) -> Some exn
  | Some `Already_displayed -> None
  | None -> None

end
module Migrate_parsetree_driver : sig 
#1 "migrate_parsetree_driver.mli"
# 1 "src/migrate_parsetree_driver.mli"
open Migrate_parsetree_versions

(** {1 State a rewriter can access} *)

type extra = ..

type config = {
  tool_name       : string;
  include_dirs    : string list;
  load_path       : string list;
  debug           : bool;
  for_package     : string option;
  (** Additional parameters that can be passed by a caller of
      [rewrite_{signature,structure}] to a specific register rewriter. *)
  extras          : extra list;
}

val make_config
  :  tool_name:string
  -> ?include_dirs:string list
  -> ?load_path:string list
  -> ?debug:bool
  -> ?for_package:string
  -> ?extras:extra list
  -> unit
  -> config

type cookies

val get_cookie
  : cookies
  -> string
  -> 'types ocaml_version -> 'types get_expression option

val set_cookie
  : cookies
  -> string
  -> 'types ocaml_version -> 'types get_expression
  -> unit

(** {1 Registering rewriters} *)

type 'types rewriter = config -> cookies -> 'types get_mapper

val register
  :  name:string
  -> ?reset_args:(unit -> unit) -> ?args:(Arg.key * Arg.spec * Arg.doc) list
  -> 'types ocaml_version -> 'types rewriter
  -> unit

(** {1 Running registered rewriters} *)

val run_as_ast_mapper : string list -> Ast_mapper.mapper

val run_as_ppx_rewriter : unit -> 'a

val run_main : unit -> 'a

(** {1 Manual mapping} *)

type some_signature =
  | Sig : (module Migrate_parsetree_versions.OCaml_version with
            type Ast.Parsetree.signature = 'concrete) * 'concrete -> some_signature

type some_structure =
  | Str : (module Migrate_parsetree_versions.OCaml_version with
            type Ast.Parsetree.structure = 'concrete) * 'concrete -> some_structure

val migrate_some_signature
  :  'version ocaml_version
  -> some_signature
  -> 'version get_signature

val migrate_some_structure
  :  'version ocaml_version
  -> some_structure
  -> 'version get_structure

val rewrite_signature
  :  config
  -> 'version ocaml_version
  -> 'version get_signature
  -> some_signature

val rewrite_structure
  :  config
  -> 'version ocaml_version
  -> 'version get_structure
  -> some_structure

end = struct
#1 "migrate_parsetree_driver.ml"
# 1 "src/migrate_parsetree_driver.ml"
open Migrate_parsetree_versions
module Ast_io = Migrate_parsetree_ast_io

(** {1 State a rewriter can access} *)

type extra = ..

type config = {
  tool_name: string;
  include_dirs : string list;
  load_path : string list;
  debug : bool;
  for_package : string option;
  extras : extra list;
}

let make_config ~tool_name ?(include_dirs=[]) ?(load_path=[]) ?(debug=false)
      ?for_package ?(extras=[]) () =
  { tool_name
  ; include_dirs
  ; load_path
  ; debug
  ; for_package
  ; extras
  }

type cookie = Cookie : 'types ocaml_version * 'types get_expression -> cookie

type cookies = (string, cookie) Hashtbl.t

let create_cookies () = Hashtbl.create 3

let get_cookie table name version =
  match
    match Hashtbl.find table name with
    | result -> Some result
    | exception Not_found ->
        match Ast_mapper.get_cookie name with
        | None -> None
        | Some expr -> Some (Cookie ((module OCaml_current), expr))
  with
  | None -> None
  | Some (Cookie (version', expr)) ->
    Some ((migrate version' version).copy_expression expr)

let set_cookie table name version expr =
  Hashtbl.replace table name (Cookie (version, expr))

let apply_cookies table =
  Hashtbl.iter (fun name (Cookie (version, expr)) ->
      Ast_mapper.set_cookie name
        ((migrate version (module OCaml_current)).copy_expression expr)
    ) table

let initial_state () =
  {
    tool_name = Ast_mapper.tool_name ();
    include_dirs = !Clflags.include_dirs;
    load_path = !Config.load_path;
    debug = !Clflags.debug;
    for_package = !Clflags.for_package;
    extras = [];
  }

(** {1 Registering rewriters} *)

type 'types rewriter = config -> cookies -> 'types get_mapper

type rewriter_group =
    Rewriters : 'types ocaml_version * (string * 'types rewriter) list -> rewriter_group

let uniq_rewriter = Hashtbl.create 7
let registered_rewriters = ref []

let uniq_arg = Hashtbl.create 7
let registered_args_reset = ref []
let registered_args = ref []

let () =
  let set_cookie s =
    match String.index s '=' with
    | exception _ ->
      raise (Arg.Bad "invalid cookie, must be of the form \"<name>=<expr>\"")
    | i ->
      let name = String.sub s 0 i in
      let value = String.sub s (i + 1) (String.length s - i - 1) in
      let input_name = "<command-line>" in
      Location.input_name := input_name;
      let lexbuf = Lexing.from_string value in
      lexbuf.Lexing.lex_curr_p <-
        { Lexing.
          pos_fname = input_name
        ; pos_lnum  = 1
        ; pos_bol   = 0
        ; pos_cnum  = 0
        };
      let expr = Parse.expression lexbuf in
      Ast_mapper.set_cookie name expr
  in
  registered_args :=
    ("--cookie", Arg.String set_cookie,
     "NAME=EXPR Set the cookie NAME to EXPR") :: !registered_args

type ('types, 'version, 'rewriter) is_rewriter =
  | Is_rewriter : ('types, 'types ocaml_version, 'types rewriter) is_rewriter

let add_rewriter
    (type types) (type version) (type rewriter)
    (Is_rewriter : (types, version, rewriter) is_rewriter)
    (version : version) name (rewriter : rewriter) =
  let rec add_rewriter = function
  | [] -> [Rewriters (version, [name, rewriter])]
  | (Rewriters (version', rewriters) as x) :: xs ->
      match compare_ocaml_version version version' with
      | Eq -> Rewriters (version', (name, rewriter) :: rewriters) :: xs
      | Lt -> Rewriters (version, [name, rewriter]) :: x :: xs
      | Gt -> x :: add_rewriter xs
  in
  add_rewriter

let register ~name ?reset_args ?(args=[]) version rewriter =
  (* Validate name *)
  if name = "" then
    invalid_arg "Migrate_parsetree_driver.register: name is empty";
  if Hashtbl.mem uniq_rewriter name then
    invalid_arg ("Migrate_parsetree_driver.register: rewriter " ^ name ^ " has already been registered")
  else Hashtbl.add uniq_rewriter name ();
  (* Validate arguments *)
  List.iter (fun (arg_name, _, _) ->
      match Hashtbl.find uniq_arg arg_name with
      | other_rewriter ->
          invalid_arg (Printf.sprintf
                         "Migrate_parsetree_driver.register: argument %s is used by %s and %s" arg_name name other_rewriter)
      | exception Not_found ->
          Hashtbl.add uniq_arg arg_name name
    ) args;
  (* Register *)
  begin match reset_args with
  | None -> ()
  | Some f -> registered_args_reset := f :: !registered_args_reset
  end;
  registered_args := List.rev_append args !registered_args;
  registered_rewriters :=
    add_rewriter Is_rewriter version name rewriter !registered_rewriters

(** {1 Accessing or running registered rewriters} *)

type ('types, 'version, 'tree) is_signature =
    Signature : ('types, 'types ocaml_version, 'types get_signature) is_signature

type ('types, 'version, 'tree) is_structure =
    Structure : ('types, 'types ocaml_version, 'types get_structure) is_structure

type some_structure =
  | Str : (module Migrate_parsetree_versions.OCaml_version with
            type Ast.Parsetree.structure = 'concrete) * 'concrete -> some_structure

type some_signature =
  | Sig : (module Migrate_parsetree_versions.OCaml_version with
            type Ast.Parsetree.signature = 'concrete) * 'concrete -> some_signature

let migrate_some_structure dst (Str ((module Version), st)) =
  (migrate (module Version) dst).copy_structure st

let migrate_some_signature dst (Sig ((module Version), sg)) =
  (migrate (module Version) dst).copy_signature sg

let rec rewrite_signature
  : type types version tree.
    config -> cookies ->
    (types, version, tree) is_signature -> version -> tree ->
    rewriter_group list -> some_signature
  = fun (type types) (type version) (type tree)
    config cookies
    (Signature : (types, version, tree) is_signature)
    (version : version)
    (tree : tree)
    -> function
      | [] ->
        let (module Version) = version in
        Sig ((module Version), tree)
      | Rewriters (version', rewriters) :: rest ->
          let rewrite (_name, rewriter) tree =
            let (module Version) = version' in
            Version.Ast.map_signature (rewriter config cookies) tree
          in
          let tree = (migrate version version').copy_signature tree in
          let tree = List.fold_right rewrite rewriters tree in
          rewrite_signature config cookies Signature version' tree rest

let rewrite_signature config version sg =
  let cookies = create_cookies () in
  let sg = rewrite_signature config cookies Signature version sg !registered_rewriters in
  apply_cookies cookies;
  sg

let rec rewrite_structure
  : type types version tree.
    config -> cookies ->
    (types, version, tree) is_structure -> version -> tree ->
    rewriter_group list -> some_structure
  = fun (type types) (type version) (type tree)
    config cookies
    (Structure : (types, version, tree) is_structure)
    (version : version)
    (tree : tree)
    -> function
      | [] ->
        let (module Version) = version in
        Str ((module Version), tree)
      | Rewriters (version', rewriters) :: rest ->
          let rewriter (_name, rewriter) tree =
            let (module Version) = version' in
            Version.Ast.map_structure (rewriter config cookies) tree
          in
          let tree = (migrate version version').copy_structure tree in
          let tree = List.fold_right rewriter rewriters tree in
          rewrite_structure config cookies Structure version' tree rest

let rewrite_structure config version st =
  let cookies = create_cookies () in
  let st = rewrite_structure config cookies Structure version st !registered_rewriters in
  apply_cookies cookies;
  st

let run_as_ast_mapper args =
  let spec = List.rev !registered_args in
  let args, usage =
    let me = Filename.basename Sys.executable_name in
    let args = match args with "--as-ppx" :: args -> args | args -> args in
    (Array.of_list (me :: args),
     Printf.sprintf "%s [options] <input ast file> <output ast file>" me)
  in
  List.iter (fun f -> f ()) !registered_args_reset;
  match
    Arg.parse_argv args spec
      (fun arg -> raise (Arg.Bad (Printf.sprintf "invalid argument %S" arg)))
      usage
  with
  | exception (Arg.Help msg) ->
      prerr_endline msg;
      exit 1
  | () ->
      OCaml_current.Ast.make_top_mapper
        ~signature:(fun sg ->
            let config = initial_state () in
            rewrite_signature config (module OCaml_current) sg
            |> migrate_some_signature (module OCaml_current)
          )
        ~structure:(fun str ->
            let config = initial_state () in
            rewrite_structure config (module OCaml_current) str
            |> migrate_some_structure (module OCaml_current)
          )

let protectx x ~finally ~f =
  match f x with
  | y -> finally x; y
  | exception e -> finally x; raise e

let with_file_in fn ~f =
  protectx (open_in_bin fn) ~finally:close_in ~f

let with_file_out fn ~f =
  protectx (open_out_bin fn) ~finally:close_out ~f

type ('a, 'b) intf_or_impl =
  | Intf of 'a
  | Impl of 'b

let guess_file_kind fn =
  if Filename.check_suffix fn ".ml" then
    Impl fn
  else if Filename.check_suffix fn ".mli" then
    Intf fn
  else
    Location.raise_errorf ~loc:(Location.in_file fn)
      "I can't decide whether %s is an implementation or interface file"
      fn

let check_kind fn ~expected ~got =
  let describe = function
    | Intf _ -> "interface"
    | Impl _ -> "implementation"
  in
  match expected, got with
  | Impl _, Impl _
  | Intf _, Intf _ -> ()
  | _ ->
    Location.raise_errorf ~loc:(Location.in_file fn)
      "Expected an %s got an %s instead"
      (describe expected)
      (describe got)

let load_file file =
  let fn =
    match file with
    | Intf fn -> fn
    | Impl fn -> fn
  in
  with_file_in fn ~f:(fun ic ->
    match Ast_io.from_channel ic with
    | Ok (fn, Ast_io.Intf ((module V), sg)) ->
      check_kind fn ~expected:file ~got:(Intf ());
      (* We need to convert to the current version in order to interpret the cookies using
         [Ast_mapper.drop_ppx_context_*] from the compiler *)
      (fn, Intf ((migrate (module V) (module OCaml_current)).copy_signature sg))
    | Ok (fn, Ast_io.Impl ((module V), st)) ->
      check_kind fn ~expected:file ~got:(Impl ());
      (fn, Impl ((migrate (module V) (module OCaml_current)).copy_structure st))
    | Error (Ast_io.Unknown_version _) ->
      Location.raise_errorf ~loc:(Location.in_file fn)
        "File is a binary ast for an unknown version of OCaml"
    | Error (Ast_io.Not_a_binary_ast prefix_read_from_file) ->
      (* To test if a file is a binary AST file, we have to read the first few bytes of
         the file.

         If it is not a binary AST, we have to parse these bytes and the rest of the file
         as source code. To do that, we prefill the lexbuf buffer with what we read from
         the file to do the test. *)
      let lexbuf = Lexing.from_channel ic in
      let len = String.length prefix_read_from_file in
      String.blit prefix_read_from_file 0 lexbuf.Lexing.lex_buffer 0 len;
      lexbuf.Lexing.lex_buffer_len <- len;
      lexbuf.Lexing.lex_curr_p <-
        { Lexing.
          pos_fname = fn
        ; pos_lnum  = 1
        ; pos_bol   = 0
        ; pos_cnum  = 0
        };
      Location.input_name := fn;
      if Filename.check_suffix fn ".ml" then
        (fn, Impl (Parse.implementation lexbuf))
      else if Filename.check_suffix fn ".mli" then
        (fn, Intf (Parse.interface lexbuf))
      else
        (* TODO: add support for -intf and -impl *)
        Location.raise_errorf ~loc:(Location.in_file fn)
          "I can't decide whether %s is an implementation or interface file"
          fn)

let with_output output ~f =
  match output with
  | None -> f stdout
  | Some fn -> with_file_out fn ~f

let process_file ~config ~output ~dump_ast ~embed_errors file =
  let fn, ast = load_file file in
  let ast =
    match ast with
    | Intf sg ->
      let sg = Ast_mapper.drop_ppx_context_sig ~restore:true sg in
      let sg =
        try
          rewrite_signature config (module OCaml_current) sg
          |> migrate_some_signature (module OCaml_current)
        with exn when embed_errors ->
        match Migrate_parsetree_compiler_functions.error_of_exn exn with
        | None -> raise exn
        | Some error ->
          [ Ast_helper.Sig.extension ~loc:Location.none
              (Ast_mapper.extension_of_error error) ]
      in
      Intf (sg, Ast_mapper.add_ppx_context_sig ~tool_name:config.tool_name sg)
    | Impl st ->
      let st = Ast_mapper.drop_ppx_context_str ~restore:true st in
      let st =
        try
          rewrite_structure config (module OCaml_current) st
          |> migrate_some_structure (module OCaml_current)
        with exn when embed_errors ->
        match Migrate_parsetree_compiler_functions.error_of_exn exn with
        | None -> raise exn
        | Some error ->
          [ Ast_helper.Str.extension ~loc:Location.none
              (Ast_mapper.extension_of_error error) ]
      in
      Impl (st, Ast_mapper.add_ppx_context_str ~tool_name:config.tool_name st)
  in
  with_output output ~f:(fun oc ->
    if dump_ast then begin
      let ast =
        match ast with
        | Intf (_, sg) -> Ast_io.Intf ((module OCaml_current), sg)
        | Impl (_, st) -> Ast_io.Impl ((module OCaml_current), st)
      in
      Ast_io.to_channel oc fn ast
    end else begin
      let ppf = Format.formatter_of_out_channel oc in
      (match ast with
       | Intf (sg, _) -> Pprintast.signature ppf sg
       | Impl (st, _) -> Pprintast.structure ppf st);
      Format.pp_print_newline ppf ()
    end)

let run_as_standalone_driver () =
  let output = ref None in
  let dump_ast = ref false in
  let files = ref [] in
  let embed_errors = ref false in
  let spec =
    let as_ppx () =
      raise (Arg.Bad "--as-ppx must be passed as first argument")
    in
    let as_pp () =
      dump_ast := true;
      embed_errors := true
    in
    [ "--as-ppx", Arg.Unit as_ppx,
      " Act as a -ppx rewriter"
    ; "--as-pp", Arg.Unit as_pp,
      " Shorthand for: --dump-ast --embed-errors"
    ; "--dump-ast", Arg.Set dump_ast,
      " Output a binary AST instead of source code"
    ; "-o", Arg.String (fun o -> output := Some o),
      "FILE Output to this file instead of the standard output"
    ; "--intf", Arg.String (fun fn -> files := Intf fn :: !files),
      "FILE Treat FILE as a .mli file"
    ; "--impl", Arg.String (fun fn -> files := Impl fn :: !files),
      "FILE Treat FILE as a .ml file"
    ; "--embed-errors", Arg.Set embed_errors,
      " Embed error reported by rewriters into the AST"
    ]
  in
  let spec = Arg.align (spec @ List.rev !registered_args) in
  let me = Filename.basename Sys.executable_name in
  let usage = Printf.sprintf "%s [options] [<files>]" me in
  try
    List.iter (fun f -> f ()) !registered_args_reset;
    Arg.parse spec (fun anon -> files := guess_file_kind anon :: !files) usage;
    let output = !output in
    let dump_ast = !dump_ast in
    let embed_errors = !embed_errors in
    let config =
      (* TODO: we could add -I, -L and -g options to populate these fields. *)
      { tool_name    = "migrate_driver"
      ; include_dirs = []
      ; load_path    = []
      ; debug        = false
      ; for_package  = None
      ; extras       = []
      }
    in
    List.iter (process_file ~config ~output ~dump_ast ~embed_errors) (List.rev !files)
  with exn ->
    Location.report_exception Format.err_formatter exn;
    exit 1

let run_as_ppx_rewriter () =
  let a = Sys.argv in
  let n = Array.length a in
  if n <= 2 then begin
    let me = Filename.basename Sys.executable_name in
    Arg.usage (List.rev !registered_args)
      (Printf.sprintf "%s [options] <input ast file> <output ast file>" me);
    exit 2
  end;
  match
    Ast_mapper.apply ~source:a.(n - 2) ~target:a.(n - 1)
      (run_as_ast_mapper (Array.to_list (Array.sub a 1 (n - 3))))
  with
  | () -> exit 0
  | exception (Arg.Bad help) ->
      prerr_endline help;
      exit 1
  | exception exn ->
      Location.report_exception Format.err_formatter exn;
      exit 1

let run_main () =
  if Array.length Sys.argv >= 2 && Sys.argv.(1) = "--as-ppx" then
    run_as_ppx_rewriter ()
  else
    run_as_standalone_driver ();
  exit 0

end
module Migrate_parsetree_parse : sig 
#1 "migrate_parsetree_parse.mli"
# 1 "src/migrate_parsetree_parse.mli"
(**************************************************************************)
(*                                                                        *)
(*                         OCaml Migrate Parsetree                        *)
(*                                                                        *)
(*                             Frédéric Bour                              *)
(*                                                                        *)
(*   Copyright 2017 Institut National de Recherche en Informatique et     *)
(*     en Automatique (INRIA).                                            *)
(*                                                                        *)
(*   All rights reserved.  This file is distributed under the terms of    *)
(*   the GNU Lesser General Public License version 2.1, with the          *)
(*   special exception on linking described in the file LICENSE.          *)
(*                                                                        *)
(**************************************************************************)

(* Parser entry points that migrate to a specified version of OCaml.

   The parser used is the one from current compiler-libs.  The resulting AST is
   then converted to the desired version.

   These parsing functions can raise Migration_errors.
*)

open Migrate_parsetree_versions

val implementation  : 'types ocaml_version -> Lexing.lexbuf -> 'types get_structure
val interface       : 'types ocaml_version -> Lexing.lexbuf -> 'types get_signature
val toplevel_phrase : 'types ocaml_version -> Lexing.lexbuf -> 'types get_toplevel_phrase
val use_file        : 'types ocaml_version -> Lexing.lexbuf -> 'types get_toplevel_phrase list
val core_type       : 'types ocaml_version -> Lexing.lexbuf -> 'types get_core_type
val expression      : 'types ocaml_version -> Lexing.lexbuf -> 'types get_expression
val pattern         : 'types ocaml_version -> Lexing.lexbuf -> 'types get_pattern

end = struct
#1 "migrate_parsetree_parse.ml"
# 1 "src/migrate_parsetree_parse.ml"

(**************************************************************************)
(*                                                                        *)
(*                         OCaml Migrate Parsetree                        *)
(*                                                                        *)
(*                             Frédéric Bour                              *)
(*                                                                        *)
(*   Copyright 2017 Institut National de Recherche en Informatique et     *)
(*     en Automatique (INRIA).                                            *)
(*                                                                        *)
(*   All rights reserved.  This file is distributed under the terms of    *)
(*   the GNU Lesser General Public License version 2.1, with the          *)
(*   special exception on linking described in the file LICENSE.          *)
(*                                                                        *)
(**************************************************************************)

(* Parser entry points that migrate to a specified version of OCaml.

   The parser used is the one from current compiler-libs.  The resulting AST is
   then converted to the desired version.

   These parsing functions can raise Migration_errors.
*)

open Migrate_parsetree_versions

let implementation version =
  let { copy_structure; _ } = migrate ocaml_current version in
  fun lexbuf -> copy_structure (Parse.implementation lexbuf)

let interface version =
  let { copy_signature; _ } = migrate ocaml_current version in
  fun lexbuf -> copy_signature (Parse.interface lexbuf)

let toplevel_phrase version =
  let { copy_toplevel_phrase; _ } = migrate ocaml_current version in
  fun lexbuf -> copy_toplevel_phrase (Parse.toplevel_phrase lexbuf)

let use_file version =
  let { copy_toplevel_phrase; _ } = migrate ocaml_current version in
  fun lexbuf -> List.map copy_toplevel_phrase (Parse.use_file lexbuf)

let core_type version =
  let { copy_core_type; _ } = migrate ocaml_current version in
  fun lexbuf -> copy_core_type (Parse.core_type lexbuf)

let expression version =
  let { copy_expression; _ } = migrate ocaml_current version in
  fun lexbuf -> copy_expression (Parse.expression lexbuf)

let pattern version =
  let { copy_pattern; _ } = migrate ocaml_current version in
  fun lexbuf -> copy_pattern (Parse.pattern lexbuf)

end
module Migrate_parsetree
= struct
#1 "migrate_parsetree.ml"
# 1 "src/migrate_parsetree.ml"
(**************************************************************************)
(*                                                                        *)
(*                         OCaml Migrate Parsetree                        *)
(*                                                                        *)
(*                             Frédéric Bour                              *)
(*                   Jérémie Dimino, Jane Street Europe                   *)
(*                                                                        *)
(*   Copyright 2017 Institut National de Recherche en Informatique et     *)
(*     en Automatique (INRIA).                                            *)
(*                                                                        *)
(*   All rights reserved.  This file is distributed under the terms of    *)
(*   the GNU Lesser General Public License version 2.1, with the          *)
(*   special exception on linking described in the file LICENSE.          *)
(*                                                                        *)
(**************************************************************************)

(*$ #use "src/cinaps_helpers" $*)

(* Shared definitions.
   Mostly errors about features missing in older versions. *)
module Def = Migrate_parsetree_def

(* Copy of OCaml parsetrees *)
(*$foreach_version (fun suffix _ ->
     printf "module Ast_%s = Ast_%s\n" suffix suffix
  )*)
module Ast_402 = Ast_402
module Ast_403 = Ast_403
module Ast_404 = Ast_404
module Ast_405 = Ast_405
module Ast_406 = Ast_406
(*$*)

(* A module for marshalling/unmarshalling arbitrary versions of Asts *)
module Ast_io = Migrate_parsetree_ast_io

(* Manual migration between versions *)
(*$foreach_version_pair (fun x y ->
     printf "module Migrate_%s_%s = Migrate_parsetree_%s_%s\n" x y x y;
     printf "module Migrate_%s_%s = Migrate_parsetree_%s_%s\n" y x y x;
  )*)
module Migrate_402_403 = Migrate_parsetree_402_403
module Migrate_403_402 = Migrate_parsetree_403_402
module Migrate_403_404 = Migrate_parsetree_403_404
module Migrate_404_403 = Migrate_parsetree_404_403
module Migrate_404_405 = Migrate_parsetree_404_405
module Migrate_405_404 = Migrate_parsetree_405_404
module Migrate_405_406 = Migrate_parsetree_405_406
module Migrate_406_405 = Migrate_parsetree_406_405
(*$*)

(* An abstraction of OCaml compiler versions *)
module Versions = Migrate_parsetree_versions

(* All versions are compatible with this signature *)
module type OCaml_version = Versions.OCaml_version

(*$foreach_version (fun suffix _ ->
     printf "module OCaml_%s = Versions.OCaml_%s\n" suffix suffix
  )*)
module OCaml_402 = Versions.OCaml_402
module OCaml_403 = Versions.OCaml_403
module OCaml_404 = Versions.OCaml_404
module OCaml_405 = Versions.OCaml_405
module OCaml_406 = Versions.OCaml_406
(*$*)
module OCaml_current = Versions.OCaml_current

(* A Functor taking two OCaml versions and producing a module of functions
   migrating from one to the other. *)
module Convert = Versions.Convert

(* A [Parse] module that migrate ASTs to the desired version of an AST *)
module Parse = Migrate_parsetree_parse

(* Entrypoints for registering rewriters and making a ppx binary *)
module Driver = Migrate_parsetree_driver

(* Aliases for compiler-libs modules that might be shadowed *)
module Compiler_libs = struct
  module Location = Location
  module Longident = Longident

  module type Asttypes = module type of struct include Asttypes end
  module rec Asttypes : Asttypes = Asttypes

  module type Parsetree = module type of struct include Parsetree end
  module rec Parsetree : Parsetree = Parsetree

  module Docstrings = Docstrings
  module Ast_helper = Ast_helper
  module Ast_mapper = Ast_mapper
end

end
module Reason_attributes
= struct
#1 "reason_attributes.ml"
open Ast_404
open Location
open Parsetree

(** Kinds of attributes *)
type attributesPartition = {
  arityAttrs : attributes;
  docAttrs : attributes;
  stdAttrs : attributes;
  jsxAttrs : attributes;
  stylisticAttrs : attributes;
  uncurried : bool
}

(** Partition attributes into kinds *)
let rec partitionAttributes ?(partDoc=false) ?(allowUncurry=true) attrs : attributesPartition =
  match attrs with
  | [] ->
    {arityAttrs=[]; docAttrs=[]; stdAttrs=[]; jsxAttrs=[]; stylisticAttrs=[]; uncurried = false}
  | (({txt = "bs"}, PStr []) as attr)::atTl ->
    let partition = partitionAttributes ~partDoc ~allowUncurry atTl in
    if allowUncurry then
      {partition with uncurried = true}
    else {partition with stdAttrs=attr::partition.stdAttrs}
  | (({txt="JSX"}, _) as jsx)::atTl ->
    let partition = partitionAttributes ~partDoc ~allowUncurry atTl in
    {partition with jsxAttrs=jsx::partition.jsxAttrs}
  | (({txt="explicit_arity"}, _) as arity_attr)::atTl
  | (({txt="implicit_arity"}, _) as arity_attr)::atTl ->
    let partition = partitionAttributes ~partDoc ~allowUncurry atTl in
    {partition with arityAttrs=arity_attr::partition.arityAttrs}
  | (({txt="ocaml.text"}, _) as doc)::atTl when partDoc = true ->
    let partition = partitionAttributes ~partDoc ~allowUncurry atTl in
    {partition with docAttrs=doc::partition.docAttrs}
  | (({txt="ocaml.doc"}, _) as doc)::atTl when partDoc = true ->
    let partition = partitionAttributes ~partDoc ~allowUncurry atTl in
    {partition with docAttrs=doc::partition.docAttrs}
  | (({txt="reason.raw_literal"}, _) as attr) :: atTl ->
    let partition = partitionAttributes ~partDoc ~allowUncurry atTl in
    {partition with stylisticAttrs=attr::partition.stylisticAttrs}
  | (({txt="reason.preserve_braces"}, _) as attr) :: atTl ->
    let partition = partitionAttributes ~partDoc ~allowUncurry atTl in
    {partition with stylisticAttrs=attr::partition.stylisticAttrs}
  | atHd :: atTl ->
    let partition = partitionAttributes ~partDoc ~allowUncurry atTl in
    {partition with stdAttrs=atHd::partition.stdAttrs}

let extractStdAttrs attrs =
  (partitionAttributes attrs).stdAttrs

let extract_raw_literal attrs =
  let rec loop acc = function
    | ({txt="reason.raw_literal"},
       PStr [{pstr_desc = Pstr_eval({pexp_desc = Pexp_constant(Pconst_string(text, None))}, _)}])
      :: rest ->
      (Some text, List.rev_append acc rest)
    | [] -> (None, List.rev acc)
    | attr :: rest -> loop (attr :: acc) rest
  in
  loop [] attrs

let without_stylistic_attrs attrs =
  let rec loop acc = function
    | attr :: rest when (partitionAttributes [attr]).stylisticAttrs != [] ->
        loop acc rest
    | [] -> List.rev acc
    | attr :: rest -> loop (attr :: acc) rest
  in
  loop [] attrs

let is_preserve_braces_attr ({txt}, _) =
  txt = "reason.preserve_braces"

let has_preserve_braces_attrs stylisticAttrs =
  (List.filter is_preserve_braces_attr stylisticAttrs) != []

let maybe_remove_stylistic_attrs attrs should_preserve =
  if should_preserve then
    attrs
  else
    List.filter (function
      | ({txt="reason.raw_literal"}, _) -> true
      | _ -> false)
      attrs

end
module Reason_syntax_util : sig 
#1 "reason_syntax_util.mli"
# 1 "reason_syntax_util.cppo.mli"
(* Hello! Welcome to the Reason syntax util logic.

  This file's shared between the Reason repo and the BuckleScript repo. In
  Reason, it's in src/reason-parser. In BuckleScript, it's in
  jscomp/outcome_printer. We periodically copy this file from Reason (the source
  of truth) to BuckleScript, then uncomment the #if #else #end cppo macros you
  see in the file. That's because BuckleScript's on OCaml 4.02 while Reason's on
  4.04; so the #if macros surround the pieces of code that are different between
  the two compilers.

  When you modify this file, please make sure you're not dragging in too many
  things. You don't necessarily have to test the file on both Reason and
  BuckleScript; ping @chenglou and a few others and we'll keep them synced up by
  patching the right parts, through the power of types(tm)
*)

val ml_to_reason_swap : string -> string

val escape_string : string -> string

(* Everything below is used by reason repo but not the BuckleScript repo *)


# 25 "reason_syntax_util.cppo.mli"
val reason_to_ml_swap : string -> string

module TrailingCommaMarker : sig val char : char val string : string end
module EOLMarker : sig val char : char val string : string end

val pick_while : ('a -> bool) -> 'a list -> 'a list * 'a list

val split_by : ?keep_empty:bool -> (char -> bool) -> string -> string list

val processLineEndingsAndStarts : string -> string

val isLineComment : string -> bool

val syntax_error_extension_node :
  Ast_404.Location.t ->
  string -> string Ast_404.Location.loc * Ast_404.Parsetree.payload

val remove_stylistic_attrs_mapper : Ast_404.Ast_mapper.mapper

val escape_stars_slashes_mapper :
  Ast_404.Ast_mapper.mapper -> Ast_404.Ast_mapper.mapper

val reason_to_ml_swap_operator_mapper :
  Ast_404.Ast_mapper.mapper -> Ast_404.Ast_mapper.mapper

val ml_to_reason_swap_operator_mapper :
  Ast_404.Ast_mapper.mapper -> Ast_404.Ast_mapper.mapper

val attribute_exists : 'a -> ('a Ast_404.Asttypes.loc * 'b) list -> bool

val attributes_conflicted :
  'a -> 'a -> ('a Ast_404.Asttypes.loc * 'b) list -> bool

val normalized_attributes :
  'a ->
  ('a Ast_404.Asttypes.loc * 'b) list -> ('a Ast_404.Asttypes.loc * 'b) list

val apply_mapper_to_structure :
  Ast_404.Parsetree.structure ->
  Ast_404.Ast_mapper.mapper -> Ast_404.Parsetree.structure

val apply_mapper_to_signature :
  Ast_404.Parsetree.signature ->
  Ast_404.Ast_mapper.mapper -> Ast_404.Parsetree.signature

val apply_mapper_to_type :
  Ast_404.Parsetree.core_type ->
  Ast_404.Ast_mapper.mapper -> Ast_404.Parsetree.core_type

val apply_mapper_to_expr :
  Ast_404.Parsetree.expression ->
  Ast_404.Ast_mapper.mapper -> Ast_404.Parsetree.expression

val apply_mapper_to_pattern :
  Ast_404.Parsetree.pattern ->
  Ast_404.Ast_mapper.mapper -> Ast_404.Parsetree.pattern

val apply_mapper_to_toplevel_phrase :
  Ast_404.Parsetree.toplevel_phrase ->
  Ast_404.Ast_mapper.mapper -> Ast_404.Parsetree.toplevel_phrase

val apply_mapper_to_use_file :
  Ast_404.Parsetree.toplevel_phrase list ->
  Ast_404.Ast_mapper.mapper -> Ast_404.Parsetree.toplevel_phrase list

type error = Syntax_error of string

exception Error of Ast_404.Location.t * error

val map_first : ('a -> 'a) -> 'a list -> 'a list

val map_last : ('a -> 'a) -> 'a list -> 'a list

type menhirMessagesError = { msg : string; loc : Ast_404.Location.t; }

type menhirError =
    NoMenhirMessagesError
  | MenhirMessagesError of menhirMessagesError

val findMenhirErrorMessage : Ast_404.Location.t -> menhirError

val default_error_message : string

val add_error_message : menhirMessagesError -> unit

val location_is_before : Ast_404.Location.t -> Ast_404.Location.t -> bool

val location_contains : Ast_404.Location.t -> Ast_404.Location.t -> bool

val explode_str : string -> char list

end = struct
#1 "reason_syntax_util.ml"
# 1 "reason_syntax_util.cppo.ml"
(* Hello! Welcome to the Reason syntax util logic.

  This file's shared between the Reason repo and the BuckleScript repo. In
  Reason, it's in src/reason-parser. In BuckleScript, it's in
  jscomp/outcome_printer. We periodically copy this file from Reason (the source
  of truth) to BuckleScript, then uncomment the #if #else #end cppo macros you
  see in the file. That's because BuckleScript's on OCaml 4.02 while Reason's on
  4.04; so the #if macros surround the pieces of code that are different between
  the two compilers.

  When you modify this file, please make sure you're not dragging in too many
  things. You don't necessarily have to test the file on both Reason and
  BuckleScript; ping @chenglou and a few others and we'll keep them synced up by
  patching the right parts, through the power of types(tm)
*)

# 18 "reason_syntax_util.cppo.ml"
open Ast_404

# 21 "reason_syntax_util.cppo.ml"
open Asttypes
open Ast_mapper
open Parsetree
open Longident

(** Check to see if the string `s` is made up of `keyword` and zero or more
    trailing `_` characters. *)
let potentially_conflicts_with ~keyword s =
  let s_length = String.length s in
  let keyword_length = String.length keyword in
  (* It can't be a match if s is shorter than keyword *)
  s_length >= keyword_length && (
    try
      (* Ensure s starts with keyword... *)
      for i = 0 to keyword_length - 1 do
        if keyword.[i] <> s.[i] then raise Exit;
      done;
      (* ...and contains nothing else except trailing _ characters *)
      for i = keyword_length to s_length - 1 do
        if s.[i] <> '_' then raise Exit;
      done;
      (* If we've made it this far there's a potential conflict *)
      true
    with
    | Exit -> false
  )

(** Add/remove an appropriate suffix when mangling potential keywords *)
let string_add_suffix x = x ^ "_"
let string_drop_suffix x = String.sub x 0 (String.length x - 1)

(** What do these *_swap functions do? Here's an example: Reason code uses `!`
    for logical not, while ocaml uses `not`. So, for converting between reason
    and ocaml syntax, ocaml `not` converts to `!`, reason `!` converts to
    `not`.

    In more complicated cases where a reserved keyword exists in one syntax but
    not the other, these functions translate any potentially conflicting
    identifier into the same identifier with a suffix attached, or remove the
    suffix when converting back. Two examples:

    reason to ocaml:

    pub: invalid in reason to begin with
    pub_: pub
    pub__: pub_

    ocaml to reason:

    pub: pub_
    pub_: pub__
    pub__: pub___

    =====

    reason to ocaml:

    match: match_
    match_: match__
    match__: match___

    ocaml to reason:

    match: invalid in ocaml to begin with
    match_: match
    match__: match_
*)

let reason_to_ml_swap = function
  | "!" -> "not"
  | "^" -> "!"
  | "++" -> "^"
  | "===" -> "=="
  | "==" -> "="
  (* ===\/ and !==\/ are not representable in OCaml but
   * representable in Reason
   *)
  | "\\!==" -> "!=="
  |  "\\===" -> "==="
  | "!=" -> "<>"
  | "!==" -> "!="
  | x when (
    potentially_conflicts_with ~keyword:"match" x
    || potentially_conflicts_with ~keyword:"method" x
    || potentially_conflicts_with ~keyword:"private" x
    || potentially_conflicts_with ~keyword:"not" x) -> string_add_suffix x
  | x when (
    potentially_conflicts_with ~keyword:"switch_" x
    || potentially_conflicts_with ~keyword:"pub_" x
    || potentially_conflicts_with ~keyword:"pri_" x) -> string_drop_suffix x
  | everything_else -> everything_else

let ml_to_reason_swap = function
  | "not" -> "!"
  | "!" -> "^"
  | "^" -> "++"
  | "==" -> "==="
  | "=" -> "=="
  (* ===\/ and !==\/ are not representable in OCaml but
   * representable in Reason
   *)
  | "!==" -> "\\!=="
  |  "===" -> "\\==="
  | "<>" -> "!="
  | "!=" -> "!=="
  | x when (
    potentially_conflicts_with ~keyword:"match_" x
    || potentially_conflicts_with ~keyword:"method_" x
    || potentially_conflicts_with ~keyword:"private_" x
    || potentially_conflicts_with ~keyword:"not_" x) -> string_drop_suffix x
  | x when (
    potentially_conflicts_with ~keyword:"switch" x
    || potentially_conflicts_with ~keyword:"pub" x
    || potentially_conflicts_with ~keyword:"pri" x) -> string_add_suffix x
  | everything_else -> everything_else

let escape_string str =
  let buf = Buffer.create (String.length str) in
  String.iter (fun c ->
      match c with
      | '\t' -> Buffer.add_string buf "\\t"
      | '\r' -> Buffer.add_string buf "\\r"
      | '\n' -> Buffer.add_string buf "\\n"
      | '\\' -> Buffer.add_string buf "\\\\"
      | '"'  -> Buffer.add_string buf "\\\""
      | c when c < ' ' -> Buffer.add_string buf (Char.escaped c)
      | c -> Buffer.add_char buf c
    ) str;
  Buffer.contents buf

(* the stuff below contains side-effects and are not used by BuckleScript's
  vendored version of reason_syntax_util.ml. So we can neglect it *)


# 156 "reason_syntax_util.cppo.ml"
(*
    UTF-8 characters are encoded like this (most editors are UTF-8)
    0xxxxxxx (length 1)
    110xxxxx 10xxxxxx (length 2)
    1110xxxx 10xxxxxx 10xxxxxx (length 3)
    11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (length 4)
   Numbers over 127 cannot be encoded in UTF in a single byte, so they use two
  bytes. That means we can use any characters between 128-255 to encode special
  characters that would never be written by the user and thus never be confused
  for our special formatting characters.
*)
(* Logic for handling special behavior that only happens if things break. We
  use characters that will never appear in the printed output if actually
  written in source code. The OCaml formatter will replace them with the escaped
  versions When moving to a new formatter, the formatter may *not* escape these
  an in that case we need the formatter to accept blacklists of characters to
  escape, but more likely is that the new formatter allows us to do these kinds
  of if-break logic without writing out special characters for post-processing.
*)
module TrailingCommaMarker = struct
  (* TODO: You can detect failed parsings by *NOT* omitting the final comma *ever*. *)
  (* A trailing comma will only be rendered if it is not immediately
   * followed by a closing paren, bracket, or brace *)
  let char = Char.chr 249 (* ˘ *)
  let string = String.make 1 char
end

(* Special character marking the end of a line. Nothing should be printed
 * after this marker. Example usage: // comments shouldn't have content printed
 * at the end of the comment. By attaching an EOLMarker.string at the end of the
 * comment our postprocessing step will ensure a linebreak at the position
 * of the marker. *)
module EOLMarker = struct
  let char = Char.chr 248
  let string = String.make 1 char
end

(** [is_prefixed prefix i str] checks if prefix is the prefix of str
  * starting from position i
  *)
let is_prefixed prefix str i =
  let len = String.length prefix in
  let j = ref 0 in
  while !j < len && String.unsafe_get prefix !j =
                    String.unsafe_get str (i + !j) do
    incr j
  done;
  (!j = len)

(**
 * pick_while returns a tuple where first element is longest prefix (possibly empty) of the list of elements that satisfy p
 * and second element is the remainder of the list
 *)
let rec pick_while p = function
  | [] -> [], []
  | hd::tl when p hd ->
                  let (satisfied, not_satisfied) = pick_while p tl in
                  hd :: satisfied, not_satisfied
  | l -> ([], l)


(** [find_substring sub str i]
    returns the smallest [j >= i] such that [sub = str.[j..length sub - 1]]
    raises [Not_found] if there is no such j
    behavior is not defined if [sub] is the empty string
*)
let find_substring sub str i =
  let len = String.length str - String.length sub in
  let found = ref false and i = ref i in
  while not !found && !i <= len do
    if is_prefixed sub str !i then
      found := true
    else
      incr i;
  done;
  if not !found then
    raise Not_found;
  !i

(** [replace_string old_str new_str str] replaces old_str to new_str in str *)
let replace_string old_str new_str str =
  match find_substring old_str str 0 with
  | exception Not_found -> str
  | occurrence ->
    let buffer = Buffer.create (String.length str + 15) in
    let rec loop i j =
      Buffer.add_substring buffer str i (j - i);
      Buffer.add_string buffer new_str;
      let i = j + String.length old_str in
      match find_substring old_str str i with
      | j -> loop i j
      | exception Not_found ->
        Buffer.add_substring buffer str i (String.length str - i)
    in
    loop 0 occurrence;
    Buffer.contents buffer

(* This is lifted from https://github.com/bloomberg/bucklescript/blob/14d94bb9c7536b4c5f1208c8e8cc715ca002853d/jscomp/ext/ext_string.ml#L32
  Thanks @bobzhang and @hhugo! *)
let split_by ?(keep_empty=false) is_delim str =
  let len = String.length str in
  let rec loop acc last_pos pos =
    if pos = -1 then
      if last_pos = 0 && not keep_empty then
        (*
           {[ split " test_unsafe_obj_ffi_ppx.cmi" ~keep_empty:false ' ']}
        *)
        acc
      else
        String.sub str 0 last_pos :: acc
    else
      if is_delim str.[pos] then
        let new_len = (last_pos - pos - 1) in
        if new_len <> 0 || keep_empty then
          let v = String.sub str (pos + 1) new_len in
          loop ( v :: acc)
            pos (pos - 1)
        else loop acc pos (pos - 1)
    else loop acc last_pos (pos - 1)
  in
  loop [] len (len - 1)

let rec trim_right_idx str idx =
  if idx = -1 then 0
  else
    match String.get str idx with
    | '\t' | ' ' | '\n' | '\r' -> trim_right_idx str (idx - 1)
    | _ -> idx + 1

let trim_right str =
  let length = String.length str in
  if length = 0 then ""
  else
    let index = trim_right_idx str (length - 1) in
    if index = 0 then ""
    else if index = length then
      str
    else String.sub str 0 index


let processLine line =
  let rightTrimmed = trim_right line in
  let trimmedLen = String.length rightTrimmed in
  if trimmedLen = 0 then
    rightTrimmed
  else
    let segments =
      split_by
        ~keep_empty:false
        (fun c -> c = TrailingCommaMarker.char)
        rightTrimmed in
    (* Now we concat the portions back together without any trailing comma markers
      - except we detect if there was a final trailing comma marker which we know
      must be before a newline so we insert a regular comma. This achieves
      "intelligent" trailing commas. *)
    let hadTrailingCommaMarkerBeforeNewline =
      String.get rightTrimmed (trimmedLen - 1) = TrailingCommaMarker.char
    in
    let almostEverything = String.concat "" segments in
    let lineBuilder = if hadTrailingCommaMarkerBeforeNewline then
      almostEverything ^ ","
    else
      almostEverything
    in
    (* Ensure EOLMarker.char is replaced by a newline *)
    split_by ~keep_empty:false (fun c -> c = EOLMarker.char) lineBuilder
    |> List.map trim_right
    |> String.concat "\n"

let processLineEndingsAndStarts str =
  split_by ~keep_empty:true (fun x -> x = '\n') str
  |> List.map processLine
  |> String.concat "\n"
  |> String.trim

let isLineComment str =
  (* true iff the first \n is the last character *)
  match String.index str '\n' with
  | exception Not_found -> false
  | n -> n = String.length str - 1

(** Generate a suitable extension node for Merlin's consumption,
    for the purposes of reporting a syntax error - only used
    in recovery mode.
 *)
let syntax_error_extension_node loc message =
  let str = Location.mkloc "merlin.syntax-error" loc in
  let payload = PStr [{
    pstr_loc = Location.none;
    pstr_desc =
      Pstr_eval (
        {
          pexp_loc = Location.none;
          pexp_desc = Pexp_constant (Parsetree.Pconst_string (message, None));
          pexp_attributes = [];
        },
        []
      );
  }]
 in
 (str, payload)

(** identifier_mapper maps all identifiers in an AST with a mapping function f
  this is used by swap_operator_mapper right below, to traverse the whole AST
  and swapping the symbols listed above.
  *)
let identifier_mapper f super =
{ super with
  expr = begin fun mapper expr ->
    let expr =
      match expr with
        | {pexp_desc=Pexp_ident ({txt} as id)} ->
             let swapped = match txt with
               | Lident s -> Lident (f s)
               | Ldot(longPrefix, s) -> Ldot(longPrefix, f s)
               | Lapply (y,s) -> Lapply (y, s)
             in
             {expr with pexp_desc=Pexp_ident ({id with txt=swapped})}
        | _ -> expr
    in
    super.expr mapper expr
  end;
  pat = begin fun mapper pat ->
    let pat =
      match pat with
        | {ppat_desc=Ppat_var ({txt} as id)} ->
             {pat with ppat_desc=Ppat_var ({id with txt=(f txt)})}
        | _ -> pat
    in
    super.pat mapper pat
  end;
  signature_item = begin fun mapper signatureItem ->
    let signatureItem =
      match signatureItem with
        | {psig_desc=Psig_value ({pval_name} as name)} ->
            {signatureItem with psig_desc=Psig_value ({name with pval_name=({pval_name with txt=(f name.pval_name.txt)})})}
        | _ -> signatureItem
    in
    super.signature_item mapper signatureItem
  end;
  value_description = begin fun mapper desc ->
    let desc =
      match desc with
        | {pval_name = ({txt} as id); pval_prim } when pval_prim != [] ->
          {desc with pval_name = { id with txt = f txt }}
        | _ -> desc
    in
    super.value_description mapper desc
  end;
}

let remove_stylistic_attrs_mapper_maker super =
  let open Ast_404 in
  let open Ast_mapper in
{ super with
  expr = begin fun mapper expr ->
    let {Reason_attributes.stylisticAttrs; arityAttrs; docAttrs; stdAttrs; jsxAttrs} =
      Reason_attributes.partitionAttributes ~allowUncurry:false expr.pexp_attributes
    in
    let expr = if stylisticAttrs != [] then
      { expr with pexp_attributes = arityAttrs @ docAttrs @ stdAttrs @ jsxAttrs }
    else expr
    in
    super.expr mapper expr
  end;
  pat = begin fun mapper pat ->
    let {Reason_attributes.stylisticAttrs; arityAttrs; docAttrs; stdAttrs; jsxAttrs} =
      Reason_attributes.partitionAttributes ~allowUncurry:false pat.ppat_attributes
    in
    let pat = if stylisticAttrs != [] then
      { pat with ppat_attributes = arityAttrs @ docAttrs @ stdAttrs @ jsxAttrs }
    else pat
    in
    super.pat mapper pat
  end;
}

let remove_stylistic_attrs_mapper =
  remove_stylistic_attrs_mapper_maker Ast_mapper.default_mapper

(** escape_stars_slashes_mapper escapes all stars and slashes in an AST *)
let escape_stars_slashes_mapper =
  let escape_stars_slashes str =
    if String.contains str '/' then
      replace_string "/*" "/\\*" @@
      replace_string "*/" "*\\/" @@
      replace_string "//" "/\\/" @@
      str
    else
      str
  in
  identifier_mapper escape_stars_slashes

(* To be used in parser, transform a token into an ast node with different identifier
 *)
let reason_to_ml_swap_operator_mapper = identifier_mapper reason_to_ml_swap

(* To be used in printer, transform an ast node into a token with different identifier
 *)
let ml_to_reason_swap_operator_mapper = identifier_mapper ml_to_reason_swap

(* attribute_equals tests an attribute is txt
 *)
let attribute_equals to_compare = function
  | ({txt}, _) -> txt = to_compare

(* attribute_exists tests if an attribute exists in a list
 *)
let attribute_exists txt attributes = List.exists (attribute_equals txt) attributes

(* conflicted_attributes tests if both attribute1 and attribute2
 * exist
 *)
let attributes_conflicted attribute1 attribute2 attributes =
  attribute_exists attribute1 attributes &&
  attribute_exists attribute2 attributes

(* normalized_attributes removes attribute from a list of attributes
 *)
let normalized_attributes attribute attributes =
  List.filter (fun x -> not (attribute_equals attribute x)) attributes

(* apply_mapper family applies an ast_mapper to an ast *)
let apply_mapper_to_structure s mapper = mapper.structure mapper s
let apply_mapper_to_signature s mapper = mapper.signature mapper s
let apply_mapper_to_type      s mapper = mapper.typ       mapper s
let apply_mapper_to_expr      s mapper = mapper.expr      mapper s
let apply_mapper_to_pattern   s mapper = mapper.pat       mapper s

let apply_mapper_to_toplevel_phrase toplevel_phrase mapper =
  match toplevel_phrase with
  | Ptop_def x -> Ptop_def (apply_mapper_to_structure x mapper)
  | x -> x

let apply_mapper_to_use_file use_file mapper =
  List.map (fun x -> apply_mapper_to_toplevel_phrase x mapper) use_file

(* The following logic defines our own Error object
 * and register it with ocaml so it knows how to print it
 *)

type error = Syntax_error of string

exception Error of Location.t * error

let report_error ppf (Syntax_error err) =
  Format.(fprintf ppf "%s" err)

let () =
  Location.register_error_of_exn
    (function
     | Error (loc, err) ->
        Some (Location.error_of_printer loc report_error err)
     | _ ->
        None
     )

let map_first f = function
  | [] -> invalid_arg "Syntax_util.map_first: empty list"
  | x :: xs -> f x :: xs

let map_last f l =
  match List.rev l with
  | [] -> invalid_arg "Syntax_util.map_last: empty list"
  | x :: xs -> List.rev (f x :: xs)

type menhirMessagesError = {
  msg: string;
  loc: Location.t;
}

type menhirError =
  | NoMenhirMessagesError
  | MenhirMessagesError of menhirMessagesError

let menhirMessagesError = ref [NoMenhirMessagesError]

let findMenhirErrorMessage loc =
    let rec find messages =
      match messages with
      | MenhirMessagesError err :: _ when err.loc = loc -> MenhirMessagesError err
      | _ :: tail -> find tail
      | [] -> NoMenhirMessagesError
    in find !menhirMessagesError

let default_error_message = "<syntax error>"

let add_error_message err =
  let msg = try
    ignore (find_substring default_error_message err.msg 0);
    [MenhirMessagesError {err with msg = "A syntax error occurred. Help us improve this message: https://github.com/facebook/reason/blob/master/src/README.md#add-a-menhir-error-message"}]
  with
  | Not_found -> [MenhirMessagesError err]
  in
  menhirMessagesError := !menhirMessagesError @ msg

let location_is_before loc1 loc2 =
  let open Location in
  loc1.loc_end.Lexing.pos_cnum <= loc2.loc_start.Lexing.pos_cnum

let location_contains loc1 loc2 =
  let open Location in
  loc1.loc_start.Lexing.pos_cnum <= loc2.loc_start.Lexing.pos_cnum &&
  loc1.loc_end.Lexing.pos_cnum >= loc2.loc_end.Lexing.pos_cnum

let explode_str str =
  let rec loop acc i =
    if i < 0 then acc else loop (str.[i] :: acc) (i - 1)
  in
    loop [] (String.length str - 1)

end
module Reason_comment
= struct
#1 "reason_comment.ml"
open Location

type category =
  | EndOfLine
  | SingleLine
  | Regular

let string_of_category = function
  | Regular -> "Regular"
  | EndOfLine -> "End of Line"
  | SingleLine -> "SingleLine"

type t = {
  location: Location.t;
  category: category;
  text: string;
}

let category t = t.category

let location t = t.location

let dump ppf t =
  Format.fprintf ppf "%d (%d:%d)-%d (%d:%d) -- %s:||%s||"
    t.location.loc_start.pos_cnum
    t.location.loc_start.pos_lnum
    (t.location.loc_start.pos_cnum - t.location.loc_start.pos_bol)
    t.location.loc_end.pos_cnum
    t.location.loc_end.pos_lnum
    (t.location.loc_end.pos_cnum - t.location.loc_end.pos_bol)
    (string_of_category t.category)
    t.text

let dump_list ppf list =
  List.iter (Format.fprintf ppf "%a\n" dump) list

let wrap t =
  match t.text with
  | "" | "*" -> "/***/"
  | txt when Reason_syntax_util.isLineComment txt ->
    "//"
    (* single line comments of the form `// comment` have a `\n` at the end *)
    ^ (String.sub txt 0 (String.length txt - 1))
    ^ Reason_syntax_util.EOLMarker.string
  | txt when txt.[0] = '*' && txt.[1] <> '*' -> "/**" ^ txt ^ "*/"
  | txt -> "/*" ^ txt ^ "*/"

let is_doc t =
  String.length t.text > 0 && t.text.[0] == '*'

let make ~location category text =
  { text; category; location }

let isLineComment {category; text} = match category with
  | SingleLine -> Reason_syntax_util.isLineComment text
  | EndOfLine | Regular -> false

end
module Printer_maker
= struct
#1 "printer_maker.ml"
open Migrate_parsetree

type parse_itype = [ `ML | `Reason | `Binary | `BinaryReason | `Auto ]
type print_itype = [ `ML | `Reason | `Binary | `BinaryReason | `AST | `None ]

exception Invalid_config of string

module type PRINTER =
    sig
        type t

        val parse : use_stdin:bool ->
                    parse_itype ->
                    string ->
                    ((t * Reason_comment.t list) * bool)


        val print : print_itype ->
                    string ->
                    bool ->
                    out_channel ->
                    Format.formatter ->
                    ((t * Reason_comment.t list) -> unit)
    end

let err s = raise (Invalid_config s)

let prepare_output_file name =
    match name with
    | Some name -> open_out_bin name
    | None -> set_binary_mode_out stdout true; stdout

let close_output_file output_file output_chan =
    match output_file with
    | Some _ -> close_out output_chan
    | None -> ()

let ocamlBinaryParser use_stdin filename =
  let chan =
    match use_stdin with
      | true -> stdin
      | false ->
          let file_chan = open_in filename in
          seek_in file_chan 0;
          file_chan
  in
  match Ast_io.from_channel chan with
  | Result.Error _ -> assert false
  | Result.Ok (_, Ast_io.Impl ((module Version), ast)) ->
    let module Convert = Convert(Version)(OCaml_404) in
    ((Obj.magic (Convert.copy_structure ast), []), true, false)
  | Result.Ok (_, Ast_io.Intf ((module Version), ast)) ->
    let module Convert = Convert(Version)(OCaml_404) in
    ((Obj.magic (Convert.copy_signature ast), []), true, true)

let reasonBinaryParser use_stdin filename =
  let chan =
    match use_stdin with
      | true -> stdin
      | false ->
          let file_chan = open_in filename in
          seek_in file_chan 0;
          file_chan
  in
  let (_, _, ast, comments, parsedAsML, parsedAsInterface) = input_value chan in
  ((ast, comments), parsedAsML, parsedAsInterface)

end
module Reason_config
= struct
#1 "reason_config.ml"
(**
 * Copyright (c) 2015-present, Facebook, Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *)
 
let recoverable = ref false

let configure ~r = (
  recoverable := r;
)

end
module MenhirLib : sig 
#1 "menhirLib.mli"
module General : sig
(******************************************************************************)
(*                                                                            *)
(*                                   Menhir                                   *)
(*                                                                            *)
(*                       François Pottier, Inria Paris                        *)
(*              Yann Régis-Gianas, PPS, Université Paris Diderot              *)
(*                                                                            *)
(*  Copyright Inria. All rights reserved. This file is distributed under the  *)
(*  terms of the GNU Library General Public License version 2, with a         *)
(*  special exception on linking, as described in the file LICENSE.           *)
(*                                                                            *)
(******************************************************************************)

(* This module offers general-purpose functions on lists and streams. *)

(* As of 2017/03/31, this module is DEPRECATED. It might be removed in
   the future. *)

(* --------------------------------------------------------------------------- *)

(* Lists. *)

(* [take n xs] returns the [n] first elements of the list [xs]. It is
   acceptable  for the list [xs] to have length less than [n], in
   which case [xs] itself is returned. *)

val take: int -> 'a list -> 'a list

(* [drop n xs] returns the list [xs], deprived of its [n] first elements.
   It is acceptable for the list [xs] to have length less than [n], in
   which case an empty list is returned. *)

val drop: int -> 'a list -> 'a list

(* [uniq cmp xs] assumes that the list [xs] is sorted according to the
   ordering [cmp] and returns the list [xs] deprived of any duplicate
   elements. *)

val uniq: ('a -> 'a -> int) -> 'a list -> 'a list

(* [weed cmp xs] returns the list [xs] deprived of any duplicate elements. *)

val weed: ('a -> 'a -> int) -> 'a list -> 'a list

(* --------------------------------------------------------------------------- *)

(* A stream is a list whose elements are produced on demand. *)

type 'a stream =
    'a head Lazy.t

and 'a head =
  | Nil
  | Cons of 'a * 'a stream

(* The length of a stream. *)

val length: 'a stream -> int

(* Folding over a stream. *)

val foldr: ('a -> 'b -> 'b) -> 'a stream -> 'b -> 'b
end
module Convert : sig
(******************************************************************************)
(*                                                                            *)
(*                                   Menhir                                   *)
(*                                                                            *)
(*                       François Pottier, Inria Paris                        *)
(*              Yann Régis-Gianas, PPS, Université Paris Diderot              *)
(*                                                                            *)
(*  Copyright Inria. All rights reserved. This file is distributed under the  *)
(*  terms of the GNU Library General Public License version 2, with a         *)
(*  special exception on linking, as described in the file LICENSE.           *)
(*                                                                            *)
(******************************************************************************)

(* An ocamlyacc-style, or Menhir-style, parser requires access to
   the lexer, which must be parameterized with a lexing buffer, and
   to the lexing buffer itself, where it reads position information. *)

(* This traditional API is convenient when used with ocamllex, but
   inelegant when used with other lexer generators. *)

type ('token, 'semantic_value) traditional =
    (Lexing.lexbuf -> 'token) -> Lexing.lexbuf -> 'semantic_value

(* This revised API is independent of any lexer generator. Here, the
   parser only requires access to the lexer, and the lexer takes no
   parameters. The tokens returned by the lexer may contain position
   information. *)

type ('token, 'semantic_value) revised =
    (unit -> 'token) -> 'semantic_value

(* --------------------------------------------------------------------------- *)

(* Converting a traditional parser, produced by ocamlyacc or Menhir,
   into a revised parser. *)

(* A token of the revised lexer is essentially a triple of a token
   of the traditional lexer (or raw token), a start position, and
   and end position. The three [get] functions are accessors. *)

(* We do not require the type ['token] to actually be a triple type.
   This enables complex applications where it is a record type with
   more than three fields. It also enables simple applications where
   positions are of no interest, so ['token] is just ['raw_token]
   and [get_startp] and [get_endp] return dummy positions. *)

val traditional2revised:
  ('token -> 'raw_token) ->
  ('token -> Lexing.position) ->
  ('token -> Lexing.position) ->
  ('raw_token, 'semantic_value) traditional ->
  ('token, 'semantic_value) revised

(* --------------------------------------------------------------------------- *)

(* Converting a revised parser back to a traditional parser. *)

val revised2traditional:
  ('raw_token -> Lexing.position -> Lexing.position -> 'token) ->
  ('token, 'semantic_value) revised ->
  ('raw_token, 'semantic_value) traditional

(* --------------------------------------------------------------------------- *)

(* Simplified versions of the above, where concrete triples are used. *)

module Simplified : sig

  val traditional2revised:
    ('token, 'semantic_value) traditional ->
    ('token * Lexing.position * Lexing.position, 'semantic_value) revised

  val revised2traditional:
    ('token * Lexing.position * Lexing.position, 'semantic_value) revised ->
    ('token, 'semantic_value) traditional

end
end
module IncrementalEngine : sig
(******************************************************************************)
(*                                                                            *)
(*                                   Menhir                                   *)
(*                                                                            *)
(*                       François Pottier, Inria Paris                        *)
(*              Yann Régis-Gianas, PPS, Université Paris Diderot              *)
(*                                                                            *)
(*  Copyright Inria. All rights reserved. This file is distributed under the  *)
(*  terms of the GNU Library General Public License version 2, with a         *)
(*  special exception on linking, as described in the file LICENSE.           *)
(*                                                                            *)
(******************************************************************************)

type position = Lexing.position

open General

(* This signature describes the incremental LR engine. *)

(* In this mode, the user controls the lexer, and the parser suspends
   itself when it needs to read a new token. *)

module type INCREMENTAL_ENGINE = sig

  type token

  (* A value of type [production] is (an index for) a production. The start
     productions (which do not exist in an \mly file, but are constructed by
     Menhir internally) are not part of this type. *)

  type production

  (* The type ['a checkpoint] represents an intermediate or final state of the
     parser. An intermediate checkpoint is a suspension: it records the parser's
     current state, and allows parsing to be resumed. The parameter ['a] is
     the type of the semantic value that will eventually be produced if the
     parser succeeds. *)

  (* [Accepted] and [Rejected] are final checkpoints. [Accepted] carries a
     semantic value. *)

  (* [InputNeeded] is an intermediate checkpoint. It means that the parser wishes
     to read one token before continuing. *)

  (* [Shifting] is an intermediate checkpoint. It means that the parser is taking
     a shift transition. It exposes the state of the parser before and after
     the transition. The Boolean parameter tells whether the parser intends to
     request a new token after this transition. (It always does, except when
     it is about to accept.) *)

  (* [AboutToReduce] is an intermediate checkpoint. It means that the parser is
     about to perform a reduction step. It exposes the parser's current
     state as well as the production that is about to be reduced. *)

  (* [HandlingError] is an intermediate checkpoint. It means that the parser has
     detected an error and is currently handling it, in several steps. *)

  (* A value of type ['a env] represents a configuration of the automaton:
     current state, stack, lookahead token, etc. The parameter ['a] is the
     type of the semantic value that will eventually be produced if the parser
     succeeds. *)

  (* In normal operation, the parser works with checkpoints: see the functions
     [offer] and [resume]. However, it is also possible to work directly with
     environments (see the functions [pop], [force_reduction], and [feed]) and
     to reconstruct a checkpoint out of an environment (see [input_needed]).
     This is considered advanced functionality; its purpose is to allow error
     recovery strategies to be programmed by the user. *)

  type 'a env

  type 'a checkpoint = private
    | InputNeeded of 'a env
    | Shifting of 'a env * 'a env * bool
    | AboutToReduce of 'a env * production
    | HandlingError of 'a env
    | Accepted of 'a
    | Rejected

  (* [offer] allows the user to resume the parser after it has suspended
     itself with a checkpoint of the form [InputNeeded env]. [offer] expects the
     old checkpoint as well as a new token and produces a new checkpoint. It does not
     raise any exception. *)

  val offer:
    'a checkpoint ->
    token * position * position ->
    'a checkpoint

  (* [resume] allows the user to resume the parser after it has suspended
     itself with a checkpoint of the form [AboutToReduce (env, prod)] or
     [HandlingError env]. [resume] expects the old checkpoint and produces a new
     checkpoint. It does not raise any exception. *)

  val resume:
    'a checkpoint ->
    'a checkpoint

  (* A token supplier is a function of no arguments which delivers a new token
     (together with its start and end positions) every time it is called. *)

  type supplier =
    unit -> token * position * position

  (* A pair of a lexer and a lexing buffer can be easily turned into a supplier. *)

  val lexer_lexbuf_to_supplier:
    (Lexing.lexbuf -> token) ->
    Lexing.lexbuf ->
    supplier

  (* The functions [offer] and [resume] are sufficient to write a parser loop.
     One can imagine many variations (which is why we expose these functions
     in the first place!). Here, we expose a few variations of the main loop,
     ready for use. *)

  (* [loop supplier checkpoint] begins parsing from [checkpoint], reading
     tokens from [supplier]. It continues parsing until it reaches a
     checkpoint of the form [Accepted v] or [Rejected]. In the former case, it
     returns [v]. In the latter case, it raises the exception [Error]. *)

  val loop: supplier -> 'a checkpoint -> 'a

  (* [loop_handle succeed fail supplier checkpoint] begins parsing from
     [checkpoint], reading tokens from [supplier]. It continues parsing until
     it reaches a checkpoint of the form [Accepted v] or [HandlingError env]
     (or [Rejected], but that should not happen, as [HandlingError _] will be
     observed first). In the former case, it calls [succeed v]. In the latter
     case, it calls [fail] with this checkpoint. It cannot raise [Error].

     This means that Menhir's traditional error-handling procedure (which pops
     the stack until a state that can act on the [error] token is found) does
     not get a chance to run. Instead, the user can implement her own error
     handling code, in the [fail] continuation. *)

  val loop_handle:
    ('a -> 'answer) ->
    ('a checkpoint -> 'answer) ->
    supplier -> 'a checkpoint -> 'answer

  (* [loop_handle_undo] is analogous to [loop_handle], except it passes a pair
     of checkpoints to the failure continuation.

     The first (and oldest) checkpoint is the last [InputNeeded] checkpoint that
     was encountered before the error was detected. The second (and newest)
     checkpoint is where the error was detected, as in [loop_handle]. Going back
     to the first checkpoint can be thought of as undoing any reductions that
     were performed after seeing the problematic token. (These reductions must
     be default reductions or spurious reductions.)

     [loop_handle_undo] must initially be applied to an [InputNeeded] checkpoint.
     The parser's initial checkpoints satisfy this constraint. *)

  val loop_handle_undo:
    ('a -> 'answer) ->
    ('a checkpoint -> 'a checkpoint -> 'answer) ->
    supplier -> 'a checkpoint -> 'answer

  (* [shifts checkpoint] assumes that [checkpoint] has been obtained by
     submitting a token to the parser. It runs the parser from [checkpoint],
     through an arbitrary number of reductions, until the parser either
     accepts this token (i.e., shifts) or rejects it (i.e., signals an error).
     If the parser decides to shift, then [Some env] is returned, where [env]
     is the parser's state just before shifting. Otherwise, [None] is
     returned. *)

  (* It is desirable that the semantic actions be side-effect free, or that
     their side-effects be harmless (replayable). *)

  val shifts: 'a checkpoint -> 'a env option

  (* The function [acceptable] allows testing, after an error has been
     detected, which tokens would have been accepted at this point. It is
     implemented using [shifts]. Its argument should be an [InputNeeded]
     checkpoint. *)

  (* For completeness, one must undo any spurious reductions before carrying out
     this test -- that is, one must apply [acceptable] to the FIRST checkpoint
     that is passed by [loop_handle_undo] to its failure continuation. *)

  (* This test causes some semantic actions to be run! The semantic actions
     should be side-effect free, or their side-effects should be harmless. *)

  (* The position [pos] is used as the start and end positions of the
     hypothetical token, and may be picked up by the semantic actions. We
     suggest using the position where the error was detected. *)

  val acceptable: 'a checkpoint -> token -> position -> bool

  (* The abstract type ['a lr1state] describes the non-initial states of the
     LR(1) automaton. The index ['a] represents the type of the semantic value
     associated with this state's incoming symbol. *)

  type 'a lr1state

  (* The states of the LR(1) automaton are numbered (from 0 and up). *)

  val number: _ lr1state -> int

  (* Productions are numbered. *)

  (* [find_production i] requires the index [i] to be valid. Use with care. *)

  val production_index: production -> int
  val find_production: int -> production

  (* An element is a pair of a non-initial state [s] and a semantic value [v]
     associated with the incoming symbol of this state. The idea is, the value
     [v] was pushed onto the stack just before the state [s] was entered. Thus,
     for some type ['a], the state [s] has type ['a lr1state] and the value [v]
     has type ['a]. In other words, the type [element] is an existential type. *)

  type element =
    | Element: 'a lr1state * 'a * position * position -> element

  (* The parser's stack is (or, more precisely, can be viewed as) a stream of
     elements. The type [stream] is defined by the module [General]. *)

  (* As of 2017/03/31, the types [stream] and [stack] and the function [stack]
     are DEPRECATED. They might be removed in the future. An alternative way
     of inspecting the stack is via the functions [top] and [pop]. *)

  type stack = (* DEPRECATED *)
    element stream

  (* This is the parser's stack, a stream of elements. This stream is empty if
     the parser is in an initial state; otherwise, it is non-empty.  The LR(1)
     automaton's current state is the one found in the top element of the
     stack. *)

  val stack: 'a env -> stack (* DEPRECATED *)

  (* [top env] returns the parser's top stack element. The state contained in
     this stack element is the current state of the automaton. If the stack is
     empty, [None] is returned. In that case, the current state of the
     automaton must be an initial state. *)

  val top: 'a env -> element option

  (* [pop_many i env] pops [i] cells off the automaton's stack. This is done
     via [i] successive invocations of [pop]. Thus, [pop_many 1] is [pop]. The
     index [i] must be nonnegative. The time complexity is O(i). *)

  val pop_many: int -> 'a env -> 'a env option

  (* [get i env] returns the parser's [i]-th stack element. The index [i] is
     0-based: thus, [get 0] is [top]. If [i] is greater than or equal to the
     number of elements in the stack, [None] is returned. The time complexity
     is O(i). *)

  val get: int -> 'a env -> element option

  (* [current_state_number env] is (the integer number of) the automaton's
     current state. This works even if the automaton's stack is empty, in
     which case the current state is an initial state. This number can be
     passed as an argument to a [message] function generated by [menhir
     --compile-errors]. *)

  val current_state_number: 'a env -> int

  (* [equal env1 env2] tells whether the parser configurations [env1] and
     [env2] are equal in the sense that the automaton's current state is the
     same in [env1] and [env2] and the stack is *physically* the same in
     [env1] and [env2]. If [equal env1 env2] is [true], then the sequence of
     the stack elements, as observed via [pop] and [top], must be the same in
     [env1] and [env2]. Also, if [equal env1 env2] holds, then the checkpoints
     [input_needed env1] and [input_needed env2] must be equivalent. The
     function [equal] has time complexity O(1). *)

  val equal: 'a env -> 'a env -> bool

  (* These are the start and end positions of the current lookahead token. If
     invoked in an initial state, this function returns a pair of twice the
     initial position. *)

  val positions: 'a env -> position * position

  (* When applied to an environment taken from a checkpoint of the form
     [AboutToReduce (env, prod)], the function [env_has_default_reduction]
     tells whether the reduction that is about to take place is a default
     reduction. *)

  val env_has_default_reduction: 'a env -> bool

  (* [state_has_default_reduction s] tells whether the state [s] has a default
     reduction. This includes the case where [s] is an accepting state. *)

  val state_has_default_reduction: _ lr1state -> bool

  (* [pop env] returns a new environment, where the parser's top stack cell
     has been popped off. (If the stack is empty, [None] is returned.) This
     amounts to pretending that the (terminal or nonterminal) symbol that
     corresponds to this stack cell has not been read. *)

  val pop: 'a env -> 'a env option

  (* [force_reduction prod env] should be called only if in the state [env]
     the parser is capable of reducing the production [prod]. If this
     condition is satisfied, then this production is reduced, which means that
     its semantic action is executed (this can have side effects!) and the
     automaton makes a goto (nonterminal) transition. If this condition is not
     satisfied, [Invalid_argument _] is raised. *)

  val force_reduction: production -> 'a env -> 'a env

  (* [input_needed env] returns [InputNeeded env]. That is, out of an [env]
     that might have been obtained via a series of calls to the functions
     [pop], [force_reduction], [feed], etc., it produces a checkpoint, which
     can be used to resume normal parsing, by supplying this checkpoint as an
     argument to [offer]. *)

  (* This function should be used with some care. It could "mess up the
     lookahead" in the sense that it allows parsing to resume in an arbitrary
     state [s] with an arbitrary lookahead symbol [t], even though Menhir's
     reachability analysis (menhir --list-errors) might well think that it is
     impossible to reach this particular configuration. If one is using
     Menhir's new error reporting facility, this could cause the parser to
     reach an error state for which no error message has been prepared. *)

  val input_needed: 'a env -> 'a checkpoint

end

(* This signature is a fragment of the inspection API that is made available
   to the user when [--inspection] is used. This fragment contains type
   definitions for symbols. *)

module type SYMBOLS = sig

  (* The type ['a terminal] represents a terminal symbol. The type ['a
     nonterminal] represents a nonterminal symbol. In both cases, the index
     ['a] represents the type of the semantic values associated with this
     symbol. The concrete definitions of these types are generated. *)

  type 'a terminal
  type 'a nonterminal

  (* The type ['a symbol] represents a terminal or nonterminal symbol. It is
     the disjoint union of the types ['a terminal] and ['a nonterminal]. *)

  type 'a symbol =
    | T : 'a terminal -> 'a symbol
    | N : 'a nonterminal -> 'a symbol

  (* The type [xsymbol] is an existentially quantified version of the type
     ['a symbol]. This type is useful in situations where the index ['a]
     is not statically known. *)

  type xsymbol =
    | X : 'a symbol -> xsymbol

end

(* This signature describes the inspection API that is made available to the
   user when [--inspection] is used. *)

module type INSPECTION = sig

  (* The types of symbols are described above. *)

  include SYMBOLS

  (* The type ['a lr1state] is meant to be the same as in [INCREMENTAL_ENGINE]. *)

  type 'a lr1state

  (* The type [production] is meant to be the same as in [INCREMENTAL_ENGINE].
     It represents a production of the grammar. A production can be examined
     via the functions [lhs] and [rhs] below. *)

  type production

  (* An LR(0) item is a pair of a production [prod] and a valid index [i] into
     this production. That is, if the length of [rhs prod] is [n], then [i] is
     comprised between 0 and [n], inclusive. *)

  type item =
      production * int

  (* Ordering functions. *)

  val compare_terminals: _ terminal -> _ terminal -> int
  val compare_nonterminals: _ nonterminal -> _ nonterminal -> int
  val compare_symbols: xsymbol -> xsymbol -> int
  val compare_productions: production -> production -> int
  val compare_items: item -> item -> int

  (* [incoming_symbol s] is the incoming symbol of the state [s], that is,
     the symbol that the parser must recognize before (has recognized when)
     it enters the state [s]. This function gives access to the semantic
     value [v] stored in a stack element [Element (s, v, _, _)]. Indeed,
     by case analysis on the symbol [incoming_symbol s], one discovers the
     type ['a] of the value [v]. *)

  val incoming_symbol: 'a lr1state -> 'a symbol

  (* [items s] is the set of the LR(0) items in the LR(0) core of the LR(1)
     state [s]. This set is not epsilon-closed. This set is presented as a
     list, in an arbitrary order. *)

  val items: _ lr1state -> item list

  (* [lhs prod] is the left-hand side of the production [prod]. This is
     always a non-terminal symbol. *)

  val lhs: production -> xsymbol

  (* [rhs prod] is the right-hand side of the production [prod]. This is
     a (possibly empty) sequence of (terminal or nonterminal) symbols. *)

  val rhs: production -> xsymbol list

  (* [nullable nt] tells whether the non-terminal symbol [nt] is nullable.
     That is, it is true if and only if this symbol produces the empty
     word [epsilon]. *)

  val nullable: _ nonterminal -> bool

  (* [first nt t] tells whether the FIRST set of the nonterminal symbol [nt]
     contains the terminal symbol [t]. That is, it is true if and only if
     [nt] produces a word that begins with [t]. *)

  val first: _ nonterminal -> _ terminal -> bool

  (* [xfirst] is analogous to [first], but expects a first argument of type
     [xsymbol] instead of [_ terminal]. *)

  val xfirst: xsymbol -> _ terminal -> bool

  (* [foreach_terminal] enumerates the terminal symbols, including [error].
     [foreach_terminal_but_error] enumerates the terminal symbols, excluding
     [error]. *)

  val foreach_terminal:           (xsymbol -> 'a -> 'a) -> 'a -> 'a
  val foreach_terminal_but_error: (xsymbol -> 'a -> 'a) -> 'a -> 'a

  (* The type [env] is meant to be the same as in [INCREMENTAL_ENGINE]. *)

  type 'a env

  (* [feed symbol startp semv endp env] causes the parser to consume the
     (terminal or nonterminal) symbol [symbol], accompanied with the semantic
     value [semv] and with the start and end positions [startp] and [endp].
     Thus, the automaton makes a transition, and reaches a new state. The
     stack grows by one cell. This operation is permitted only if the current
     state (as determined by [env]) has an outgoing transition labeled with
     [symbol]. Otherwise, [Invalid_argument _] is raised. *)

  val feed: 'a symbol -> position -> 'a -> position -> 'b env -> 'b env

end

(* This signature combines the incremental API and the inspection API. *)

module type EVERYTHING = sig

  include INCREMENTAL_ENGINE

  include INSPECTION
    with type 'a lr1state := 'a lr1state
    with type production := production
    with type 'a env := 'a env

end
end
module EngineTypes : sig
(******************************************************************************)
(*                                                                            *)
(*                                   Menhir                                   *)
(*                                                                            *)
(*                       François Pottier, Inria Paris                        *)
(*              Yann Régis-Gianas, PPS, Université Paris Diderot              *)
(*                                                                            *)
(*  Copyright Inria. All rights reserved. This file is distributed under the  *)
(*  terms of the GNU Library General Public License version 2, with a         *)
(*  special exception on linking, as described in the file LICENSE.           *)
(*                                                                            *)
(******************************************************************************)

(* This file defines several types and module types that are used in the
   specification of module [Engine]. *)

(* --------------------------------------------------------------------------- *)

(* It would be nice if we could keep the structure of stacks and environments
   hidden. However, stacks and environments must be accessible to semantic
   actions, so the following data structure definitions must be public. *)

(* --------------------------------------------------------------------------- *)

(* A stack is a linked list of cells. A sentinel cell -- which is its own
   successor -- is used to mark the bottom of the stack. The sentinel cell
   itself is not significant -- it contains dummy values. *)

type ('state, 'semantic_value) stack = {

  (* The state that we should go back to if we pop this stack cell. *)

  (* This convention means that the state contained in the top stack cell is
     not the current state [env.current]. It also means that the state found
     within the sentinel is a dummy -- it is never consulted. This convention
     is the same as that adopted by the code-based back-end. *)

  state: 'state;

  (* The semantic value associated with the chunk of input that this cell
     represents. *)

  semv: 'semantic_value;

  (* The start and end positions of the chunk of input that this cell
     represents. *)

  startp: Lexing.position;
  endp: Lexing.position;

  (* The next cell down in the stack. If this is a self-pointer, then this
     cell is the sentinel, and the stack is conceptually empty. *)

  next: ('state, 'semantic_value) stack;

}

(* --------------------------------------------------------------------------- *)

(* A parsing environment contains all of the parser's state (except for the
   current program point). *)

type ('state, 'semantic_value, 'token) env = {

  (* If this flag is true, then the first component of [env.triple] should
     be ignored, as it has been logically overwritten with the [error]
     pseudo-token. *)

  error: bool;

  (* The last token that was obtained from the lexer, together with its start
     and end positions. Warning: before the first call to the lexer has taken
     place, a dummy (and possibly invalid) token is stored here. *)

  triple: 'token * Lexing.position * Lexing.position;

  (* The stack. In [CodeBackend], it is passed around on its own,
     whereas, here, it is accessed via the environment. *)

  stack: ('state, 'semantic_value) stack;

  (* The current state. In [CodeBackend], it is passed around on its
     own, whereas, here, it is accessed via the environment. *)

  current: 'state;

}

(* --------------------------------------------------------------------------- *)

(* This signature describes the parameters that must be supplied to the LR
   engine. *)

module type TABLE = sig

  (* The type of automaton states. *)

  type state

  (* States are numbered. *)

  val number: state -> int

  (* The type of tokens. These can be thought of as real tokens, that is,
     tokens returned by the lexer. They carry a semantic value. This type
     does not include the [error] pseudo-token. *)

  type token

  (* The type of terminal symbols. These can be thought of as integer codes.
     They do not carry a semantic value. This type does include the [error]
     pseudo-token. *)

  type terminal

  (* The type of nonterminal symbols. *)

  type nonterminal

  (* The type of semantic values. *)

  type semantic_value

  (* A token is conceptually a pair of a (non-[error]) terminal symbol and
     a semantic value. The following two functions are the pair projections. *)

  val token2terminal: token -> terminal
  val token2value: token -> semantic_value

  (* Even though the [error] pseudo-token is not a real token, it is a
     terminal symbol. Furthermore, for regularity, it must have a semantic
     value. *)

  val error_terminal: terminal
  val error_value: semantic_value

  (* [foreach_terminal] allows iterating over all terminal symbols. *)

  val foreach_terminal: (terminal -> 'a -> 'a) -> 'a -> 'a

  (* The type of productions. *)

  type production

  val production_index: production -> int
  val find_production: int -> production

  (* If a state [s] has a default reduction on production [prod], then, upon
     entering [s], the automaton should reduce [prod] without consulting the
     lookahead token. The following function allows determining which states
     have default reductions. *)

  (* Instead of returning a value of a sum type -- either [DefRed prod], or
     [NoDefRed] -- it accepts two continuations, and invokes just one of
     them. This mechanism allows avoiding a memory allocation. *)

  val default_reduction:
    state ->
    ('env -> production -> 'answer) ->
    ('env -> 'answer) ->
    'env -> 'answer

  (* An LR automaton can normally take three kinds of actions: shift, reduce,
     or fail. (Acceptance is a particular case of reduction: it consists in
     reducing a start production.) *)

  (* There are two variants of the shift action. [shift/discard s] instructs
     the automaton to discard the current token, request a new one from the
     lexer, and move to state [s]. [shift/nodiscard s] instructs it to move to
     state [s] without requesting a new token. This instruction should be used
     when [s] has a default reduction on [#]. See [CodeBackend.gettoken] for
     details. *)

  (* This is the automaton's action table. It maps a pair of a state and a
     terminal symbol to an action. *)

  (* Instead of returning a value of a sum type -- one of shift/discard,
     shift/nodiscard, reduce, or fail -- this function accepts three
     continuations, and invokes just one them. This mechanism allows avoiding
     a memory allocation. *)

  (* In summary, the parameters to [action] are as follows:

     - the first two parameters, a state and a terminal symbol, are used to
       look up the action table;

     - the next parameter is the semantic value associated with the above
       terminal symbol; it is not used, only passed along to the shift
       continuation, as explained below;

     - the shift continuation expects an environment; a flag that tells
       whether to discard the current token; the terminal symbol that
       is being shifted; its semantic value; and the target state of
       the transition;

     - the reduce continuation expects an environment and a production;

     - the fail continuation expects an environment;

     - the last parameter is the environment; it is not used, only passed
       along to the selected continuation. *)

  val action:
    state ->
    terminal ->
    semantic_value ->
    ('env -> bool -> terminal -> semantic_value -> state -> 'answer) ->
    ('env -> production -> 'answer) ->
    ('env -> 'answer) ->
    'env -> 'answer

  (* This is the automaton's goto table. This table maps a pair of a state
     and a nonterminal symbol to a new state. By extension, it also maps a
     pair of a state and a production to a new state. *)

  (* The function [goto_nt] can be applied to [s] and [nt] ONLY if the state
     [s] has an outgoing transition labeled [nt]. Otherwise, its result is
     undefined. Similarly, the call [goto_prod prod s] is permitted ONLY if
     the state [s] has an outgoing transition labeled with the nonterminal
     symbol [lhs prod]. The function [maybe_goto_nt] involves an additional
     dynamic check and CAN be called even if there is no outgoing transition. *)

  val       goto_nt  : state -> nonterminal -> state
  val       goto_prod: state -> production  -> state
  val maybe_goto_nt:   state -> nonterminal -> state option

  (* [is_start prod] tells whether the production [prod] is a start production. *)

  val is_start: production -> bool

  (* By convention, a semantic action is responsible for:

     1. fetching whatever semantic values and positions it needs off the stack;

     2. popping an appropriate number of cells off the stack, as dictated
        by the length of the right-hand side of the production;

     3. computing a new semantic value, as well as new start and end positions;

     4. pushing a new stack cell, which contains the three values
        computed in step 3;

     5. returning the new stack computed in steps 2 and 4.

     Point 1 is essentially forced upon us: if semantic values were fetched
     off the stack by this interpreter, then the calling convention for
     semantic actions would be variadic: not all semantic actions would have
     the same number of arguments. The rest follows rather naturally. *)

  (* Semantic actions are allowed to raise [Error]. *)

  exception Error

  type semantic_action =
      (state, semantic_value, token) env -> (state, semantic_value) stack

  val semantic_action: production -> semantic_action

  (* [may_reduce state prod] tests whether the state [state] is capable of
     reducing the production [prod]. This function is currently costly and
     is not used by the core LR engine. It is used in the implementation
     of certain functions, such as [force_reduction], which allow the engine
     to be driven programmatically. *)

  val may_reduce: state -> production -> bool

  (* The LR engine requires a number of hooks, which are used for logging. *)

  (* The comments below indicate the conventional messages that correspond
     to these hooks in the code-based back-end; see [CodeBackend]. *)

  (* If the flag [log] is false, then the logging functions are not called.
     If it is [true], then they are called. *)

  val log : bool

  module Log : sig

    (* State %d: *)

    val state: state -> unit

    (* Shifting (<terminal>) to state <state> *)

    val shift: terminal -> state -> unit

    (* Reducing a production should be logged either as a reduction
       event (for regular productions) or as an acceptance event (for
       start productions). *)

    (* Reducing production <production> / Accepting *)

    val reduce_or_accept: production -> unit

    (* Lookahead token is now <terminal> (<pos>-<pos>) *)

    val lookahead_token: terminal -> Lexing.position -> Lexing.position -> unit

    (* Initiating error handling *)

    val initiating_error_handling: unit -> unit

    (* Resuming error handling *)

    val resuming_error_handling: unit -> unit

    (* Handling error in state <state> *)

    val handling_error: state -> unit

  end

end

(* --------------------------------------------------------------------------- *)

(* This signature describes the monolithic (traditional) LR engine. *)

(* In this interface, the parser controls the lexer. *)

module type MONOLITHIC_ENGINE = sig

  type state

  type token

  type semantic_value

  (* An entry point to the engine requires a start state, a lexer, and a lexing
     buffer. It either succeeds and produces a semantic value, or fails and
     raises [Error]. *)

  exception Error

  val entry:
    state ->
    (Lexing.lexbuf -> token) ->
    Lexing.lexbuf ->
    semantic_value

end

(* --------------------------------------------------------------------------- *)

(* The following signatures describe the incremental LR engine. *)

(* First, see [INCREMENTAL_ENGINE] in the file [IncrementalEngine.ml]. *)

(* The [start] function is set apart because we do not wish to publish
   it as part of the generated [parser.mli] file. Instead, the table
   back-end will publish specialized versions of it, with a suitable
   type cast. *)

module type INCREMENTAL_ENGINE_START = sig

  (* [start] is an entry point. It requires a start state and a start position
     and begins the parsing process. If the lexer is based on an OCaml lexing
     buffer, the start position should be [lexbuf.lex_curr_p]. [start] produces
     a checkpoint, which usually will be an [InputNeeded] checkpoint. (It could
     be [Accepted] if this starting state accepts only the empty word. It could
     be [Rejected] if this starting state accepts no word at all.) It does not
     raise any exception. *)

  (* [start s pos] should really produce a checkpoint of type ['a checkpoint],
     for a fixed ['a] that depends on the state [s]. We cannot express this, so
     we use [semantic_value checkpoint], which is safe. The table back-end uses
     [Obj.magic] to produce safe specialized versions of [start]. *)

  type state
  type semantic_value
  type 'a checkpoint

  val start:
    state ->
    Lexing.position ->
    semantic_value checkpoint

end

(* --------------------------------------------------------------------------- *)

(* This signature describes the LR engine, which combines the monolithic
   and incremental interfaces. *)

module type ENGINE = sig

  include MONOLITHIC_ENGINE

  include IncrementalEngine.INCREMENTAL_ENGINE
    with type token := token
     and type 'a lr1state = state (* useful for us; hidden from the end user *)

  include INCREMENTAL_ENGINE_START
    with type state := state
     and type semantic_value := semantic_value
     and type 'a checkpoint := 'a checkpoint

end
end
module Engine : sig
(******************************************************************************)
(*                                                                            *)
(*                                   Menhir                                   *)
(*                                                                            *)
(*                       François Pottier, Inria Paris                        *)
(*              Yann Régis-Gianas, PPS, Université Paris Diderot              *)
(*                                                                            *)
(*  Copyright Inria. All rights reserved. This file is distributed under the  *)
(*  terms of the GNU Library General Public License version 2, with a         *)
(*  special exception on linking, as described in the file LICENSE.           *)
(*                                                                            *)
(******************************************************************************)

open EngineTypes

(* The LR parsing engine. *)

module Make (T : TABLE)
: ENGINE
  with type state = T.state
   and type token = T.token
   and type semantic_value = T.semantic_value
   and type production = T.production
   and type 'a env = (T.state, T.semantic_value, T.token) EngineTypes.env

(* We would prefer not to expose the definition of the type [env].
   However, it must be exposed because some of the code in the
   inspection API needs access to the engine's internals; see
   [InspectionTableInterpreter]. Everything would be simpler if
   --inspection was always ON, but that would lead to bigger parse
   tables for everybody. *)
end
module ErrorReports : sig
(******************************************************************************)
(*                                                                            *)
(*                                   Menhir                                   *)
(*                                                                            *)
(*                       François Pottier, Inria Paris                        *)
(*              Yann Régis-Gianas, PPS, Université Paris Diderot              *)
(*                                                                            *)
(*  Copyright Inria. All rights reserved. This file is distributed under the  *)
(*  terms of the GNU Library General Public License version 2, with a         *)
(*  special exception on linking, as described in the file LICENSE.           *)
(*                                                                            *)
(******************************************************************************)

(* -------------------------------------------------------------------------- *)

(* The following functions help keep track of the start and end positions of
   the last two tokens in a two-place buffer. This is used to nicely display
   where a syntax error took place. *)

type 'a buffer

(* [wrap lexer] returns a pair of a new (initially empty) buffer and a lexer
   which internally relies on [lexer] and updates [buffer] on the fly whenever
   a token is demanded. *)

open Lexing

val wrap:
  (lexbuf -> 'token) ->
  (position * position) buffer * (lexbuf -> 'token)

(* [show f buffer] prints the contents of the buffer, producing a string that
   is typically of the form "after '%s' and before '%s'". The function [f] is
   used to print an element. The buffer MUST be nonempty. *)

val show: ('a -> string) -> 'a buffer -> string

(* [last buffer] returns the last element of the buffer. The buffer MUST be
   nonempty. *)

val last: 'a buffer -> 'a

(* -------------------------------------------------------------------------- *)
end
module Printers : sig
(******************************************************************************)
(*                                                                            *)
(*                                   Menhir                                   *)
(*                                                                            *)
(*                       François Pottier, Inria Paris                        *)
(*              Yann Régis-Gianas, PPS, Université Paris Diderot              *)
(*                                                                            *)
(*  Copyright Inria. All rights reserved. This file is distributed under the  *)
(*  terms of the GNU Library General Public License version 2, with a         *)
(*  special exception on linking, as described in the file LICENSE.           *)
(*                                                                            *)
(******************************************************************************)

(* This module is part of MenhirLib. *)

module Make

  (I : IncrementalEngine.EVERYTHING)

  (User : sig

    (* [print s] is supposed to send the string [s] to some output channel. *)

    val print: string -> unit

    (* [print_symbol s] is supposed to print a representation of the symbol [s]. *)

    val print_symbol: I.xsymbol -> unit

    (* [print_element e] is supposed to print a representation of the element [e].
       This function is optional; if it is not provided, [print_element_as_symbol]
       (defined below) is used instead. *)

    val print_element: (I.element -> unit) option

  end)

: sig

  open I

  (* Printing a list of symbols. *)

  val print_symbols: xsymbol list -> unit

  (* Printing an element as a symbol. This prints just the symbol
     that this element represents; nothing more. *)

  val print_element_as_symbol: element -> unit

  (* Printing a stack as a list of elements. This function needs an element
     printer. It uses [print_element] if provided by the user; otherwise
     it uses [print_element_as_symbol]. (Ending with a newline.) *)

  val print_stack: 'a env -> unit

  (* Printing an item. (Ending with a newline.) *)

  val print_item: item -> unit

  (* Printing a production. (Ending with a newline.) *)

  val print_production: production -> unit

  (* Printing the current LR(1) state. The current state is first displayed
     as a number; then the list of its LR(0) items is printed. (Ending with
     a newline.) *)

  val print_current_state: 'a env -> unit

  (* Printing a summary of the stack and current state. This function just
     calls [print_stack] and [print_current_state] in succession. *)

  val print_env: 'a env -> unit

end
end
module InfiniteArray : sig
(******************************************************************************)
(*                                                                            *)
(*                                   Menhir                                   *)
(*                                                                            *)
(*                       François Pottier, Inria Paris                        *)
(*              Yann Régis-Gianas, PPS, Université Paris Diderot              *)
(*                                                                            *)
(*  Copyright Inria. All rights reserved. This file is distributed under the  *)
(*  terms of the GNU Library General Public License version 2, with a         *)
(*  special exception on linking, as described in the file LICENSE.           *)
(*                                                                            *)
(******************************************************************************)

(** This module implements infinite arrays. **)
type 'a t

(** [make x] creates an infinite array, where every slot contains [x]. **)
val make: 'a -> 'a t

(** [get a i] returns the element contained at offset [i] in the array [a].
   Slots are numbered 0 and up. **)
val get: 'a t -> int -> 'a

(** [set a i x] sets the element contained at offset [i] in the array
    [a] to [x]. Slots are numbered 0 and up. **)
val set: 'a t -> int -> 'a -> unit

(** [extent a] is the length of an initial segment of the array [a]
    that is sufficiently large to contain all [set] operations ever
    performed. In other words, all elements beyond that segment have
    the default value. *)
val extent: 'a t -> int

(** [domain a] is a fresh copy of an initial segment of the array [a]
    whose length is [extent a]. *)
val domain: 'a t -> 'a array
end
module PackedIntArray : sig
(******************************************************************************)
(*                                                                            *)
(*                                   Menhir                                   *)
(*                                                                            *)
(*                       François Pottier, Inria Paris                        *)
(*              Yann Régis-Gianas, PPS, Université Paris Diderot              *)
(*                                                                            *)
(*  Copyright Inria. All rights reserved. This file is distributed under the  *)
(*  terms of the GNU Library General Public License version 2, with a         *)
(*  special exception on linking, as described in the file LICENSE.           *)
(*                                                                            *)
(******************************************************************************)

(* A packed integer array is represented as a pair of an integer [k] and
   a string [s]. The integer [k] is the number of bits per integer that we
   use. The string [s] is just an array of bits, which is read in 8-bit
   chunks. *)

(* The ocaml programming language treats string literals and array literals
   in slightly different ways: the former are statically allocated, while
   the latter are dynamically allocated. (This is rather arbitrary.) In the
   context of Menhir's table-based back-end, where compact, immutable
   integer arrays are needed, ocaml strings are preferable to ocaml arrays. *)

type t =
  int * string

(* [pack a] turns an array of integers into a packed integer array. *)

(* Because the sign bit is the most significant bit, the magnitude of
   any negative number is the word size. In other words, [pack] does
   not achieve any space savings as soon as [a] contains any negative
   numbers, even if they are ``small''. *)

val pack: int array -> t

(* [get t i] returns the integer stored in the packed array [t] at index [i]. *)

(* Together, [pack] and [get] satisfy the following property: if the index [i]
   is within bounds, then [get (pack a) i] equals [a.(i)]. *)

val get: t -> int -> int

(* [get1 t i] returns the integer stored in the packed array [t] at index [i].
   It assumes (and does not check) that the array's bit width is [1]. The
   parameter [t] is just a string. *)

val get1: string -> int -> int

(* [unflatten1 (n, data) i j] accesses the two-dimensional bitmap
   represented by [(n, data)] at indices [i] and [j]. The integer
   [n] is the width of the bitmap; the string [data] is the second
   component of the packed array obtained by encoding the table as
   a one-dimensional array. *)

val unflatten1: int * string -> int -> int -> int

end
module RowDisplacement : sig
(******************************************************************************)
(*                                                                            *)
(*                                   Menhir                                   *)
(*                                                                            *)
(*                       François Pottier, Inria Paris                        *)
(*              Yann Régis-Gianas, PPS, Université Paris Diderot              *)
(*                                                                            *)
(*  Copyright Inria. All rights reserved. This file is distributed under the  *)
(*  terms of the GNU Library General Public License version 2, with a         *)
(*  special exception on linking, as described in the file LICENSE.           *)
(*                                                                            *)
(******************************************************************************)

(* This module compresses a two-dimensional table, where some values
   are considered insignificant, via row displacement. *)

(* A compressed table is represented as a pair of arrays. The
   displacement array is an array of offsets into the data array. *)

type 'a table =
    int array * (* displacement *)
     'a array   (* data *)

(* [compress equal insignificant dummy m n t] turns the two-dimensional table
   [t] into a compressed table. The parameter [equal] is equality of data
   values. The parameter [wildcard] tells which data values are insignificant,
   and can thus be overwritten with other values. The parameter [dummy] is
   used to fill holes in the data array. [m] and [n] are the integer
   dimensions of the table [t]. *)

val compress:
  ('a -> 'a -> bool) ->
  ('a -> bool) ->
  'a ->
  int -> int ->
  'a array array ->
  'a table

(* [get ct i j] returns the value found at indices [i] and [j] in the
   compressed table [ct]. This function call is permitted only if the
   value found at indices [i] and [j] in the original table is
   significant -- otherwise, it could fail abruptly. *)

(* Together, [compress] and [get] have the property that, if the value
   found at indices [i] and [j] in an uncompressed table [t] is
   significant, then [get (compress t) i j] is equal to that value. *)

val get:
  'a table ->
  int -> int ->
  'a

(* [getget] is a variant of [get] which only requires read access,
   via accessors, to the two components of the table. *)

val getget:
  ('displacement -> int -> int) ->
  ('data -> int -> 'a) ->
  'displacement * 'data ->
  int -> int ->
  'a

end
module LinearizedArray : sig
(******************************************************************************)
(*                                                                            *)
(*                                   Menhir                                   *)
(*                                                                            *)
(*                       François Pottier, Inria Paris                        *)
(*              Yann Régis-Gianas, PPS, Université Paris Diderot              *)
(*                                                                            *)
(*  Copyright Inria. All rights reserved. This file is distributed under the  *)
(*  terms of the GNU Library General Public License version 2, with a         *)
(*  special exception on linking, as described in the file LICENSE.           *)
(*                                                                            *)
(******************************************************************************)

(* An array of arrays (of possibly different lengths!) can be ``linearized'',
   i.e., encoded as a data array (by concatenating all of the little arrays)
   and an entry array (which contains offsets into the data array). *)

type 'a t =
  (* data: *)   'a array *
  (* entry: *) int array

(* [make a] turns the array of arrays [a] into a linearized array. *)

val make: 'a array array -> 'a t

(* [read la i j] reads the linearized array [la] at indices [i] and [j].
   Thus, [read (make a) i j] is equivalent to [a.(i).(j)]. *)

val read: 'a t -> int -> int -> 'a

(* [write la i j v] writes the value [v] into the linearized array [la]
   at indices [i] and [j]. *)

val write: 'a t -> int -> int -> 'a -> unit

(* [length la] is the number of rows of the array [la]. Thus, [length (make
   a)] is equivalent to [Array.length a]. *)

val length: 'a t -> int

(* [row_length la i] is the length of the row at index [i] in the linearized
   array [la]. Thus, [row_length (make a) i] is equivalent to [Array.length
   a.(i)]. *)

val row_length: 'a t -> int -> int

(* [read_row la i] reads the row at index [i], producing a list. Thus,
   [read_row (make a) i] is equivalent to [Array.to_list a.(i)]. *)

val read_row: 'a t -> int -> 'a list

(* The following variants read the linearized array via accessors
   [get_data : int -> 'a] and [get_entry : int -> int]. *)

val row_length_via:
  (* get_entry: *) (int -> int) ->
  (* i: *)         int ->
                   int

val read_via:
  (* get_data: *)  (int -> 'a) ->
  (* get_entry: *) (int -> int) ->
  (* i: *)         int ->
  (* j: *)         int ->
                   'a

val read_row_via:
  (* get_data: *)  (int -> 'a) ->
  (* get_entry: *) (int -> int) ->
  (* i: *)         int ->
                   'a list

end
module TableFormat : sig
(******************************************************************************)
(*                                                                            *)
(*                                   Menhir                                   *)
(*                                                                            *)
(*                       François Pottier, Inria Paris                        *)
(*              Yann Régis-Gianas, PPS, Université Paris Diderot              *)
(*                                                                            *)
(*  Copyright Inria. All rights reserved. This file is distributed under the  *)
(*  terms of the GNU Library General Public License version 2, with a         *)
(*  special exception on linking, as described in the file LICENSE.           *)
(*                                                                            *)
(******************************************************************************)

(* This signature defines the format of the parse tables. It is used as
   an argument to [TableInterpreter.Make]. *)

module type TABLES = sig

  (* This is the parser's type of tokens. *)

  type token

  (* This maps a token to its internal (generation-time) integer code. *)

  val token2terminal: token -> int

  (* This is the integer code for the error pseudo-token. *)

  val error_terminal: int

  (* This maps a token to its semantic value. *)

  val token2value: token -> Obj.t

  (* Traditionally, an LR automaton is described by two tables, namely, an
     action table and a goto table. See, for instance, the Dragon book.

     The action table is a two-dimensional matrix that maps a state and a
     lookahead token to an action. An action is one of: shift to a certain
     state, reduce a certain production, accept, or fail.

     The goto table is a two-dimensional matrix that maps a state and a
     non-terminal symbol to either a state or undefined. By construction, this
     table is sparse: its undefined entries are never looked up. A compression
     technique is free to overlap them with other entries.

     In Menhir, things are slightly different. If a state has a default
     reduction on token [#], then that reduction must be performed without
     consulting the lookahead token. As a result, we must first determine
     whether that is the case, before we can obtain a lookahead token and use it
     as an index in the action table.

     Thus, Menhir's tables are as follows.

     A one-dimensional default reduction table maps a state to either ``no
     default reduction'' (encoded as: 0) or ``by default, reduce prod''
     (encoded as: 1 + prod). The action table is looked up only when there
     is no default reduction. *)

  val default_reduction: PackedIntArray.t

  (* Menhir follows Dencker, Dürre and Heuft, who point out that, although the
     action table is not sparse by nature (i.e., the error entries are
     significant), it can be made sparse by first factoring out a binary error
     matrix, then replacing the error entries in the action table with undefined
     entries. Thus:

     A two-dimensional error bitmap maps a state and a terminal to either
     ``fail'' (encoded as: 0) or ``do not fail'' (encoded as: 1). The action
     table, which is now sparse, is looked up only in the latter case. *)

  (* The error bitmap is flattened into a one-dimensional table; its width is
     recorded so as to allow indexing. The table is then compressed via
     [PackedIntArray]. The bit width of the resulting packed array must be
     [1], so it is not explicitly recorded. *)

  (* The error bitmap does not contain a column for the [#] pseudo-terminal.
     Thus, its width is [Terminal.n - 1]. We exploit the fact that the integer
     code assigned to [#] is greatest: the fact that the right-most column
     in the bitmap is missing does not affect the code for accessing it. *)

  val error: int (* width of the bitmap *) * string (* second component of [PackedIntArray.t] *)

  (* A two-dimensional action table maps a state and a terminal to one of
     ``shift to state s and discard the current token'' (encoded as: s | 10),
     ``shift to state s without discarding the current token'' (encoded as: s |
     11), or ``reduce prod'' (encoded as: prod | 01). *)

  (* The action table is first compressed via [RowDisplacement], then packed
     via [PackedIntArray]. *)

  (* Like the error bitmap, the action table does not contain a column for the
     [#] pseudo-terminal. *)

  val action: PackedIntArray.t * PackedIntArray.t

  (* A one-dimensional lhs table maps a production to its left-hand side (a
     non-terminal symbol). *)

  val lhs: PackedIntArray.t

  (* A two-dimensional goto table maps a state and a non-terminal symbol to
     either undefined (encoded as: 0) or a new state s (encoded as: 1 + s). *)

  (* The goto table is first compressed via [RowDisplacement], then packed
     via [PackedIntArray]. *)

  val goto: PackedIntArray.t * PackedIntArray.t

  (* The number of start productions. A production [prod] is a start
     production if and only if [prod < start] holds. This is also the
     number of start symbols. A nonterminal symbol [nt] is a start
     symbol if and only if [nt < start] holds. *)

  val start: int

  (* A one-dimensional semantic action table maps productions to semantic
     actions. The calling convention for semantic actions is described in
     [EngineTypes]. This table contains ONLY NON-START PRODUCTIONS, so the
     indexing is off by [start]. Be careful. *)

  val semantic_action: ((int, Obj.t, token) EngineTypes.env ->
                        (int, Obj.t)        EngineTypes.stack) array

  (* The parser defines its own [Error] exception. This exception can be
     raised by semantic actions and caught by the engine, and raised by the
     engine towards the final user. *)

  exception Error

  (* The parser indicates whether to generate a trace. Generating a
     trace requires two extra tables, which respectively map a
     terminal symbol and a production to a string. *)

  val trace: (string array * string array) option

end
end
module InspectionTableFormat : sig
(******************************************************************************)
(*                                                                            *)
(*                                   Menhir                                   *)
(*                                                                            *)
(*                       François Pottier, Inria Paris                        *)
(*              Yann Régis-Gianas, PPS, Université Paris Diderot              *)
(*                                                                            *)
(*  Copyright Inria. All rights reserved. This file is distributed under the  *)
(*  terms of the GNU Library General Public License version 2, with a         *)
(*  special exception on linking, as described in the file LICENSE.           *)
(*                                                                            *)
(******************************************************************************)

(* This signature defines the format of the tables that are produced (in
   addition to the tables described in [TableFormat]) when the command line
   switch [--inspection] is enabled. It is used as an argument to
   [InspectionTableInterpreter.Make]. *)

module type TABLES = sig

  (* The types of symbols. *)

  include IncrementalEngine.SYMBOLS

  (* The type ['a lr1state] describes an LR(1) state. The generated parser defines
     it internally as [int]. *)

  type 'a lr1state

  (* Some of the tables that follow use encodings of (terminal and
     nonterminal) symbols as integers. So, we need functions that
     map the integer encoding of a symbol to its algebraic encoding. *)

  val    terminal: int -> xsymbol
  val nonterminal: int -> xsymbol

  (* The left-hand side of every production already appears in the
     signature [TableFormat.TABLES], so we need not repeat it here. *)

  (* The right-hand side of every production. This a linearized array
     of arrays of integers, whose [data] and [entry] components have
     been packed. The encoding of symbols as integers in described in
     [TableBackend]. *)

  val rhs: PackedIntArray.t * PackedIntArray.t

  (* A mapping of every (non-initial) state to its LR(0) core. *)

  val lr0_core: PackedIntArray.t

  (* A mapping of every LR(0) state to its set of LR(0) items. Each item is
     represented in its packed form (see [Item]) as an integer. Thus the
     mapping is an array of arrays of integers, which is linearized and
     packed, like [rhs]. *)

  val lr0_items: PackedIntArray.t * PackedIntArray.t

  (* A mapping of every LR(0) state to its incoming symbol, if it has one. *)

  val lr0_incoming: PackedIntArray.t

  (* A table that tells which non-terminal symbols are nullable. *)

  val nullable: string
    (* This is a packed int array of bit width 1. It can be read
       using [PackedIntArray.get1]. *)

  (* A two-table dimensional table, indexed by a nonterminal symbol and
     by a terminal symbol (other than [#]), encodes the FIRST sets. *)

  val first: int (* width of the bitmap *) * string (* second component of [PackedIntArray.t] *)

end

end
module InspectionTableInterpreter : sig
(******************************************************************************)
(*                                                                            *)
(*                                   Menhir                                   *)
(*                                                                            *)
(*                       François Pottier, Inria Paris                        *)
(*              Yann Régis-Gianas, PPS, Université Paris Diderot              *)
(*                                                                            *)
(*  Copyright Inria. All rights reserved. This file is distributed under the  *)
(*  terms of the GNU Library General Public License version 2, with a         *)
(*  special exception on linking, as described in the file LICENSE.           *)
(*                                                                            *)
(******************************************************************************)

(* This functor is invoked inside the generated parser, in [--table] mode. It
   produces no code! It simply constructs the types [symbol] and [xsymbol] on
   top of the generated types [terminal] and [nonterminal]. *)

module Symbols (T : sig

  type 'a terminal
  type 'a nonterminal

end)

: IncrementalEngine.SYMBOLS
  with type 'a terminal := 'a T.terminal
   and type 'a nonterminal := 'a T.nonterminal

(* This functor is invoked inside the generated parser, in [--table] mode. It
   constructs the inspection API on top of the inspection tables described in
   [InspectionTableFormat]. *)

module Make
  (TT : TableFormat.TABLES)
  (IT : InspectionTableFormat.TABLES
        with type 'a lr1state = int)
  (ET : EngineTypes.TABLE
        with type terminal = int
         and type nonterminal = int
         and type semantic_value = Obj.t)
  (E : sig
     type 'a env = (ET.state, ET.semantic_value, ET.token) EngineTypes.env
   end)

: IncrementalEngine.INSPECTION
  with type 'a terminal := 'a IT.terminal
   and type 'a nonterminal := 'a IT.nonterminal
   and type 'a lr1state := 'a IT.lr1state
   and type production := int
   and type 'a env := 'a E.env
end
module TableInterpreter : sig
(******************************************************************************)
(*                                                                            *)
(*                                   Menhir                                   *)
(*                                                                            *)
(*                       François Pottier, Inria Paris                        *)
(*              Yann Régis-Gianas, PPS, Université Paris Diderot              *)
(*                                                                            *)
(*  Copyright Inria. All rights reserved. This file is distributed under the  *)
(*  terms of the GNU Library General Public License version 2, with a         *)
(*  special exception on linking, as described in the file LICENSE.           *)
(*                                                                            *)
(******************************************************************************)

(* This module provides a thin decoding layer for the generated tables, thus
   providing an API that is suitable for use by [Engine.Make]. It is part of
   [MenhirLib]. *)

(* The exception [Error] is declared within the generated parser. This is
   preferable to pre-declaring it here, as it ensures that each parser gets
   its own, distinct [Error] exception. This is consistent with the code-based
   back-end. *)

(* This functor is invoked by the generated parser. *)

module MakeEngineTable
  (T : TableFormat.TABLES)
: EngineTypes.TABLE
    with type state = int
     and type token = T.token
     and type semantic_value = Obj.t
     and type production = int
     and type terminal = int
     and type nonterminal = int
end
module StaticVersion : sig
val require_20181113 : unit
end

end = struct
#1 "menhirLib.ml"
module General = struct
(******************************************************************************)
(*                                                                            *)
(*                                   Menhir                                   *)
(*                                                                            *)
(*                       François Pottier, Inria Paris                        *)
(*              Yann Régis-Gianas, PPS, Université Paris Diderot              *)
(*                                                                            *)
(*  Copyright Inria. All rights reserved. This file is distributed under the  *)
(*  terms of the GNU Library General Public License version 2, with a         *)
(*  special exception on linking, as described in the file LICENSE.           *)
(*                                                                            *)
(******************************************************************************)

(* --------------------------------------------------------------------------- *)

(* Lists. *)

let rec take n xs =
  match n, xs with
  | 0, _
  | _, [] ->
      []
  | _, (x :: xs as input) ->
     let xs' = take (n - 1) xs in
     if xs == xs' then
       input
     else
       x :: xs'

let rec drop n xs =
  match n, xs with
  | 0, _ ->
      xs
  | _, [] ->
      []
  | _, _ :: xs ->
      drop (n - 1) xs

let rec uniq1 cmp x ys =
  match ys with
  | [] ->
      []
  | y :: ys ->
      if cmp x y = 0 then
        uniq1 compare x ys
      else
        y :: uniq1 cmp y ys

let uniq cmp xs =
  match xs with
  | [] ->
      []
  | x :: xs ->
      x :: uniq1 cmp x xs

let weed cmp xs =
  uniq cmp (List.sort cmp xs)

(* --------------------------------------------------------------------------- *)

(* Streams. *)

type 'a stream =
    'a head Lazy.t

and 'a head =
  | Nil
  | Cons of 'a * 'a stream

(* The length of a stream. *)

let rec length xs =
  match Lazy.force xs with
  | Nil ->
      0
  | Cons (_, xs) ->
      1 + length xs

(* Folding over a stream. *)

let rec foldr f xs accu =
  match Lazy.force xs with
  | Nil ->
      accu
  | Cons (x, xs) ->
      f x (foldr f xs accu)

end
module Convert = struct
(******************************************************************************)
(*                                                                            *)
(*                                   Menhir                                   *)
(*                                                                            *)
(*                       François Pottier, Inria Paris                        *)
(*              Yann Régis-Gianas, PPS, Université Paris Diderot              *)
(*                                                                            *)
(*  Copyright Inria. All rights reserved. This file is distributed under the  *)
(*  terms of the GNU Library General Public License version 2, with a         *)
(*  special exception on linking, as described in the file LICENSE.           *)
(*                                                                            *)
(******************************************************************************)

(* An ocamlyacc-style, or Menhir-style, parser requires access to
   the lexer, which must be parameterized with a lexing buffer, and
   to the lexing buffer itself, where it reads position information. *)

(* This traditional API is convenient when used with ocamllex, but
   inelegant when used with other lexer generators. *)

type ('token, 'semantic_value) traditional =
    (Lexing.lexbuf -> 'token) -> Lexing.lexbuf -> 'semantic_value

(* This revised API is independent of any lexer generator. Here, the
   parser only requires access to the lexer, and the lexer takes no
   parameters. The tokens returned by the lexer may contain position
   information. *)

type ('token, 'semantic_value) revised =
    (unit -> 'token) -> 'semantic_value

(* --------------------------------------------------------------------------- *)

(* Converting a traditional parser, produced by ocamlyacc or Menhir,
   into a revised parser. *)

(* A token of the revised lexer is essentially a triple of a token
   of the traditional lexer (or raw token), a start position, and
   and end position. The three [get] functions are accessors. *)

(* We do not require the type ['token] to actually be a triple type.
   This enables complex applications where it is a record type with
   more than three fields. It also enables simple applications where
   positions are of no interest, so ['token] is just ['raw_token]
   and [get_startp] and [get_endp] return dummy positions. *)

let traditional2revised
  (get_raw_token : 'token -> 'raw_token)
  (get_startp    : 'token -> Lexing.position)
  (get_endp      : 'token -> Lexing.position)
  (parser : ('raw_token, 'semantic_value) traditional)
: ('token, 'semantic_value) revised =

  (* Accept a revised lexer. *)

  fun (lexer : unit -> 'token) ->

    (* Create a dummy lexing buffer. *)

    let lexbuf : Lexing.lexbuf =
      Lexing.from_string ""
    in

    (* Wrap the revised lexer as a traditional lexer. A traditional
       lexer returns a raw token and updates the fields of the lexing
       buffer with new positions, which will be read by the parser. *)

    let lexer (lexbuf : Lexing.lexbuf) : 'raw_token =
      let token : 'token = lexer() in
      lexbuf.Lexing.lex_start_p <- get_startp token;
      lexbuf.Lexing.lex_curr_p <- get_endp token;
      get_raw_token token
    in

    (* Invoke the traditional parser. *)

    parser lexer lexbuf

(* --------------------------------------------------------------------------- *)

(* Converting a revised parser back to a traditional parser. *)

let revised2traditional
  (make_token : 'raw_token -> Lexing.position -> Lexing.position -> 'token)
  (parser : ('token, 'semantic_value) revised)
: ('raw_token, 'semantic_value) traditional =

  (* Accept a traditional lexer and a lexing buffer. *)

  fun (lexer : Lexing.lexbuf -> 'raw_token) (lexbuf : Lexing.lexbuf) ->

    (* Wrap the traditional lexer as a revised lexer. *)

    let lexer () : 'token =
      let token : 'raw_token = lexer lexbuf in
      make_token token lexbuf.Lexing.lex_start_p lexbuf.Lexing.lex_curr_p
    in

    (* Invoke the revised parser. *)

    parser lexer

(* --------------------------------------------------------------------------- *)

(* Simplified versions of the above, where concrete triples are used. *)

module Simplified = struct

  let traditional2revised parser =
    traditional2revised
      (fun (token, _, _)  -> token)
      (fun (_, startp, _) -> startp)
      (fun (_, _, endp)   -> endp)
      parser

  let revised2traditional parser =
    revised2traditional
      (fun token startp endp -> (token, startp, endp))
      parser

end
end
module IncrementalEngine = struct
(******************************************************************************)
(*                                                                            *)
(*                                   Menhir                                   *)
(*                                                                            *)
(*                       François Pottier, Inria Paris                        *)
(*              Yann Régis-Gianas, PPS, Université Paris Diderot              *)
(*                                                                            *)
(*  Copyright Inria. All rights reserved. This file is distributed under the  *)
(*  terms of the GNU Library General Public License version 2, with a         *)
(*  special exception on linking, as described in the file LICENSE.           *)
(*                                                                            *)
(******************************************************************************)

type position = Lexing.position

open General

(* This signature describes the incremental LR engine. *)

(* In this mode, the user controls the lexer, and the parser suspends
   itself when it needs to read a new token. *)

module type INCREMENTAL_ENGINE = sig

  type token

  (* A value of type [production] is (an index for) a production. The start
     productions (which do not exist in an \mly file, but are constructed by
     Menhir internally) are not part of this type. *)

  type production

  (* The type ['a checkpoint] represents an intermediate or final state of the
     parser. An intermediate checkpoint is a suspension: it records the parser's
     current state, and allows parsing to be resumed. The parameter ['a] is
     the type of the semantic value that will eventually be produced if the
     parser succeeds. *)

  (* [Accepted] and [Rejected] are final checkpoints. [Accepted] carries a
     semantic value. *)

  (* [InputNeeded] is an intermediate checkpoint. It means that the parser wishes
     to read one token before continuing. *)

  (* [Shifting] is an intermediate checkpoint. It means that the parser is taking
     a shift transition. It exposes the state of the parser before and after
     the transition. The Boolean parameter tells whether the parser intends to
     request a new token after this transition. (It always does, except when
     it is about to accept.) *)

  (* [AboutToReduce] is an intermediate checkpoint. It means that the parser is
     about to perform a reduction step. It exposes the parser's current
     state as well as the production that is about to be reduced. *)

  (* [HandlingError] is an intermediate checkpoint. It means that the parser has
     detected an error and is currently handling it, in several steps. *)

  (* A value of type ['a env] represents a configuration of the automaton:
     current state, stack, lookahead token, etc. The parameter ['a] is the
     type of the semantic value that will eventually be produced if the parser
     succeeds. *)

  (* In normal operation, the parser works with checkpoints: see the functions
     [offer] and [resume]. However, it is also possible to work directly with
     environments (see the functions [pop], [force_reduction], and [feed]) and
     to reconstruct a checkpoint out of an environment (see [input_needed]).
     This is considered advanced functionality; its purpose is to allow error
     recovery strategies to be programmed by the user. *)

  type 'a env

  type 'a checkpoint = private
    | InputNeeded of 'a env
    | Shifting of 'a env * 'a env * bool
    | AboutToReduce of 'a env * production
    | HandlingError of 'a env
    | Accepted of 'a
    | Rejected

  (* [offer] allows the user to resume the parser after it has suspended
     itself with a checkpoint of the form [InputNeeded env]. [offer] expects the
     old checkpoint as well as a new token and produces a new checkpoint. It does not
     raise any exception. *)

  val offer:
    'a checkpoint ->
    token * position * position ->
    'a checkpoint

  (* [resume] allows the user to resume the parser after it has suspended
     itself with a checkpoint of the form [AboutToReduce (env, prod)] or
     [HandlingError env]. [resume] expects the old checkpoint and produces a new
     checkpoint. It does not raise any exception. *)

  val resume:
    'a checkpoint ->
    'a checkpoint

  (* A token supplier is a function of no arguments which delivers a new token
     (together with its start and end positions) every time it is called. *)

  type supplier =
    unit -> token * position * position

  (* A pair of a lexer and a lexing buffer can be easily turned into a supplier. *)

  val lexer_lexbuf_to_supplier:
    (Lexing.lexbuf -> token) ->
    Lexing.lexbuf ->
    supplier

  (* The functions [offer] and [resume] are sufficient to write a parser loop.
     One can imagine many variations (which is why we expose these functions
     in the first place!). Here, we expose a few variations of the main loop,
     ready for use. *)

  (* [loop supplier checkpoint] begins parsing from [checkpoint], reading
     tokens from [supplier]. It continues parsing until it reaches a
     checkpoint of the form [Accepted v] or [Rejected]. In the former case, it
     returns [v]. In the latter case, it raises the exception [Error]. *)

  val loop: supplier -> 'a checkpoint -> 'a

  (* [loop_handle succeed fail supplier checkpoint] begins parsing from
     [checkpoint], reading tokens from [supplier]. It continues parsing until
     it reaches a checkpoint of the form [Accepted v] or [HandlingError env]
     (or [Rejected], but that should not happen, as [HandlingError _] will be
     observed first). In the former case, it calls [succeed v]. In the latter
     case, it calls [fail] with this checkpoint. It cannot raise [Error].

     This means that Menhir's traditional error-handling procedure (which pops
     the stack until a state that can act on the [error] token is found) does
     not get a chance to run. Instead, the user can implement her own error
     handling code, in the [fail] continuation. *)

  val loop_handle:
    ('a -> 'answer) ->
    ('a checkpoint -> 'answer) ->
    supplier -> 'a checkpoint -> 'answer

  (* [loop_handle_undo] is analogous to [loop_handle], except it passes a pair
     of checkpoints to the failure continuation.

     The first (and oldest) checkpoint is the last [InputNeeded] checkpoint that
     was encountered before the error was detected. The second (and newest)
     checkpoint is where the error was detected, as in [loop_handle]. Going back
     to the first checkpoint can be thought of as undoing any reductions that
     were performed after seeing the problematic token. (These reductions must
     be default reductions or spurious reductions.)

     [loop_handle_undo] must initially be applied to an [InputNeeded] checkpoint.
     The parser's initial checkpoints satisfy this constraint. *)

  val loop_handle_undo:
    ('a -> 'answer) ->
    ('a checkpoint -> 'a checkpoint -> 'answer) ->
    supplier -> 'a checkpoint -> 'answer

  (* [shifts checkpoint] assumes that [checkpoint] has been obtained by
     submitting a token to the parser. It runs the parser from [checkpoint],
     through an arbitrary number of reductions, until the parser either
     accepts this token (i.e., shifts) or rejects it (i.e., signals an error).
     If the parser decides to shift, then [Some env] is returned, where [env]
     is the parser's state just before shifting. Otherwise, [None] is
     returned. *)

  (* It is desirable that the semantic actions be side-effect free, or that
     their side-effects be harmless (replayable). *)

  val shifts: 'a checkpoint -> 'a env option

  (* The function [acceptable] allows testing, after an error has been
     detected, which tokens would have been accepted at this point. It is
     implemented using [shifts]. Its argument should be an [InputNeeded]
     checkpoint. *)

  (* For completeness, one must undo any spurious reductions before carrying out
     this test -- that is, one must apply [acceptable] to the FIRST checkpoint
     that is passed by [loop_handle_undo] to its failure continuation. *)

  (* This test causes some semantic actions to be run! The semantic actions
     should be side-effect free, or their side-effects should be harmless. *)

  (* The position [pos] is used as the start and end positions of the
     hypothetical token, and may be picked up by the semantic actions. We
     suggest using the position where the error was detected. *)

  val acceptable: 'a checkpoint -> token -> position -> bool

  (* The abstract type ['a lr1state] describes the non-initial states of the
     LR(1) automaton. The index ['a] represents the type of the semantic value
     associated with this state's incoming symbol. *)

  type 'a lr1state

  (* The states of the LR(1) automaton are numbered (from 0 and up). *)

  val number: _ lr1state -> int

  (* Productions are numbered. *)

  (* [find_production i] requires the index [i] to be valid. Use with care. *)

  val production_index: production -> int
  val find_production: int -> production

  (* An element is a pair of a non-initial state [s] and a semantic value [v]
     associated with the incoming symbol of this state. The idea is, the value
     [v] was pushed onto the stack just before the state [s] was entered. Thus,
     for some type ['a], the state [s] has type ['a lr1state] and the value [v]
     has type ['a]. In other words, the type [element] is an existential type. *)

  type element =
    | Element: 'a lr1state * 'a * position * position -> element

  (* The parser's stack is (or, more precisely, can be viewed as) a stream of
     elements. The type [stream] is defined by the module [General]. *)

  (* As of 2017/03/31, the types [stream] and [stack] and the function [stack]
     are DEPRECATED. They might be removed in the future. An alternative way
     of inspecting the stack is via the functions [top] and [pop]. *)

  type stack = (* DEPRECATED *)
    element stream

  (* This is the parser's stack, a stream of elements. This stream is empty if
     the parser is in an initial state; otherwise, it is non-empty.  The LR(1)
     automaton's current state is the one found in the top element of the
     stack. *)

  val stack: 'a env -> stack (* DEPRECATED *)

  (* [top env] returns the parser's top stack element. The state contained in
     this stack element is the current state of the automaton. If the stack is
     empty, [None] is returned. In that case, the current state of the
     automaton must be an initial state. *)

  val top: 'a env -> element option

  (* [pop_many i env] pops [i] cells off the automaton's stack. This is done
     via [i] successive invocations of [pop]. Thus, [pop_many 1] is [pop]. The
     index [i] must be nonnegative. The time complexity is O(i). *)

  val pop_many: int -> 'a env -> 'a env option

  (* [get i env] returns the parser's [i]-th stack element. The index [i] is
     0-based: thus, [get 0] is [top]. If [i] is greater than or equal to the
     number of elements in the stack, [None] is returned. The time complexity
     is O(i). *)

  val get: int -> 'a env -> element option

  (* [current_state_number env] is (the integer number of) the automaton's
     current state. This works even if the automaton's stack is empty, in
     which case the current state is an initial state. This number can be
     passed as an argument to a [message] function generated by [menhir
     --compile-errors]. *)

  val current_state_number: 'a env -> int

  (* [equal env1 env2] tells whether the parser configurations [env1] and
     [env2] are equal in the sense that the automaton's current state is the
     same in [env1] and [env2] and the stack is *physically* the same in
     [env1] and [env2]. If [equal env1 env2] is [true], then the sequence of
     the stack elements, as observed via [pop] and [top], must be the same in
     [env1] and [env2]. Also, if [equal env1 env2] holds, then the checkpoints
     [input_needed env1] and [input_needed env2] must be equivalent. The
     function [equal] has time complexity O(1). *)

  val equal: 'a env -> 'a env -> bool

  (* These are the start and end positions of the current lookahead token. If
     invoked in an initial state, this function returns a pair of twice the
     initial position. *)

  val positions: 'a env -> position * position

  (* When applied to an environment taken from a checkpoint of the form
     [AboutToReduce (env, prod)], the function [env_has_default_reduction]
     tells whether the reduction that is about to take place is a default
     reduction. *)

  val env_has_default_reduction: 'a env -> bool

  (* [state_has_default_reduction s] tells whether the state [s] has a default
     reduction. This includes the case where [s] is an accepting state. *)

  val state_has_default_reduction: _ lr1state -> bool

  (* [pop env] returns a new environment, where the parser's top stack cell
     has been popped off. (If the stack is empty, [None] is returned.) This
     amounts to pretending that the (terminal or nonterminal) symbol that
     corresponds to this stack cell has not been read. *)

  val pop: 'a env -> 'a env option

  (* [force_reduction prod env] should be called only if in the state [env]
     the parser is capable of reducing the production [prod]. If this
     condition is satisfied, then this production is reduced, which means that
     its semantic action is executed (this can have side effects!) and the
     automaton makes a goto (nonterminal) transition. If this condition is not
     satisfied, [Invalid_argument _] is raised. *)

  val force_reduction: production -> 'a env -> 'a env

  (* [input_needed env] returns [InputNeeded env]. That is, out of an [env]
     that might have been obtained via a series of calls to the functions
     [pop], [force_reduction], [feed], etc., it produces a checkpoint, which
     can be used to resume normal parsing, by supplying this checkpoint as an
     argument to [offer]. *)

  (* This function should be used with some care. It could "mess up the
     lookahead" in the sense that it allows parsing to resume in an arbitrary
     state [s] with an arbitrary lookahead symbol [t], even though Menhir's
     reachability analysis (menhir --list-errors) might well think that it is
     impossible to reach this particular configuration. If one is using
     Menhir's new error reporting facility, this could cause the parser to
     reach an error state for which no error message has been prepared. *)

  val input_needed: 'a env -> 'a checkpoint

end

(* This signature is a fragment of the inspection API that is made available
   to the user when [--inspection] is used. This fragment contains type
   definitions for symbols. *)

module type SYMBOLS = sig

  (* The type ['a terminal] represents a terminal symbol. The type ['a
     nonterminal] represents a nonterminal symbol. In both cases, the index
     ['a] represents the type of the semantic values associated with this
     symbol. The concrete definitions of these types are generated. *)

  type 'a terminal
  type 'a nonterminal

  (* The type ['a symbol] represents a terminal or nonterminal symbol. It is
     the disjoint union of the types ['a terminal] and ['a nonterminal]. *)

  type 'a symbol =
    | T : 'a terminal -> 'a symbol
    | N : 'a nonterminal -> 'a symbol

  (* The type [xsymbol] is an existentially quantified version of the type
     ['a symbol]. This type is useful in situations where the index ['a]
     is not statically known. *)

  type xsymbol =
    | X : 'a symbol -> xsymbol

end

(* This signature describes the inspection API that is made available to the
   user when [--inspection] is used. *)

module type INSPECTION = sig

  (* The types of symbols are described above. *)

  include SYMBOLS

  (* The type ['a lr1state] is meant to be the same as in [INCREMENTAL_ENGINE]. *)

  type 'a lr1state

  (* The type [production] is meant to be the same as in [INCREMENTAL_ENGINE].
     It represents a production of the grammar. A production can be examined
     via the functions [lhs] and [rhs] below. *)

  type production

  (* An LR(0) item is a pair of a production [prod] and a valid index [i] into
     this production. That is, if the length of [rhs prod] is [n], then [i] is
     comprised between 0 and [n], inclusive. *)

  type item =
      production * int

  (* Ordering functions. *)

  val compare_terminals: _ terminal -> _ terminal -> int
  val compare_nonterminals: _ nonterminal -> _ nonterminal -> int
  val compare_symbols: xsymbol -> xsymbol -> int
  val compare_productions: production -> production -> int
  val compare_items: item -> item -> int

  (* [incoming_symbol s] is the incoming symbol of the state [s], that is,
     the symbol that the parser must recognize before (has recognized when)
     it enters the state [s]. This function gives access to the semantic
     value [v] stored in a stack element [Element (s, v, _, _)]. Indeed,
     by case analysis on the symbol [incoming_symbol s], one discovers the
     type ['a] of the value [v]. *)

  val incoming_symbol: 'a lr1state -> 'a symbol

  (* [items s] is the set of the LR(0) items in the LR(0) core of the LR(1)
     state [s]. This set is not epsilon-closed. This set is presented as a
     list, in an arbitrary order. *)

  val items: _ lr1state -> item list

  (* [lhs prod] is the left-hand side of the production [prod]. This is
     always a non-terminal symbol. *)

  val lhs: production -> xsymbol

  (* [rhs prod] is the right-hand side of the production [prod]. This is
     a (possibly empty) sequence of (terminal or nonterminal) symbols. *)

  val rhs: production -> xsymbol list

  (* [nullable nt] tells whether the non-terminal symbol [nt] is nullable.
     That is, it is true if and only if this symbol produces the empty
     word [epsilon]. *)

  val nullable: _ nonterminal -> bool

  (* [first nt t] tells whether the FIRST set of the nonterminal symbol [nt]
     contains the terminal symbol [t]. That is, it is true if and only if
     [nt] produces a word that begins with [t]. *)

  val first: _ nonterminal -> _ terminal -> bool

  (* [xfirst] is analogous to [first], but expects a first argument of type
     [xsymbol] instead of [_ terminal]. *)

  val xfirst: xsymbol -> _ terminal -> bool

  (* [foreach_terminal] enumerates the terminal symbols, including [error].
     [foreach_terminal_but_error] enumerates the terminal symbols, excluding
     [error]. *)

  val foreach_terminal:           (xsymbol -> 'a -> 'a) -> 'a -> 'a
  val foreach_terminal_but_error: (xsymbol -> 'a -> 'a) -> 'a -> 'a

  (* The type [env] is meant to be the same as in [INCREMENTAL_ENGINE]. *)

  type 'a env

  (* [feed symbol startp semv endp env] causes the parser to consume the
     (terminal or nonterminal) symbol [symbol], accompanied with the semantic
     value [semv] and with the start and end positions [startp] and [endp].
     Thus, the automaton makes a transition, and reaches a new state. The
     stack grows by one cell. This operation is permitted only if the current
     state (as determined by [env]) has an outgoing transition labeled with
     [symbol]. Otherwise, [Invalid_argument _] is raised. *)

  val feed: 'a symbol -> position -> 'a -> position -> 'b env -> 'b env

end

(* This signature combines the incremental API and the inspection API. *)

module type EVERYTHING = sig

  include INCREMENTAL_ENGINE

  include INSPECTION
    with type 'a lr1state := 'a lr1state
    with type production := production
    with type 'a env := 'a env

end
end
module EngineTypes = struct
(******************************************************************************)
(*                                                                            *)
(*                                   Menhir                                   *)
(*                                                                            *)
(*                       François Pottier, Inria Paris                        *)
(*              Yann Régis-Gianas, PPS, Université Paris Diderot              *)
(*                                                                            *)
(*  Copyright Inria. All rights reserved. This file is distributed under the  *)
(*  terms of the GNU Library General Public License version 2, with a         *)
(*  special exception on linking, as described in the file LICENSE.           *)
(*                                                                            *)
(******************************************************************************)

(* This file defines several types and module types that are used in the
   specification of module [Engine]. *)

(* --------------------------------------------------------------------------- *)

(* It would be nice if we could keep the structure of stacks and environments
   hidden. However, stacks and environments must be accessible to semantic
   actions, so the following data structure definitions must be public. *)

(* --------------------------------------------------------------------------- *)

(* A stack is a linked list of cells. A sentinel cell -- which is its own
   successor -- is used to mark the bottom of the stack. The sentinel cell
   itself is not significant -- it contains dummy values. *)

type ('state, 'semantic_value) stack = {

  (* The state that we should go back to if we pop this stack cell. *)

  (* This convention means that the state contained in the top stack cell is
     not the current state [env.current]. It also means that the state found
     within the sentinel is a dummy -- it is never consulted. This convention
     is the same as that adopted by the code-based back-end. *)

  state: 'state;

  (* The semantic value associated with the chunk of input that this cell
     represents. *)

  semv: 'semantic_value;

  (* The start and end positions of the chunk of input that this cell
     represents. *)

  startp: Lexing.position;
  endp: Lexing.position;

  (* The next cell down in the stack. If this is a self-pointer, then this
     cell is the sentinel, and the stack is conceptually empty. *)

  next: ('state, 'semantic_value) stack;

}

(* --------------------------------------------------------------------------- *)

(* A parsing environment contains all of the parser's state (except for the
   current program point). *)

type ('state, 'semantic_value, 'token) env = {

  (* If this flag is true, then the first component of [env.triple] should
     be ignored, as it has been logically overwritten with the [error]
     pseudo-token. *)

  error: bool;

  (* The last token that was obtained from the lexer, together with its start
     and end positions. Warning: before the first call to the lexer has taken
     place, a dummy (and possibly invalid) token is stored here. *)

  triple: 'token * Lexing.position * Lexing.position;

  (* The stack. In [CodeBackend], it is passed around on its own,
     whereas, here, it is accessed via the environment. *)

  stack: ('state, 'semantic_value) stack;

  (* The current state. In [CodeBackend], it is passed around on its
     own, whereas, here, it is accessed via the environment. *)

  current: 'state;

}

(* --------------------------------------------------------------------------- *)

(* This signature describes the parameters that must be supplied to the LR
   engine. *)

module type TABLE = sig

  (* The type of automaton states. *)

  type state

  (* States are numbered. *)

  val number: state -> int

  (* The type of tokens. These can be thought of as real tokens, that is,
     tokens returned by the lexer. They carry a semantic value. This type
     does not include the [error] pseudo-token. *)

  type token

  (* The type of terminal symbols. These can be thought of as integer codes.
     They do not carry a semantic value. This type does include the [error]
     pseudo-token. *)

  type terminal

  (* The type of nonterminal symbols. *)

  type nonterminal

  (* The type of semantic values. *)

  type semantic_value

  (* A token is conceptually a pair of a (non-[error]) terminal symbol and
     a semantic value. The following two functions are the pair projections. *)

  val token2terminal: token -> terminal
  val token2value: token -> semantic_value

  (* Even though the [error] pseudo-token is not a real token, it is a
     terminal symbol. Furthermore, for regularity, it must have a semantic
     value. *)

  val error_terminal: terminal
  val error_value: semantic_value

  (* [foreach_terminal] allows iterating over all terminal symbols. *)

  val foreach_terminal: (terminal -> 'a -> 'a) -> 'a -> 'a

  (* The type of productions. *)

  type production

  val production_index: production -> int
  val find_production: int -> production

  (* If a state [s] has a default reduction on production [prod], then, upon
     entering [s], the automaton should reduce [prod] without consulting the
     lookahead token. The following function allows determining which states
     have default reductions. *)

  (* Instead of returning a value of a sum type -- either [DefRed prod], or
     [NoDefRed] -- it accepts two continuations, and invokes just one of
     them. This mechanism allows avoiding a memory allocation. *)

  val default_reduction:
    state ->
    ('env -> production -> 'answer) ->
    ('env -> 'answer) ->
    'env -> 'answer

  (* An LR automaton can normally take three kinds of actions: shift, reduce,
     or fail. (Acceptance is a particular case of reduction: it consists in
     reducing a start production.) *)

  (* There are two variants of the shift action. [shift/discard s] instructs
     the automaton to discard the current token, request a new one from the
     lexer, and move to state [s]. [shift/nodiscard s] instructs it to move to
     state [s] without requesting a new token. This instruction should be used
     when [s] has a default reduction on [#]. See [CodeBackend.gettoken] for
     details. *)

  (* This is the automaton's action table. It maps a pair of a state and a
     terminal symbol to an action. *)

  (* Instead of returning a value of a sum type -- one of shift/discard,
     shift/nodiscard, reduce, or fail -- this function accepts three
     continuations, and invokes just one them. This mechanism allows avoiding
     a memory allocation. *)

  (* In summary, the parameters to [action] are as follows:

     - the first two parameters, a state and a terminal symbol, are used to
       look up the action table;

     - the next parameter is the semantic value associated with the above
       terminal symbol; it is not used, only passed along to the shift
       continuation, as explained below;

     - the shift continuation expects an environment; a flag that tells
       whether to discard the current token; the terminal symbol that
       is being shifted; its semantic value; and the target state of
       the transition;

     - the reduce continuation expects an environment and a production;

     - the fail continuation expects an environment;

     - the last parameter is the environment; it is not used, only passed
       along to the selected continuation. *)

  val action:
    state ->
    terminal ->
    semantic_value ->
    ('env -> bool -> terminal -> semantic_value -> state -> 'answer) ->
    ('env -> production -> 'answer) ->
    ('env -> 'answer) ->
    'env -> 'answer

  (* This is the automaton's goto table. This table maps a pair of a state
     and a nonterminal symbol to a new state. By extension, it also maps a
     pair of a state and a production to a new state. *)

  (* The function [goto_nt] can be applied to [s] and [nt] ONLY if the state
     [s] has an outgoing transition labeled [nt]. Otherwise, its result is
     undefined. Similarly, the call [goto_prod prod s] is permitted ONLY if
     the state [s] has an outgoing transition labeled with the nonterminal
     symbol [lhs prod]. The function [maybe_goto_nt] involves an additional
     dynamic check and CAN be called even if there is no outgoing transition. *)

  val       goto_nt  : state -> nonterminal -> state
  val       goto_prod: state -> production  -> state
  val maybe_goto_nt:   state -> nonterminal -> state option

  (* [is_start prod] tells whether the production [prod] is a start production. *)

  val is_start: production -> bool

  (* By convention, a semantic action is responsible for:

     1. fetching whatever semantic values and positions it needs off the stack;

     2. popping an appropriate number of cells off the stack, as dictated
        by the length of the right-hand side of the production;

     3. computing a new semantic value, as well as new start and end positions;

     4. pushing a new stack cell, which contains the three values
        computed in step 3;

     5. returning the new stack computed in steps 2 and 4.

     Point 1 is essentially forced upon us: if semantic values were fetched
     off the stack by this interpreter, then the calling convention for
     semantic actions would be variadic: not all semantic actions would have
     the same number of arguments. The rest follows rather naturally. *)

  (* Semantic actions are allowed to raise [Error]. *)

  exception Error

  type semantic_action =
      (state, semantic_value, token) env -> (state, semantic_value) stack

  val semantic_action: production -> semantic_action

  (* [may_reduce state prod] tests whether the state [state] is capable of
     reducing the production [prod]. This function is currently costly and
     is not used by the core LR engine. It is used in the implementation
     of certain functions, such as [force_reduction], which allow the engine
     to be driven programmatically. *)

  val may_reduce: state -> production -> bool

  (* The LR engine requires a number of hooks, which are used for logging. *)

  (* The comments below indicate the conventional messages that correspond
     to these hooks in the code-based back-end; see [CodeBackend]. *)

  (* If the flag [log] is false, then the logging functions are not called.
     If it is [true], then they are called. *)

  val log : bool

  module Log : sig

    (* State %d: *)

    val state: state -> unit

    (* Shifting (<terminal>) to state <state> *)

    val shift: terminal -> state -> unit

    (* Reducing a production should be logged either as a reduction
       event (for regular productions) or as an acceptance event (for
       start productions). *)

    (* Reducing production <production> / Accepting *)

    val reduce_or_accept: production -> unit

    (* Lookahead token is now <terminal> (<pos>-<pos>) *)

    val lookahead_token: terminal -> Lexing.position -> Lexing.position -> unit

    (* Initiating error handling *)

    val initiating_error_handling: unit -> unit

    (* Resuming error handling *)

    val resuming_error_handling: unit -> unit

    (* Handling error in state <state> *)

    val handling_error: state -> unit

  end

end

(* --------------------------------------------------------------------------- *)

(* This signature describes the monolithic (traditional) LR engine. *)

(* In this interface, the parser controls the lexer. *)

module type MONOLITHIC_ENGINE = sig

  type state

  type token

  type semantic_value

  (* An entry point to the engine requires a start state, a lexer, and a lexing
     buffer. It either succeeds and produces a semantic value, or fails and
     raises [Error]. *)

  exception Error

  val entry:
    state ->
    (Lexing.lexbuf -> token) ->
    Lexing.lexbuf ->
    semantic_value

end

(* --------------------------------------------------------------------------- *)

(* The following signatures describe the incremental LR engine. *)

(* First, see [INCREMENTAL_ENGINE] in the file [IncrementalEngine.ml]. *)

(* The [start] function is set apart because we do not wish to publish
   it as part of the generated [parser.mli] file. Instead, the table
   back-end will publish specialized versions of it, with a suitable
   type cast. *)

module type INCREMENTAL_ENGINE_START = sig

  (* [start] is an entry point. It requires a start state and a start position
     and begins the parsing process. If the lexer is based on an OCaml lexing
     buffer, the start position should be [lexbuf.lex_curr_p]. [start] produces
     a checkpoint, which usually will be an [InputNeeded] checkpoint. (It could
     be [Accepted] if this starting state accepts only the empty word. It could
     be [Rejected] if this starting state accepts no word at all.) It does not
     raise any exception. *)

  (* [start s pos] should really produce a checkpoint of type ['a checkpoint],
     for a fixed ['a] that depends on the state [s]. We cannot express this, so
     we use [semantic_value checkpoint], which is safe. The table back-end uses
     [Obj.magic] to produce safe specialized versions of [start]. *)

  type state
  type semantic_value
  type 'a checkpoint

  val start:
    state ->
    Lexing.position ->
    semantic_value checkpoint

end

(* --------------------------------------------------------------------------- *)

(* This signature describes the LR engine, which combines the monolithic
   and incremental interfaces. *)

module type ENGINE = sig

  include MONOLITHIC_ENGINE

  include IncrementalEngine.INCREMENTAL_ENGINE
    with type token := token
     and type 'a lr1state = state (* useful for us; hidden from the end user *)

  include INCREMENTAL_ENGINE_START
    with type state := state
     and type semantic_value := semantic_value
     and type 'a checkpoint := 'a checkpoint

end
end
module Engine = struct
(******************************************************************************)
(*                                                                            *)
(*                                   Menhir                                   *)
(*                                                                            *)
(*                       François Pottier, Inria Paris                        *)
(*              Yann Régis-Gianas, PPS, Université Paris Diderot              *)
(*                                                                            *)
(*  Copyright Inria. All rights reserved. This file is distributed under the  *)
(*  terms of the GNU Library General Public License version 2, with a         *)
(*  special exception on linking, as described in the file LICENSE.           *)
(*                                                                            *)
(******************************************************************************)

type position = Lexing.position
open EngineTypes

(* The LR parsing engine. *)

(* This module is used:

   - at compile time, if so requested by the user, via the --interpret options;
   - at run time, in the table-based back-end. *)

module Make (T : TABLE) = struct

  (* This propagates type and exception definitions. The functions [number],
     [production_index], [find_production], too, are defined by this [include]
     declaration. *)

  include T

  type 'a env =
      (state, semantic_value, token) EngineTypes.env

  (* ------------------------------------------------------------------------ *)

  (* The type [checkpoint] represents an intermediate or final result of the
     parser. See [EngineTypes]. *)

  (* The type [checkpoint] is presented to the user as a private type (see
     [IncrementalEngine]). This prevents the user from manufacturing
     checkpoints (i.e., continuations) that do not make sense. (Such
     continuations could potentially violate the LR invariant and lead to
     crashes.) *)

  (* 2017/03/29 Although [checkpoint] is a private type, we now expose a
     constructor function, [input_needed]. This function allows manufacturing
     a checkpoint out of an environment. For this reason, the type [env] must
     also be parameterized with ['a]. *)

  type 'a checkpoint =
    | InputNeeded of 'a env
    | Shifting of 'a env * 'a env * bool
    | AboutToReduce of 'a env * production
    | HandlingError of 'a env
    | Accepted of 'a
    | Rejected

  (* ------------------------------------------------------------------------ *)

  (* In the code-based back-end, the [run] function is sometimes responsible
     for pushing a new cell on the stack. This is motivated by code sharing
     concerns. In this interpreter, there is no such concern; [run]'s caller
     is always responsible for updating the stack. *)

  (* In the code-based back-end, there is a [run] function for each state
     [s]. This function can behave in two slightly different ways, depending
     on when it is invoked, or (equivalently) depending on [s].

     If [run] is invoked after shifting a terminal symbol (or, equivalently,
     if [s] has a terminal incoming symbol), then [run] discards a token,
     unless [s] has a default reduction on [#]. (Indeed, in that case,
     requesting the next token might drive the lexer off the end of the input
     stream.)

     If, on the other hand, [run] is invoked after performing a goto
     transition, or invoked directly by an entry point, then there is nothing
     to discard.

     These two cases are reflected in [CodeBackend.gettoken].

     Here, the code is structured in a slightly different way. It is up to the
     caller of [run] to indicate whether to discard a token, via the parameter
     [please_discard]. This flag is set when [s] is being entered by shifting
     a terminal symbol and [s] does not have a default reduction on [#]. *)

  (* The following recursive group of functions are tail recursive, produce a
     checkpoint of type [semantic_value checkpoint], and cannot raise an
     exception. A semantic action can raise [Error], but this exception is
     immediately caught within [reduce]. *)

  let rec run env please_discard : semantic_value checkpoint =

    (* Log the fact that we just entered this state. *)

    if log then
      Log.state env.current;

    (* If [please_discard] is set, we discard the current lookahead token and
       fetch the next one. In order to request a token from the user, we
       return an [InputNeeded] continuation, which, when invoked by the user,
       will take us to [discard]. If [please_discard] is not set, we skip this
       step and jump directly to [check_for_default_reduction]. *)

    if please_discard then
      InputNeeded env
    else
      check_for_default_reduction env

  (* [discard env triple] stores [triple] into [env], overwriting the previous
     token. It is invoked by [offer], which itself is invoked by the user in
     response to an [InputNeeded] checkpoint. *)

  and discard env triple =
    if log then begin
      let (token, startp, endp) = triple in
      Log.lookahead_token (T.token2terminal token) startp endp
    end;
    let env = { env with error = false; triple } in
    check_for_default_reduction env

  and check_for_default_reduction env =

    (* Examine what situation we are in. This case analysis is analogous to
       that performed in [CodeBackend.gettoken], in the sub-case where we do
       not have a terminal incoming symbol. *)

    T.default_reduction
      env.current
      announce_reduce       (* there is a default reduction; perform it *)
      check_for_error_token (* there is none; continue below *)
      env

  and check_for_error_token env =

    (* There is no default reduction. Consult the current lookahead token
       so as to determine which action should be taken. *)

    (* Peeking at the first input token, without taking it off the input
       stream, is done by reading [env.triple]. We are careful to first
       check [env.error]. *)

    (* Note that, if [please_discard] was true, then we have just called
       [discard], so the lookahead token cannot be [error]. *)

    (* Returning [HandlingError env] is equivalent to calling [error env]
       directly, except it allows the user to regain control. *)

    if env.error then begin
      if log then
        Log.resuming_error_handling();
      HandlingError env
    end
    else
      let (token, _, _) = env.triple in

      (* We consult the two-dimensional action table, indexed by the
         current state and the current lookahead token, in order to
         determine which action should be taken. *)

      T.action
        env.current                    (* determines a row *)
        (T.token2terminal token)       (* determines a column *)
        (T.token2value token)
        shift                          (* shift continuation *)
        announce_reduce                (* reduce continuation *)
        initiate                       (* failure continuation *)
        env

  (* ------------------------------------------------------------------------ *)

  (* This function takes care of shift transitions along a terminal symbol.
     (Goto transitions are taken care of within [reduce] below.) The symbol
     can be either an actual token or the [error] pseudo-token. *)

  (* Here, the lookahead token CAN be [error]. *)

  and shift env
      (please_discard : bool)
      (terminal : terminal)
      (value : semantic_value)
      (s' : state) =

    (* Log the transition. *)

    if log then
      Log.shift terminal s';

    (* Push a new cell onto the stack, containing the identity of the
       state that we are leaving. *)

    let (_, startp, endp) = env.triple in
    let stack = {
      state = env.current;
      semv = value;
      startp;
      endp;
      next = env.stack;
    } in

    (* Switch to state [s']. *)

    let new_env = { env with stack; current = s' } in

    (* Expose the transition to the user. (In principle, we have a choice
       between exposing the transition before we take it, after we take
       it, or at some point in between. This affects the number and type
       of the parameters carried by [Shifting]. Here, we choose to expose
       the transition after we take it; this allows [Shifting] to carry
       only three parameters, whose meaning is simple.) *)

    Shifting (env, new_env, please_discard)

  (* ------------------------------------------------------------------------ *)

  (* The function [announce_reduce] stops the parser and returns a checkpoint
     which allows the parser to be resumed by calling [reduce]. *)

  (* Only ordinary productions are exposed to the user. Start productions
     are not exposed to the user. Reducing a start production simply leads
     to the successful termination of the parser. *)

  and announce_reduce env (prod : production) =
    if T.is_start prod then
      accept env prod
    else
      AboutToReduce (env, prod)

  (* The function [reduce] takes care of reductions. It is invoked by
     [resume] after an [AboutToReduce] event has been produced. *)

  (* Here, the lookahead token CAN be [error]. *)

  (* The production [prod] CANNOT be a start production. *)

  and reduce env (prod : production) =

    (* Log a reduction event. *)

    if log then
      Log.reduce_or_accept prod;

    (* Invoke the semantic action. The semantic action is responsible for
       truncating the stack and pushing a new cell onto the stack, which
       contains a new semantic value. It can raise [Error]. *)

    (* If the semantic action terminates normally, it returns a new stack,
       which becomes the current stack. *)

    (* If the semantic action raises [Error], we catch it and initiate error
       handling. *)

    (* This [match/with/exception] construct requires OCaml 4.02. *)

    match T.semantic_action prod env with
    | stack ->

        (* By our convention, the semantic action has produced an updated
           stack. The state now found in the top stack cell is the return
           state. *)

        (* Perform a goto transition. The target state is determined
           by consulting the goto table at the return state and at
           production [prod]. *)

        let current = T.goto_prod stack.state prod in
        let env = { env with stack; current } in
        run env false

    | exception Error ->
        initiate env

  and accept env prod =
    (* Log an accept event. *)
    if log then
      Log.reduce_or_accept prod;
    (* Extract the semantic value out of the stack. *)
    let v = env.stack.semv in
    (* Finish. *)
    Accepted v

  (* ------------------------------------------------------------------------ *)

  (* The following functions deal with errors. *)

  (* [initiate] initiates or resumes error handling. *)

  (* Here, the lookahead token CAN be [error]. *)

  and initiate env =
    if log then
      Log.initiating_error_handling();
    let env = { env with error = true } in
    HandlingError env

  (* [error] handles errors. *)

  and error env =
    assert env.error;

    (* Consult the column associated with the [error] pseudo-token in the
       action table. *)

    T.action
      env.current                    (* determines a row *)
      T.error_terminal               (* determines a column *)
      T.error_value
      error_shift                    (* shift continuation *)
      error_reduce                   (* reduce continuation *)
      error_fail                     (* failure continuation *)
      env

  and error_shift env please_discard terminal value s' =

    (* Here, [terminal] is [T.error_terminal],
       and [value] is [T.error_value]. *)

    assert (terminal = T.error_terminal && value = T.error_value);

    (* This state is capable of shifting the [error] token. *)

    if log then
      Log.handling_error env.current;
    shift env please_discard terminal value s'

  and error_reduce env prod =

    (* This state is capable of performing a reduction on [error]. *)

    if log then
      Log.handling_error env.current;
    reduce env prod
      (* Intentionally calling [reduce] instead of [announce_reduce].
         It does not seem very useful, and it could be confusing, to
         expose the reduction steps taken during error handling. *)

  and error_fail env =

    (* This state is unable to handle errors. Attempt to pop a stack
       cell. *)

    let cell = env.stack in
    let next = cell.next in
    if next == cell then

      (* The stack is empty. Die. *)

      Rejected

    else begin

      (* The stack is nonempty. Pop a cell, updating the current state
         with that found in the popped cell, and try again. *)

      let env = { env with
        stack = next;
        current = cell.state
      } in
      HandlingError env

    end

  (* End of the nest of tail recursive functions. *)

  (* ------------------------------------------------------------------------ *)
  (* ------------------------------------------------------------------------ *)

  (* The incremental interface. See [EngineTypes]. *)

  (* [start s] begins the parsing process. *)

  let start (s : state) (initial : position) : semantic_value checkpoint =

    (* Build an empty stack. This is a dummy cell, which is its own successor.
       Its [next] field WILL be accessed by [error_fail] if an error occurs and
       is propagated all the way until the stack is empty. Its [endp] field WILL
       be accessed (by a semantic action) if an epsilon production is reduced
       when the stack is empty. *)

    let rec empty = {
      state = s;                          (* dummy *)
      semv = T.error_value;               (* dummy *)
      startp = initial;                   (* dummy *)
      endp = initial;
      next = empty;
    } in

    (* Build an initial environment. *)

    (* Unfortunately, there is no type-safe way of constructing a
       dummy token. Tokens carry semantic values, which in general
       we cannot manufacture. This instance of [Obj.magic] could
       be avoided by adopting a different representation (e.g., no
       [env.error] field, and an option in the first component of
       [env.triple]), but I like this representation better. *)

    let dummy_token = Obj.magic () in
    let env = {
      error = false;
      triple = (dummy_token, initial, initial); (* dummy *)
      stack = empty;
      current = s;
    } in

    (* Begin parsing. *)

    (* The parameter [please_discard] here is [true], which means we know
       that we must read at least one token. This claim relies on the fact
       that we have ruled out the two special cases where a start symbol
       recognizes the empty language or the singleton language {epsilon}. *)

    run env true

  (* [offer checkpoint triple] is invoked by the user in response to a
     checkpoint of the form [InputNeeded env]. It checks that [checkpoint] is
     indeed of this form, and invokes [discard]. *)

  (* [resume checkpoint] is invoked by the user in response to a checkpoint of
     the form [AboutToReduce (env, prod)] or [HandlingError env]. It checks
     that [checkpoint] is indeed of this form, and invokes [reduce] or
     [error], as appropriate. *)

  (* In reality, [offer] and [resume] accept an argument of type
     [semantic_value checkpoint] and produce a checkpoint of the same type.
     The choice of [semantic_value] is forced by the fact that this is the
     parameter of the checkpoint [Accepted]. *)

  (* We change this as follows. *)

  (* We change the argument and result type of [offer] and [resume] from
     [semantic_value checkpoint] to ['a checkpoint]. This is safe, in this
     case, because we give the user access to values of type [t checkpoint]
     only if [t] is indeed the type of the eventual semantic value for this
     run. (More precisely, by examining the signatures [INCREMENTAL_ENGINE]
     and [INCREMENTAL_ENGINE_START], one finds that the user can build a value
     of type ['a checkpoint] only if ['a] is [semantic_value]. The table
     back-end goes further than this and produces versions of [start] composed
     with a suitable cast, which give the user access to a value of type
     [t checkpoint] where [t] is the type of the start symbol.) *)

  let offer : 'a . 'a checkpoint ->
                   token * position * position ->
                   'a checkpoint
  = function
    | InputNeeded env ->
        Obj.magic discard env
    | _ ->
        invalid_arg "offer expects InputNeeded"

  let resume : 'a . 'a checkpoint -> 'a checkpoint = function
    | HandlingError env ->
        Obj.magic error env
    | Shifting (_, env, please_discard) ->
        Obj.magic run env please_discard
    | AboutToReduce (env, prod) ->
        Obj.magic reduce env prod
    | _ ->
        invalid_arg "resume expects HandlingError | Shifting | AboutToReduce"

  (* ------------------------------------------------------------------------ *)
  (* ------------------------------------------------------------------------ *)

  (* The traditional interface. See [EngineTypes]. *)

  (* ------------------------------------------------------------------------ *)

  (* Wrapping a lexer and lexbuf as a token supplier. *)

  type supplier =
    unit -> token * position * position

  let lexer_lexbuf_to_supplier
      (lexer : Lexing.lexbuf -> token)
      (lexbuf : Lexing.lexbuf)
  : supplier =
    fun () ->
      let token = lexer lexbuf in
      let startp = lexbuf.Lexing.lex_start_p
      and endp = lexbuf.Lexing.lex_curr_p in
      token, startp, endp

  (* ------------------------------------------------------------------------ *)

  (* The main loop repeatedly handles intermediate checkpoints, until a final
     checkpoint is obtained. This allows implementing the monolithic interface
     ([entry]) in terms of the incremental interface ([start], [offer],
     [handle], [reduce]). *)

  (* By convention, acceptance is reported by returning a semantic value,
     whereas rejection is reported by raising [Error]. *)

  (* [loop] is polymorphic in ['a]. No cheating is involved in achieving this.
     All of the cheating resides in the types assigned to [offer] and [handle]
     above. *)

  let rec loop : 'a . supplier -> 'a checkpoint -> 'a =
    fun read checkpoint ->
    match checkpoint with
    | InputNeeded _ ->
        (* The parser needs a token. Request one from the lexer,
           and offer it to the parser, which will produce a new
           checkpoint. Then, repeat. *)
        let triple = read() in
        let checkpoint = offer checkpoint triple in
        loop read checkpoint
    | Shifting _
    | AboutToReduce _
    | HandlingError _ ->
        (* The parser has suspended itself, but does not need
           new input. Just resume the parser. Then, repeat. *)
        let checkpoint = resume checkpoint in
        loop read checkpoint
    | Accepted v ->
        (* The parser has succeeded and produced a semantic value.
           Return this semantic value to the user. *)
        v
    | Rejected ->
        (* The parser rejects this input. Raise an exception. *)
        raise Error

  let entry (s : state) lexer lexbuf : semantic_value =
    let initial = lexbuf.Lexing.lex_curr_p in
    loop (lexer_lexbuf_to_supplier lexer lexbuf) (start s initial)

  (* ------------------------------------------------------------------------ *)

  (* [loop_handle] stops if it encounters an error, and at this point, invokes
     its failure continuation, without letting Menhir do its own traditional
     error-handling (which involves popping the stack, etc.). *)

  let rec loop_handle succeed fail read checkpoint =
    match checkpoint with
    | InputNeeded _ ->
        let triple = read() in
        let checkpoint = offer checkpoint triple in
        loop_handle succeed fail read checkpoint
    | Shifting _
    | AboutToReduce _ ->
        let checkpoint = resume checkpoint in
        loop_handle succeed fail read checkpoint
    | HandlingError _
    | Rejected ->
        (* The parser has detected an error. Invoke the failure continuation. *)
        fail checkpoint
    | Accepted v ->
        (* The parser has succeeded and produced a semantic value. Invoke the
           success continuation. *)
        succeed v

  (* ------------------------------------------------------------------------ *)

  (* [loop_handle_undo] is analogous to [loop_handle], except it passes a pair
     of checkpoints to the failure continuation.

     The first (and oldest) checkpoint is the last [InputNeeded] checkpoint
     that was encountered before the error was detected. The second (and
     newest) checkpoint is where the error was detected, as in [loop_handle].
     Going back to the first checkpoint can be thought of as undoing any
     reductions that were performed after seeing the problematic token. (These
     reductions must be default reductions or spurious reductions.) *)

  let rec loop_handle_undo succeed fail read (inputneeded, checkpoint) =
    match checkpoint with
    | InputNeeded _ ->
        (* Update the last recorded [InputNeeded] checkpoint. *)
        let inputneeded = checkpoint in
        let triple = read() in
        let checkpoint = offer checkpoint triple in
        loop_handle_undo succeed fail read (inputneeded, checkpoint)
    | Shifting _
    | AboutToReduce _ ->
        let checkpoint = resume checkpoint in
        loop_handle_undo succeed fail read (inputneeded, checkpoint)
    | HandlingError _
    | Rejected ->
        fail inputneeded checkpoint
    | Accepted v ->
        succeed v

  (* For simplicity, we publish a version of [loop_handle_undo] that takes a
     single checkpoint as an argument, instead of a pair of checkpoints. We
     check that the argument is [InputNeeded _], and duplicate it. *)

  (* The parser cannot accept or reject before it asks for the very first
     character of input. (Indeed, we statically reject a symbol that
     generates the empty language or the singleton language {epsilon}.)
     So, the [start] checkpoint must match [InputNeeded _]. Hence, it is
     permitted to call [loop_handle_undo] with a [start] checkpoint. *)

  let loop_handle_undo succeed fail read checkpoint =
    assert (match checkpoint with InputNeeded _ -> true | _ -> false);
    loop_handle_undo succeed fail read (checkpoint, checkpoint)

  (* ------------------------------------------------------------------------ *)

  let rec shifts checkpoint =
    match checkpoint with
    | Shifting (env, _, _) ->
        (* The parser is about to shift, which means it is willing to
           consume the terminal symbol that we have fed it. Return the
           state just before this transition. *)
        Some env
    | AboutToReduce _ ->
        (* The parser wishes to reduce. Just follow. *)
        shifts (resume checkpoint)
    | HandlingError _ ->
        (* The parser fails, which means it rejects the terminal symbol
           that we have fed it. *)
        None
    | InputNeeded _
    | Accepted _
    | Rejected ->
        (* None of these cases can arise. Indeed, after a token is submitted
           to it, the parser must shift, reduce, or signal an error, before
           it can request another token or terminate. *)
        assert false

  let acceptable checkpoint token pos =
    let triple = (token, pos, pos) in
    let checkpoint = offer checkpoint triple in
    match shifts checkpoint with
    | None      -> false
    | Some _env -> true

  (* ------------------------------------------------------------------------ *)

  (* The type ['a lr1state] describes the (non-initial) states of the LR(1)
     automaton. The index ['a] represents the type of the semantic value
     associated with the state's incoming symbol. *)

  (* The type ['a lr1state] is defined as an alias for [state], which itself
     is usually defined as [int] (see [TableInterpreter]). So, ['a lr1state]
     is technically a phantom type, but should really be thought of as a GADT
     whose data constructors happen to be represented as integers. It is
     presented to the user as an abstract type (see [IncrementalEngine]). *)

  type 'a lr1state =
      state

  (* ------------------------------------------------------------------------ *)

  (* Stack inspection. *)

  (* We offer a read-only view of the parser's state as a stream of elements.
     Each element contains a pair of a (non-initial) state and a semantic
     value associated with (the incoming symbol of) this state. Note that the
     type [element] is an existential type. *)

  (* As of 2017/03/31, the type [stack] and the function [stack] are DEPRECATED.
     If desired, they could now be implemented outside Menhir, by relying on
     the functions [top] and [pop]. *)

  type element =
    | Element: 'a lr1state * 'a * position * position -> element

  open General

  type stack =
    element stream

  (* If [current] is the current state and [cell] is the top stack cell,
     then [stack cell current] is a view of the parser's state as a stream
     of elements. *)

  let rec stack cell current : element stream =
    lazy (
      (* The stack is empty iff the top stack cell is its own successor. In
         that case, the current state [current] should be an initial state
         (which has no incoming symbol).
         We do not allow the user to inspect this state. *)
      let next = cell.next in
      if next == cell then
        Nil
      else
        (* Construct an element containing the current state [current] as well
           as the semantic value contained in the top stack cell. This semantic
           value is associated with the incoming symbol of this state, so it
           makes sense to pair them together. The state has type ['a state] and
           the semantic value has type ['a], for some type ['a]. Here, the OCaml
           type-checker thinks ['a] is [semantic_value] and considers this code
           well-typed. Outside, we will use magic to provide the user with a way
           of inspecting states and recovering the value of ['a]. *)
        let element = Element (
          current,
          cell.semv,
          cell.startp,
          cell.endp
        ) in
        Cons (element, stack next cell.state)
    )

  let stack env : element stream =
    stack env.stack env.current

  (* As explained above, the function [top] allows access to the top stack
     element only if the stack is nonempty, i.e., only if the current state
     is not an initial state. *)

  let top env : element option =
    let cell = env.stack in
    let next = cell.next in
    if next == cell then
      None
    else
      Some (Element (env.current, cell.semv, cell.startp, cell.endp))

  (* [equal] compares the stacks for physical equality, and compares the
     current states via their numbers (this seems cleaner than using OCaml's
     polymorphic equality). *)

  (* The two fields that are not compared by [equal], namely [error] and
     [triple], are overwritten by the function [discard], which handles
     [InputNeeded] checkpoints. Thus, if [equal env1 env2] holds, then the
     checkpoints [input_needed env1] and [input_needed env2] are
     equivalent: they lead the parser to behave in the same way. *)

  let equal env1 env2 =
    env1.stack == env2.stack &&
    number env1.current = number env2.current

  let current_state_number env =
    number env.current

  (* ------------------------------------------------------------------------ *)

  (* Access to the position of the lookahead token. *)

  let positions { triple = (_, startp, endp); _ } =
    startp, endp

  (* ------------------------------------------------------------------------ *)

  (* Access to information about default reductions. *)

  (* This can be a function of states, or a function of environments.
     We offer both. *)

  (* Instead of a Boolean result, we could return a [production option].
     However, we would have to explicitly test whether [prod] is a start
     production, and in that case, return [None], I suppose. Indeed, we
     have decided not to expose the start productions. *)

  let state_has_default_reduction (state : _ lr1state) : bool =
    T.default_reduction state
      (fun _env _prod -> true)
      (fun _env -> false)
      ()

  let env_has_default_reduction env =
    state_has_default_reduction env.current

  (* ------------------------------------------------------------------------ *)

  (* The following functions work at the level of environments (as opposed to
     checkpoints). The function [pop] causes the automaton to go back into the
     past, pretending that the last input symbol has never been read. The
     function [force_reduction] causes the automaton to re-interpret the past,
     by recognizing the right-hand side of a production and reducing this
     production. The function [feed] causes the automaton to progress into the
     future by pretending that a (terminal or nonterminal) symbol has been
     read. *)

  (* The function [feed] would ideally be defined here. However, for this
     function to be type-safe, the GADT ['a symbol] is needed. For this
     reason, we move its definition to [InspectionTableInterpreter], where
     the inspection API is available. *)

  (* [pop] pops one stack cell. It cannot go wrong. *)

  let pop (env : 'a env) : 'a env option =
    let cell = env.stack in
    let next = cell.next in
    if next == cell then
      (* The stack is empty. *)
      None
    else
      (* The stack is nonempty. Pop off one cell. *)
      Some { env with stack = next; current = cell.state }

  (* [force_reduction] is analogous to [reduce], except that it does not
     continue by calling [run env] or [initiate env]. Instead, it returns
     [env] to the user. *)

  (* [force_reduction] is dangerous insofar as it executes a semantic action.
     This semantic action could have side effects: nontermination, state,
     exceptions, input/output, etc. *)

  let force_reduction prod (env : 'a env) : 'a env =
    (* Check if this reduction is permitted. This check is REALLY important.
       The stack must have the correct shape: that is, it must be sufficiently
       high, and must contain semantic values of appropriate types, otherwise
       the semantic action will crash and burn. *)
    (* We currently check whether the current state is WILLING to reduce this
       production (i.e., there is a reduction action in the action table row
       associated with this state), whereas it would be more liberal to check
       whether this state is CAPABLE of reducing this production (i.e., the
       stack has an appropriate shape). We currently have no means of
       performing such a check. *)
    if not (T.may_reduce env.current prod) then
      invalid_arg "force_reduction: this reduction is not permitted in this state"
    else begin
      (* We do not expose the start productions to the user, so this cannot be
         a start production. Hence, it has a semantic action. *)
      assert (not (T.is_start prod));
      (* Invoke the semantic action. *)
      let stack = T.semantic_action prod env in
      (* Perform a goto transition. *)
      let current = T.goto_prod stack.state prod in
      { env with stack; current }
    end

  (* The environment manipulation functions -- [pop] and [force_reduction]
     above, plus [feed] -- manipulate the automaton's stack and current state,
     but do not affect the automaton's lookahead symbol. When the function
     [input_needed] is used to go back from an environment to a checkpoint
     (and therefore, resume normal parsing), the lookahead symbol is clobbered
     anyway, since the only action that the user can take is to call [offer].
     So far, so good. One problem, though, is that this call to [offer] may
     well place the automaton in a configuration of a state [s] and a
     lookahead symbol [t] that is normally unreachable. Also, perhaps the
     state [s] is a state where an input symbol normally is never demanded, so
     this [InputNeeded] checkpoint is fishy. There does not seem to be a deep
     problem here, but, when programming an error recovery strategy, one
     should pay some attention to this issue. Ideally, perhaps, one should use
     [input_needed] only in a state [s] where an input symbol is normally
     demanded, that is, a state [s] whose incoming symbol is a terminal symbol
     and which does not have a default reduction on [#]. *)

  let input_needed (env : 'a env) : 'a checkpoint =
    InputNeeded env

  (* The following functions are compositions of [top] and [pop]. *)

  let rec pop_many i env =
    if i = 0 then
      Some env
    else match pop env with
    | None ->
        None
    | Some env ->
        pop_many (i - 1) env

  let get i env =
    match pop_many i env with
    | None ->
        None
    | Some env ->
        top env

end
end
module ErrorReports = struct
(******************************************************************************)
(*                                                                            *)
(*                                   Menhir                                   *)
(*                                                                            *)
(*                       François Pottier, Inria Paris                        *)
(*              Yann Régis-Gianas, PPS, Université Paris Diderot              *)
(*                                                                            *)
(*  Copyright Inria. All rights reserved. This file is distributed under the  *)
(*  terms of the GNU Library General Public License version 2, with a         *)
(*  special exception on linking, as described in the file LICENSE.           *)
(*                                                                            *)
(******************************************************************************)

(* -------------------------------------------------------------------------- *)

(* A two-place buffer stores zero, one, or two elements. *)

type 'a content =
| Zero
| One of 'a
| Two of 'a * (* most recent: *) 'a

type 'a buffer =
  'a content ref

(* [update buffer x] pushes [x] into [buffer], causing the buffer to slide. *)

let update buffer x =
  buffer :=
    match !buffer, x with
    | Zero, _ ->
        One x
    | One x1, x2
    | Two (_, x1), x2 ->
        Two (x1, x2)

(* [show f buffer] prints the contents of the buffer. The function [f] is
   used to print an element. *)

let show f buffer : string =
  match !buffer with
  | Zero ->
      (* The buffer cannot be empty. If we have read no tokens,
         we cannot have detected a syntax error. *)
      assert false
  | One invalid ->
      (* It is unlikely, but possible, that we have read just one token. *)
      Printf.sprintf "before '%s'" (f invalid)
  | Two (valid, invalid) ->
      (* In the most likely case, we have read two tokens. *)
      Printf.sprintf "after '%s' and before '%s'" (f valid) (f invalid)

(* [last buffer] returns the last element of the buffer (that is, the invalid
   token). *)

let last buffer =
  match !buffer with
  | Zero ->
      (* The buffer cannot be empty. If we have read no tokens,
         we cannot have detected a syntax error. *)
      assert false
  | One invalid
  | Two (_, invalid) ->
      invalid

(* [wrap buffer lexer] *)

open Lexing

let wrap lexer =
  let buffer = ref Zero in
  buffer,
  fun lexbuf ->
    let token = lexer lexbuf in
    update buffer (lexbuf.lex_start_p, lexbuf.lex_curr_p);
    token

(* -------------------------------------------------------------------------- *)
end
module Printers = struct
(******************************************************************************)
(*                                                                            *)
(*                                   Menhir                                   *)
(*                                                                            *)
(*                       François Pottier, Inria Paris                        *)
(*              Yann Régis-Gianas, PPS, Université Paris Diderot              *)
(*                                                                            *)
(*  Copyright Inria. All rights reserved. This file is distributed under the  *)
(*  terms of the GNU Library General Public License version 2, with a         *)
(*  special exception on linking, as described in the file LICENSE.           *)
(*                                                                            *)
(******************************************************************************)

module Make
  (I : IncrementalEngine.EVERYTHING)
  (User : sig
    val print: string -> unit
    val print_symbol: I.xsymbol -> unit
    val print_element: (I.element -> unit) option
  end)
= struct

  let arrow = " -> "
  let dot = "."
  let space = " "
  let newline = "\n"

  open User
  open I

  (* Printing a list of symbols. An optional dot is printed at offset
     [i] into the list [symbols], if this offset lies between [0] and
     the length of the list (included). *)

  let rec print_symbols i symbols =
    if i = 0 then begin
      print dot;
      print space;
      print_symbols (-1) symbols
    end
    else begin
      match symbols with
      | [] ->
          ()
      | symbol :: symbols ->
          print_symbol symbol;
          print space;
          print_symbols (i - 1) symbols
    end

  (* Printing an element as a symbol. *)

  let print_element_as_symbol element =
    match element with
    | Element (s, _, _, _) ->
        print_symbol (X (incoming_symbol s))

  (* Some of the functions that follow need an element printer. They use
     [print_element] if provided by the user; otherwise they use
     [print_element_as_symbol]. *)

  let print_element =
    match print_element with
    | Some print_element ->
        print_element
    | None ->
        print_element_as_symbol

  (* Printing a stack as a list of symbols. Stack bottom on the left,
     stack top on the right. *)

  let rec print_stack env =
    match top env, pop env with
    | Some element, Some env ->
        print_stack env;
        print space;
        print_element element
    | _, _ ->
        ()

  let print_stack env =
    print_stack env;
    print newline

  (* Printing an item. *)

  let print_item (prod, i) =
    print_symbol (lhs prod);
    print arrow;
    print_symbols i (rhs prod);
    print newline

  (* Printing a list of symbols (public version). *)

  let print_symbols symbols =
    print_symbols (-1) symbols

  (* Printing a production (without a dot). *)

  let print_production prod =
    print_item (prod, -1)

  (* Printing the current LR(1) state. *)

  let print_current_state env =
    print "Current LR(1) state: ";
    match top env with
    | None ->
        print "<some initial state>"; (* TEMPORARY unsatisfactory *)
        print newline
    | Some (Element (current, _, _, _)) ->
        print (string_of_int (number current));
        print newline;
        List.iter print_item (items current)

  let print_env env =
    print_stack env;
    print_current_state env;
    print newline

end
end
module InfiniteArray = struct
(******************************************************************************)
(*                                                                            *)
(*                                   Menhir                                   *)
(*                                                                            *)
(*                       François Pottier, Inria Paris                        *)
(*              Yann Régis-Gianas, PPS, Université Paris Diderot              *)
(*                                                                            *)
(*  Copyright Inria. All rights reserved. This file is distributed under the  *)
(*  terms of the GNU Library General Public License version 2, with a         *)
(*  special exception on linking, as described in the file LICENSE.           *)
(*                                                                            *)
(******************************************************************************)

(** This module implements infinite arrays, that is, arrays that grow
    transparently upon demand. *)

type 'a t = {
    default: 'a;
    mutable table: 'a array;
    mutable extent: int; (* the index of the greatest [set] ever, plus one *)
  }

let default_size =
  16384 (* must be non-zero *)

let make x = {
  default = x;
  table = Array.make default_size x;
  extent = 0;
}

let rec new_length length i =
  if i < length then
    length
  else
    new_length (2 * length) i

let ensure a i =
  assert (0 <= i);
  let table = a.table in
  let length = Array.length table in
  if i >= length then begin
    let table' = Array.make (new_length (2 * length) i) a.default in
    Array.blit table 0 table' 0 length;
    a.table <- table'
  end

let get a i =
  ensure a i;
  Array.unsafe_get a.table (i)

let set a i x =
  ensure a i;
  Array.unsafe_set a.table (i) x;
  if a.extent <= i then
    a.extent <- i + 1

let extent a =
  a.extent

let domain a =
  Array.sub a.table 0 a.extent

end
module PackedIntArray = struct
(******************************************************************************)
(*                                                                            *)
(*                                   Menhir                                   *)
(*                                                                            *)
(*                       François Pottier, Inria Paris                        *)
(*              Yann Régis-Gianas, PPS, Université Paris Diderot              *)
(*                                                                            *)
(*  Copyright Inria. All rights reserved. This file is distributed under the  *)
(*  terms of the GNU Library General Public License version 2, with a         *)
(*  special exception on linking, as described in the file LICENSE.           *)
(*                                                                            *)
(******************************************************************************)

(* A packed integer array is represented as a pair of an integer [k] and
   a string [s]. The integer [k] is the number of bits per integer that we
   use. The string [s] is just an array of bits, which is read in 8-bit
   chunks. *)

(* The ocaml programming language treats string literals and array literals
   in slightly different ways: the former are statically allocated, while
   the latter are dynamically allocated. (This is rather arbitrary.) In the
   context of Menhir's table-based back-end, where compact, immutable
   integer arrays are needed, ocaml strings are preferable to ocaml arrays. *)

type t =
  int * string

(* The magnitude [k] of an integer [v] is the number of bits required
   to represent [v]. It is rounded up to the nearest power of two, so
   that [k] divides [Sys.word_size]. *)

let magnitude (v : int) =
  if v < 0 then
    Sys.word_size
  else
    let rec check k max = (* [max] equals [2^k] *)
      if (max <= 0) || (v < max) then
        k
          (* if [max] just overflew, then [v] requires a full ocaml
             integer, and [k] is the number of bits in an ocaml integer
             plus one, that is, [Sys.word_size]. *)
      else
        check (2 * k) (max * max)
    in
    check 1 2

(* [pack a] turns an array of integers into a packed integer array. *)

(* Because the sign bit is the most significant bit, the magnitude of
   any negative number is the word size. In other words, [pack] does
   not achieve any space savings as soon as [a] contains any negative
   numbers, even if they are ``small''. *)

let pack (a : int array) : t =

  let m = Array.length a in

  (* Compute the maximum magnitude of the array elements. This tells
     us how many bits per element we are going to use. *)

  let k =
    Array.fold_left (fun k v ->
      max k (magnitude v)
    ) 1 a
  in

  (* Because access to ocaml strings is performed on an 8-bit basis,
     two cases arise. If [k] is less than 8, then we can pack multiple
     array entries into a single character. If [k] is greater than 8,
     then we must use multiple characters to represent a single array
     entry. *)

  if k <= 8 then begin

    (* [w] is the number of array entries that we pack in a character. *)

    assert (8 mod k = 0);
    let w = 8 / k in

    (* [n] is the length of the string that we allocate. *)

    let n =
      if m mod w = 0 then
        m / w
      else
        m / w + 1
    in

    let s =
      Bytes.create n
    in

    (* Define a reader for the source array. The reader might run off
       the end if [w] does not divide [m]. *)

    let i = ref 0 in
    let next () =
      let ii = !i in
      if ii = m then
        0 (* ran off the end, pad with zeroes *)
      else
        let v = a.(ii) in
        i := ii + 1;
        v
    in

    (* Fill up the string. *)

    for j = 0 to n - 1 do
      let c = ref 0 in
      for _x = 1 to w do
        c := (!c lsl k) lor next()
      done;
      Bytes.set s j (Char.chr !c)
    done;

    (* Done. *)

    k, Bytes.unsafe_to_string s

  end
  else begin (* k > 8 *)

    (* [w] is the number of characters that we use to encode an array entry. *)

    assert (k mod 8 = 0);
    let w = k / 8 in

    (* [n] is the length of the string that we allocate. *)

    let n =
      m * w
    in

    let s =
      Bytes.create n
    in

    (* Fill up the string. *)

    for i = 0 to m - 1 do
      let v = ref a.(i) in
      for x = 1 to w do
        Bytes.set s ((i + 1) * w - x) (Char.chr (!v land 255));
        v := !v lsr 8
      done
    done;

    (* Done. *)

    k, Bytes.unsafe_to_string s

  end

(* Access to a string. *)

let read (s : string) (i : int) : int =
  Char.code (String.unsafe_get s i)

(* [get1 t i] returns the integer stored in the packed array [t] at index [i].
   It assumes (and does not check) that the array's bit width is [1]. The
   parameter [t] is just a string. *)

let get1 (s : string) (i : int) : int =
  let c = read s (i lsr 3) in
  let c = c lsr ((lnot i) land 0b111) in
  let c = c land 0b1 in
  c

(* [get t i] returns the integer stored in the packed array [t] at index [i]. *)

(* Together, [pack] and [get] satisfy the following property: if the index [i]
   is within bounds, then [get (pack a) i] equals [a.(i)]. *)

let get ((k, s) : t) (i : int) : int =
  match k with
  | 1 ->
      get1 s i
  | 2 ->
      let c = read s (i lsr 2) in
      let c = c lsr (2 * ((lnot i) land 0b11)) in
      let c = c land 0b11 in
      c
  | 4 ->
      let c = read s (i lsr 1) in
      let c = c lsr (4 * ((lnot i) land 0b1)) in
      let c = c land 0b1111 in
      c
  | 8 ->
      read s i
  | 16 ->
      let j = 2 * i in
      (read s j) lsl 8 + read s (j + 1)
  | _ ->
      assert (k = 32); (* 64 bits unlikely, not supported *)
      let j = 4 * i in
      (((read s j lsl 8) + read s (j + 1)) lsl 8 + read s (j + 2)) lsl 8 + read s (j + 3)

(* [unflatten1 (n, data) i j] accesses the two-dimensional bitmap
   represented by [(n, data)] at indices [i] and [j]. The integer
   [n] is the width of the bitmap; the string [data] is the second
   component of the packed array obtained by encoding the table as
   a one-dimensional array. *)

let unflatten1 (n, data) i j =
   get1 data (n * i + j)

end
module RowDisplacement = struct
(******************************************************************************)
(*                                                                            *)
(*                                   Menhir                                   *)
(*                                                                            *)
(*                       François Pottier, Inria Paris                        *)
(*              Yann Régis-Gianas, PPS, Université Paris Diderot              *)
(*                                                                            *)
(*  Copyright Inria. All rights reserved. This file is distributed under the  *)
(*  terms of the GNU Library General Public License version 2, with a         *)
(*  special exception on linking, as described in the file LICENSE.           *)
(*                                                                            *)
(******************************************************************************)

(* This module compresses a two-dimensional table, where some values
   are considered insignificant, via row displacement. *)

(* This idea reportedly appears in Aho and Ullman's ``Principles
   of Compiler Design'' (1977). It is evaluated in Tarjan and Yao's
   ``Storing a Sparse Table'' (1979) and in Dencker, Dürre, and Heuft's
   ``Optimization of Parser Tables for Portable Compilers'' (1984). *)

(* A compressed table is represented as a pair of arrays. The
   displacement array is an array of offsets into the data array. *)

type 'a table =
    int array * (* displacement *)
     'a array   (* data *)

(* In a natural version of this algorithm, displacements would be greater
   than (or equal to) [-n]. However, in the particular setting of Menhir,
   both arrays are intended to be compressed with [PackedIntArray], which
   does not efficiently support negative numbers. For this reason, we are
   careful not to produce negative displacements. *)

(* In order to avoid producing negative displacements, we simply use the
   least significant bit as the sign bit. This is implemented by [encode]
   and [decode] below. *)

(* One could also think, say, of adding [n] to every displacement, so as
   to ensure that all displacements are nonnegative. This would work, but
   would require [n] to be published, for use by the decoder. *)

let encode (displacement : int) : int =
  if displacement >= 0 then
    displacement lsl 1
  else
    (-displacement) lsl 1 + 1

let decode (displacement : int) : int =
  if displacement land 1 = 0 then
    displacement lsr 1
  else
    -(displacement lsr 1)

(* It is reasonable to assume that, as matrices grow large, their
   density becomes low, i.e., they have many insignificant entries.
   As a result, it is important to work with a sparse data structure
   for rows. We internally represent a row as a list of its
   significant entries, where each entry is a pair of a [j] index and
   an element. *)

type 'a row =
    (int * 'a) list

(* [compress equal insignificant dummy m n t] turns the two-dimensional table
   [t] into a compressed table. The parameter [equal] is equality of data
   values. The parameter [wildcard] tells which data values are insignificant,
   and can thus be overwritten with other values. The parameter [dummy] is
   used to fill holes in the data array. [m] and [n] are the integer
   dimensions of the table [t]. *)

let compress
    (equal : 'a -> 'a -> bool)
    (insignificant : 'a -> bool)
    (dummy : 'a)
    (m : int) (n : int)
    (t : 'a array array)
    : 'a table =

  (* Be defensive. *)

  assert (Array.length t = m);
  assert begin
    for i = 0 to m - 1 do
      assert (Array.length t.(i) = n)
    done;
    true
  end;

  (* This turns a row-as-array into a row-as-sparse-list. The row is
     accompanied by its index [i] and by its rank (the number of its
     significant entries, that is, the length of the row-as-a-list. *)

  let sparse (i : int) (line : 'a array) : int * int * 'a row (* index, rank, row *) =

    let rec loop (j : int) (rank : int) (row : 'a row) =
      if j < 0 then
        i, rank, row
      else
        let x = line.(j) in
        if insignificant x then
          loop (j - 1) rank row
        else
          loop (j - 1) (1 + rank) ((j, x) :: row)
    in

    loop (n - 1) 0 []

  in

  (* Construct an array of all rows, together with their index and rank. *)

  let rows : (int * int * 'a row) array = (* index, rank, row *)
    Array.mapi sparse t
  in

  (* Sort this array by decreasing rank. This does not have any impact
     on correctness, but reportedly improves compression. The
     intuitive idea is that rows with few significant elements are
     easy to fit, so they should be inserted last, after the problem
     has become quite constrained by fitting the heavier rows. This
     heuristic is attributed to Ziegler. *)

  Array.fast_sort (fun (_, rank1, _) (_, rank2, _) ->
    compare rank2 rank1
  ) rows;

  (* Allocate a one-dimensional array of displacements. *)

  let displacement : int array =
    Array.make m 0
  in

  (* Allocate a one-dimensional, infinite array of values. Indices
     into this array are written [k]. *)

  let data : 'a InfiniteArray.t =
    InfiniteArray.make dummy
  in

  (* Determine whether [row] fits at offset [k] within the current [data]
     array, up to extension of this array. *)

  (* Note that this check always succeeds when [k] equals the length of
     the [data] array. Indeed, the loop is then skipped. This property
     guarantees the termination of the recursive function [fit] below. *)

  let fits k (row : 'a row) : bool =

    let d = InfiniteArray.extent data in

    let rec loop = function
      | [] ->
          true
      | (j, x) :: row ->

          (* [x] is a significant element. *)

          (* By hypothesis, [k + j] is nonnegative. If it is greater than or
             equal to the current length of the data array, stop -- the row
             fits. *)

          assert (k + j >= 0);

          if k + j >= d then
            true

          (* We now know that [k + j] is within bounds of the data
             array. Check whether it is compatible with the element [y] found
             there. If it is, continue. If it isn't, stop -- the row does not
             fit. *)

          else
            let y = InfiniteArray.get data (k + j) in
            if insignificant y || equal x y then
              loop row
            else
              false

    in
    loop row

  in

  (* Find the leftmost position where a row fits. *)

  (* If the leftmost significant element in this row is at offset [j],
     then we can hope to fit as far left as [-j] -- so this element
     lands at offset [0] in the data array. *)

  (* Note that displacements may be negative. This means that, for
     insignificant elements, accesses to the data array could fail: they could
     be out of bounds, either towards the left or towards the right. This is
     not a problem, as long as [get] is invoked only at significant
     elements. *)

  let rec fit k row : int =
    if fits k row then
      k
    else
      fit (k + 1) row
  in

  let fit row =
    match row with
    | [] ->
        0 (* irrelevant *)
    | (j, _) :: _ ->
        fit (-j) row
  in

  (* Write [row] at (compatible) offset [k]. *)

  let rec write k = function
    | [] ->
        ()
    | (j, x) :: row ->
        InfiniteArray.set data (k + j) x;
        write k row
  in

  (* Iterate over the sorted array of rows. Fit and write each row at
     the leftmost compatible offset. Update the displacement table. *)

  Array.iter (fun (i, _, row) ->
    let k = fit row in (* if [row] has leading insignificant elements, then [k] can be negative *)
    write k row;
    displacement.(i) <- encode k
  ) rows;

  (* Return the compressed tables. *)

  displacement, InfiniteArray.domain data

(* [get ct i j] returns the value found at indices [i] and [j] in the
   compressed table [ct]. This function call is permitted only if the
   value found at indices [i] and [j] in the original table is
   significant -- otherwise, it could fail abruptly. *)

(* Together, [compress] and [get] have the property that, if the value
   found at indices [i] and [j] in an uncompressed table [t] is
   significant, then [get (compress t) i j] is equal to that value. *)

let get (displacement, data) i j =
  assert (0 <= i && i < Array.length displacement);
  let k = decode displacement.(i) in
  assert (0 <= k + j && k + j < Array.length data);
    (* failure of this assertion indicates an attempt to access an
       insignificant element that happens to be mapped out of the bounds
       of the [data] array. *)
  data.(k + j)

(* [getget] is a variant of [get] which only requires read access,
   via accessors, to the two components of the table. *)

let getget get_displacement get_data (displacement, data) i j =
  let k = decode (get_displacement displacement i) in
  get_data data (k + j)
end
module LinearizedArray = struct
(******************************************************************************)
(*                                                                            *)
(*                                   Menhir                                   *)
(*                                                                            *)
(*                       François Pottier, Inria Paris                        *)
(*              Yann Régis-Gianas, PPS, Université Paris Diderot              *)
(*                                                                            *)
(*  Copyright Inria. All rights reserved. This file is distributed under the  *)
(*  terms of the GNU Library General Public License version 2, with a         *)
(*  special exception on linking, as described in the file LICENSE.           *)
(*                                                                            *)
(******************************************************************************)

(* The [entry] array contains offsets into the [data] array. It has [n+1]
   elements if the original (unencoded) array has [n] elements. The value
   of [entry.(n)] is the length of the [data] array. This convention is
   natural and allows avoiding a special case. *)

type 'a t =
  (* data: *)   'a array *
  (* entry: *) int array

let make (a : 'a array array) : 'a t =
  let n = Array.length a in
  (* Build the entry array. *)
  let size = ref 0 in
  let entry = Array.init (n + 1) (fun i ->
    let s = !size in
    if i < n then
      size := s + Array.length a.(i);
    s
  ) in
  assert (entry.(n) = !size);
  (* Build the data array. *)
  let i = ref 0
  and j = ref 0 in
  let data = Array.init !size (fun _ ->
    while !j = Array.length a.(!i) do
      i := !i + 1;
      j := 0;
    done;
    let x = a.(!i).(!j) in
    j := !j + 1;
    x
  ) in
  data, entry

let length ((_, entry) : 'a t) : int =
  Array.length entry

let row_length ((_, entry) : 'a t) i : int =
  entry.(i + 1) - entry.(i)

let row_length_via get_entry i =
  get_entry (i + 1) - get_entry i

let read ((data, entry) as la : 'a t) i j : 'a =
  assert (0 <= j && j < row_length la i);
  data.(entry.(i) + j)

let read_via get_data get_entry i j =
  assert (0 <= j && j < row_length_via get_entry i);
  get_data (get_entry i + j)

let write ((data, entry) as la : 'a t) i j (v : 'a) : unit =
  assert (0 <= j && j < row_length la i);
  data.(entry.(i) + j) <- v

let rec read_interval_via get_data i j =
  if i = j then
    []
  else
    get_data i :: read_interval_via get_data (i + 1) j

let read_row_via get_data get_entry i =
  read_interval_via get_data (get_entry i) (get_entry (i + 1))

let read_row ((data, entry) : 'a t) i : 'a list =
  read_row_via (Array.get data) (Array.get entry) i

end
module TableFormat = struct
(******************************************************************************)
(*                                                                            *)
(*                                   Menhir                                   *)
(*                                                                            *)
(*                       François Pottier, Inria Paris                        *)
(*              Yann Régis-Gianas, PPS, Université Paris Diderot              *)
(*                                                                            *)
(*  Copyright Inria. All rights reserved. This file is distributed under the  *)
(*  terms of the GNU Library General Public License version 2, with a         *)
(*  special exception on linking, as described in the file LICENSE.           *)
(*                                                                            *)
(******************************************************************************)

(* This signature defines the format of the parse tables. It is used as
   an argument to [TableInterpreter.Make]. *)

module type TABLES = sig

  (* This is the parser's type of tokens. *)

  type token

  (* This maps a token to its internal (generation-time) integer code. *)

  val token2terminal: token -> int

  (* This is the integer code for the error pseudo-token. *)

  val error_terminal: int

  (* This maps a token to its semantic value. *)

  val token2value: token -> Obj.t

  (* Traditionally, an LR automaton is described by two tables, namely, an
     action table and a goto table. See, for instance, the Dragon book.

     The action table is a two-dimensional matrix that maps a state and a
     lookahead token to an action. An action is one of: shift to a certain
     state, reduce a certain production, accept, or fail.

     The goto table is a two-dimensional matrix that maps a state and a
     non-terminal symbol to either a state or undefined. By construction, this
     table is sparse: its undefined entries are never looked up. A compression
     technique is free to overlap them with other entries.

     In Menhir, things are slightly different. If a state has a default
     reduction on token [#], then that reduction must be performed without
     consulting the lookahead token. As a result, we must first determine
     whether that is the case, before we can obtain a lookahead token and use it
     as an index in the action table.

     Thus, Menhir's tables are as follows.

     A one-dimensional default reduction table maps a state to either ``no
     default reduction'' (encoded as: 0) or ``by default, reduce prod''
     (encoded as: 1 + prod). The action table is looked up only when there
     is no default reduction. *)

  val default_reduction: PackedIntArray.t

  (* Menhir follows Dencker, Dürre and Heuft, who point out that, although the
     action table is not sparse by nature (i.e., the error entries are
     significant), it can be made sparse by first factoring out a binary error
     matrix, then replacing the error entries in the action table with undefined
     entries. Thus:

     A two-dimensional error bitmap maps a state and a terminal to either
     ``fail'' (encoded as: 0) or ``do not fail'' (encoded as: 1). The action
     table, which is now sparse, is looked up only in the latter case. *)

  (* The error bitmap is flattened into a one-dimensional table; its width is
     recorded so as to allow indexing. The table is then compressed via
     [PackedIntArray]. The bit width of the resulting packed array must be
     [1], so it is not explicitly recorded. *)

  (* The error bitmap does not contain a column for the [#] pseudo-terminal.
     Thus, its width is [Terminal.n - 1]. We exploit the fact that the integer
     code assigned to [#] is greatest: the fact that the right-most column
     in the bitmap is missing does not affect the code for accessing it. *)

  val error: int (* width of the bitmap *) * string (* second component of [PackedIntArray.t] *)

  (* A two-dimensional action table maps a state and a terminal to one of
     ``shift to state s and discard the current token'' (encoded as: s | 10),
     ``shift to state s without discarding the current token'' (encoded as: s |
     11), or ``reduce prod'' (encoded as: prod | 01). *)

  (* The action table is first compressed via [RowDisplacement], then packed
     via [PackedIntArray]. *)

  (* Like the error bitmap, the action table does not contain a column for the
     [#] pseudo-terminal. *)

  val action: PackedIntArray.t * PackedIntArray.t

  (* A one-dimensional lhs table maps a production to its left-hand side (a
     non-terminal symbol). *)

  val lhs: PackedIntArray.t

  (* A two-dimensional goto table maps a state and a non-terminal symbol to
     either undefined (encoded as: 0) or a new state s (encoded as: 1 + s). *)

  (* The goto table is first compressed via [RowDisplacement], then packed
     via [PackedIntArray]. *)

  val goto: PackedIntArray.t * PackedIntArray.t

  (* The number of start productions. A production [prod] is a start
     production if and only if [prod < start] holds. This is also the
     number of start symbols. A nonterminal symbol [nt] is a start
     symbol if and only if [nt < start] holds. *)

  val start: int

  (* A one-dimensional semantic action table maps productions to semantic
     actions. The calling convention for semantic actions is described in
     [EngineTypes]. This table contains ONLY NON-START PRODUCTIONS, so the
     indexing is off by [start]. Be careful. *)

  val semantic_action: ((int, Obj.t, token) EngineTypes.env ->
                        (int, Obj.t)        EngineTypes.stack) array

  (* The parser defines its own [Error] exception. This exception can be
     raised by semantic actions and caught by the engine, and raised by the
     engine towards the final user. *)

  exception Error

  (* The parser indicates whether to generate a trace. Generating a
     trace requires two extra tables, which respectively map a
     terminal symbol and a production to a string. *)

  val trace: (string array * string array) option

end
end
module InspectionTableFormat = struct
(******************************************************************************)
(*                                                                            *)
(*                                   Menhir                                   *)
(*                                                                            *)
(*                       François Pottier, Inria Paris                        *)
(*              Yann Régis-Gianas, PPS, Université Paris Diderot              *)
(*                                                                            *)
(*  Copyright Inria. All rights reserved. This file is distributed under the  *)
(*  terms of the GNU Library General Public License version 2, with a         *)
(*  special exception on linking, as described in the file LICENSE.           *)
(*                                                                            *)
(******************************************************************************)

(* This signature defines the format of the tables that are produced (in
   addition to the tables described in [TableFormat]) when the command line
   switch [--inspection] is enabled. It is used as an argument to
   [InspectionTableInterpreter.Make]. *)

module type TABLES = sig

  (* The types of symbols. *)

  include IncrementalEngine.SYMBOLS

  (* The type ['a lr1state] describes an LR(1) state. The generated parser defines
     it internally as [int]. *)

  type 'a lr1state

  (* Some of the tables that follow use encodings of (terminal and
     nonterminal) symbols as integers. So, we need functions that
     map the integer encoding of a symbol to its algebraic encoding. *)

  val    terminal: int -> xsymbol
  val nonterminal: int -> xsymbol

  (* The left-hand side of every production already appears in the
     signature [TableFormat.TABLES], so we need not repeat it here. *)

  (* The right-hand side of every production. This a linearized array
     of arrays of integers, whose [data] and [entry] components have
     been packed. The encoding of symbols as integers in described in
     [TableBackend]. *)

  val rhs: PackedIntArray.t * PackedIntArray.t

  (* A mapping of every (non-initial) state to its LR(0) core. *)

  val lr0_core: PackedIntArray.t

  (* A mapping of every LR(0) state to its set of LR(0) items. Each item is
     represented in its packed form (see [Item]) as an integer. Thus the
     mapping is an array of arrays of integers, which is linearized and
     packed, like [rhs]. *)

  val lr0_items: PackedIntArray.t * PackedIntArray.t

  (* A mapping of every LR(0) state to its incoming symbol, if it has one. *)

  val lr0_incoming: PackedIntArray.t

  (* A table that tells which non-terminal symbols are nullable. *)

  val nullable: string
    (* This is a packed int array of bit width 1. It can be read
       using [PackedIntArray.get1]. *)

  (* A two-table dimensional table, indexed by a nonterminal symbol and
     by a terminal symbol (other than [#]), encodes the FIRST sets. *)

  val first: int (* width of the bitmap *) * string (* second component of [PackedIntArray.t] *)

end

end
module InspectionTableInterpreter = struct
(******************************************************************************)
(*                                                                            *)
(*                                   Menhir                                   *)
(*                                                                            *)
(*                       François Pottier, Inria Paris                        *)
(*              Yann Régis-Gianas, PPS, Université Paris Diderot              *)
(*                                                                            *)
(*  Copyright Inria. All rights reserved. This file is distributed under the  *)
(*  terms of the GNU Library General Public License version 2, with a         *)
(*  special exception on linking, as described in the file LICENSE.           *)
(*                                                                            *)
(******************************************************************************)

(* -------------------------------------------------------------------------- *)

(* The type functor. *)

module Symbols (T : sig

  type 'a terminal
  type 'a nonterminal

end) = struct

  open T

  (* This should be the only place in the whole library (and generator!)
     where these types are defined. *)

  type 'a symbol =
    | T : 'a terminal -> 'a symbol
    | N : 'a nonterminal -> 'a symbol

  type xsymbol =
    | X : 'a symbol -> xsymbol

end

(* -------------------------------------------------------------------------- *)

(* The code functor. *)

module Make
  (TT : TableFormat.TABLES)
  (IT : InspectionTableFormat.TABLES
        with type 'a lr1state = int)
  (ET : EngineTypes.TABLE
        with type terminal = int
         and type nonterminal = int
         and type semantic_value = Obj.t)
  (E : sig
     type 'a env = (ET.state, ET.semantic_value, ET.token) EngineTypes.env
   end)
= struct

  (* Including [IT] is an easy way of inheriting the definitions of the types
     [symbol] and [xsymbol]. *)

  include IT

  (* This auxiliary function decodes a packed linearized array, as created by
     [TableBackend.linearize_and_marshal1]. Here, we read a row all at once. *)

  let read_packed_linearized
    (data, entry : PackedIntArray.t * PackedIntArray.t) (i : int) : int list
  =
    LinearizedArray.read_row_via
      (PackedIntArray.get data)
      (PackedIntArray.get entry)
      i

  (* This auxiliary function decodes a symbol. The encoding was done by
     [encode_symbol] or [encode_symbol_option] in the table back-end. *)

  let decode_symbol (symbol : int) : IT.xsymbol =
    (* If [symbol] is 0, then we have no symbol. This could mean e.g.
       that the function [incoming_symbol] has been applied to an
       initial state. In principle, this cannot happen. *)
    assert (symbol > 0);
    (* The low-order bit distinguishes terminal and nonterminal symbols. *)
    let kind = symbol land 1 in
    let symbol = symbol lsr 1 in
    if kind = 0 then
      IT.terminal (symbol - 1)
    else
      IT.nonterminal symbol

  (* These auxiliary functions convert a symbol to its integer code. For speed
     and for convenience, we use an unsafe type cast. This relies on the fact
     that the data constructors of the [terminal] and [nonterminal] GADTs are
     declared in an order that reflects their internal code. In the case of
     nonterminal symbols, we add [start] to account for the presence of the
     start symbols. *)

  let n2i (nt : 'a IT.nonterminal) : int =
    let answer = TT.start + Obj.magic nt in
    (* For safety, check that the above cast produced a correct result. *)
    assert (IT.nonterminal answer = X (N nt));
    answer

  let t2i (t : 'a IT.terminal) : int =
    let answer = Obj.magic t in
    (* For safety, check that the above cast produced a correct result. *)
    assert (IT.terminal answer = X (T t));
    answer

  (* Ordering functions. *)

  let compare_terminals t1 t2 =
    (* Subtraction is safe because overflow is impossible. *)
    t2i t1 - t2i t2

  let compare_nonterminals nt1 nt2 =
    (* Subtraction is safe because overflow is impossible. *)
    n2i nt1 - n2i nt2

  let compare_symbols symbol1 symbol2 =
    match symbol1, symbol2 with
    | X (T _), X (N _) ->
        -1
    | X (N _), X (T _) ->
        1
    | X (T t1), X (T t2) ->
        compare_terminals t1 t2
    | X (N nt1), X (N nt2) ->
        compare_nonterminals nt1 nt2

  let compare_productions prod1 prod2 =
    (* Subtraction is safe because overflow is impossible. *)
    prod1 - prod2

  let compare_items (prod1, index1) (prod2, index2) =
    let c = compare_productions prod1 prod2 in
    (* Subtraction is safe because overflow is impossible. *)
    if c <> 0 then c else index1 - index2

  (* The function [incoming_symbol] goes through the tables [IT.lr0_core] and
     [IT.lr0_incoming]. This yields a representation of type [xsymbol], out of
     which we strip the [X] quantifier, so as to get a naked symbol. This last
     step is ill-typed and potentially dangerous. It is safe only because this
     function is used at type ['a lr1state -> 'a symbol], which forces an
     appropriate choice of ['a]. *)

  let incoming_symbol (s : 'a IT.lr1state) : 'a IT.symbol =
    let core = PackedIntArray.get IT.lr0_core s in
    let symbol = decode_symbol (PackedIntArray.get IT.lr0_incoming core) in
    match symbol with
    | IT.X symbol ->
        Obj.magic symbol

  (* The function [lhs] reads the table [TT.lhs] and uses [IT.nonterminal]
     to decode the symbol. *)

  let lhs prod =
    IT.nonterminal (PackedIntArray.get TT.lhs prod)

  (* The function [rhs] reads the table [IT.rhs] and uses [decode_symbol]
     to decode the symbol. *)

  let rhs prod =
    List.map decode_symbol (read_packed_linearized IT.rhs prod)

  (* The function [items] maps the LR(1) state [s] to its LR(0) core,
     then uses [core] as an index into the table [IT.lr0_items]. The
     items are then decoded by the function [export] below, which is
     essentially a copy of [Item.export]. *)

  type item =
      int * int

  let export t : item =
    (t lsr 7, t mod 128)

  let items s =
    (* Map [s] to its LR(0) core. *)
    let core = PackedIntArray.get IT.lr0_core s in
    (* Now use [core] to look up the table [IT.lr0_items]. *)
    List.map export (read_packed_linearized IT.lr0_items core)

  (* The function [nullable] maps the nonterminal symbol [nt] to its
     integer code, which it uses to look up the array [IT.nullable].
     This yields 0 or 1, which we map back to a Boolean result. *)

  let decode_bool i =
    assert (i = 0 || i = 1);
    i = 1

  let nullable nt =
    decode_bool (PackedIntArray.get1 IT.nullable (n2i nt))

  (* The function [first] maps the symbols [nt] and [t] to their integer
     codes, which it uses to look up the matrix [IT.first]. *)

  let first nt t =
    decode_bool (PackedIntArray.unflatten1 IT.first (n2i nt) (t2i t))

  let xfirst symbol t =
    match symbol with
    | X (T t') ->
        compare_terminals t t' = 0
    | X (N nt) ->
        first nt t

  (* The function [foreach_terminal] exploits the fact that the
     first component of [TT.error] is [Terminal.n - 1], i.e., the
     number of terminal symbols, including [error] but not [#]. *)

  let rec foldij i j f accu =
    if i = j then
      accu
    else
      foldij (i + 1) j f (f i accu)

  let foreach_terminal f accu =
    let n, _ = TT.error in
    foldij 0 n (fun i accu ->
      f (IT.terminal i) accu
    ) accu

  let foreach_terminal_but_error f accu =
    let n, _ = TT.error in
    foldij 0 n (fun i accu ->
      if i = TT.error_terminal then
        accu
      else
        f (IT.terminal i) accu
    ) accu

  (* ------------------------------------------------------------------------ *)

  (* The following is the implementation of the function [feed]. This function
     is logically part of the LR engine, so it would be nice if it were placed
     in the module [Engine], but it must be placed here because, to ensure
     type safety, its arguments must be a symbol of type ['a symbol] and a
     semantic value of type ['a]. The type ['a symbol] is not available in
     [Engine]. It is available here. *)

  open EngineTypes
  open ET
  open E

  (* [feed] fails if the current state does not have an outgoing transition
     labeled with the desired symbol. This check is carried out at runtime. *)

  let feed_failure () =
    invalid_arg "feed: outgoing transition does not exist"

  (* Feeding a nonterminal symbol [nt]. Here, [nt] has type [nonterminal],
     which is a synonym for [int], and [semv] has type [semantic_value],
     which is a synonym for [Obj.t]. This type is unsafe, because pushing
     a semantic value of arbitrary type into the stack can later cause a
     semantic action to crash and burn. The function [feed] is given a safe
     type below. *)

  let feed_nonterminal
        (nt : nonterminal) startp (semv : semantic_value) endp (env : 'b env)
      : 'b env
  =
    (* Check if the source state has an outgoing transition labeled [nt].
       This is done by consulting the [goto] table. *)
    let source = env.current in
    match ET.maybe_goto_nt source nt with
    | None ->
        feed_failure()
    | Some target ->
        (* Push a new cell onto the stack, containing the identity of the state
           that we are leaving. The semantic value [semv] and positions [startp]
           and [endp] contained in the new cell are provided by the caller. *)
        let stack = { state = source; semv; startp; endp; next = env.stack } in
        (* Move to the target state. *)
        { env with stack; current = target }

  let reduce   _env _prod = feed_failure()
  let initiate _env       = feed_failure()

  let feed_terminal
        (terminal : terminal) startp (semv : semantic_value) endp (env : 'b env)
      : 'b env
  =
    (* Check if the source state has an outgoing transition labeled [terminal].
       This is done by consulting the [action] table. *)
    let source = env.current in
    ET.action source terminal semv
      (fun env _please_discard _terminal semv target ->
        (* There is indeed a transition toward the state [target].
           Push a new cell onto the stack and move to the target state. *)
        let stack = { state = source; semv; startp; endp; next = env.stack } in
        { env with stack; current = target }
      ) reduce initiate env

  (* The type assigned to [feed] ensures that the type of the semantic value
     [semv] is appropriate: it must be the semantic-value type of the symbol
     [symbol]. *)

  let feed (symbol : 'a symbol) startp (semv : 'a) endp env =
    let semv : semantic_value = Obj.repr semv in
    match symbol with
    | N nt ->
        feed_nonterminal (n2i nt) startp semv endp env
    | T terminal ->
        feed_terminal (t2i terminal) startp semv endp env

end
end
module TableInterpreter = struct
(******************************************************************************)
(*                                                                            *)
(*                                   Menhir                                   *)
(*                                                                            *)
(*                       François Pottier, Inria Paris                        *)
(*              Yann Régis-Gianas, PPS, Université Paris Diderot              *)
(*                                                                            *)
(*  Copyright Inria. All rights reserved. This file is distributed under the  *)
(*  terms of the GNU Library General Public License version 2, with a         *)
(*  special exception on linking, as described in the file LICENSE.           *)
(*                                                                            *)
(******************************************************************************)

module MakeEngineTable (T : TableFormat.TABLES) = struct

  type state =
      int

  let number s = s

  type token =
      T.token

  type terminal =
      int

  type nonterminal =
      int

  type semantic_value =
      Obj.t

  let token2terminal =
    T.token2terminal

  let token2value =
    T.token2value

  let error_terminal =
    T.error_terminal

  let error_value =
    Obj.repr ()

  (* The function [foreach_terminal] exploits the fact that the
     first component of [T.error] is [Terminal.n - 1], i.e., the
     number of terminal symbols, including [error] but not [#]. *)

  (* There is similar code in [InspectionTableInterpreter]. The
     code there contains an additional conversion of the type
     [terminal] to the type [xsymbol]. *)

  let rec foldij i j f accu =
    if i = j then
      accu
    else
      foldij (i + 1) j f (f i accu)

  let foreach_terminal f accu =
    let n, _ = T.error in
    foldij 0 n (fun i accu ->
      f i accu
    ) accu

  type production =
      int

  (* In principle, only non-start productions are exposed to the user,
     at type [production] or at type [int]. This is checked dynamically. *)
  let non_start_production i =
    assert (T.start <= i && i - T.start < Array.length T.semantic_action)

  let production_index i =
    non_start_production i;
    i

  let find_production i =
    non_start_production i;
    i

  let default_reduction state defred nodefred env =
    let code = PackedIntArray.get T.default_reduction state in
    if code = 0 then
      nodefred env
    else
      defred env (code - 1)

  let is_start prod =
    prod < T.start

  (* This auxiliary function helps access a compressed, two-dimensional
     matrix, like the action and goto tables. *)

  let unmarshal2 table i j =
    RowDisplacement.getget
      PackedIntArray.get
      PackedIntArray.get
      table
      i j

  let action state terminal value shift reduce fail env =
    match PackedIntArray.unflatten1 T.error state terminal with
    | 1 ->
        let action = unmarshal2 T.action state terminal in
        let opcode = action land 0b11
        and param = action lsr 2 in
        if opcode >= 0b10 then
          (* 0b10 : shift/discard *)
          (* 0b11 : shift/nodiscard *)
          let please_discard = (opcode = 0b10) in
          shift env please_discard terminal value param
        else
          (* 0b01 : reduce *)
          (* 0b00 : cannot happen *)
          reduce env param
    | c ->
        assert (c = 0);
        fail env

  let goto_nt state nt =
    let code = unmarshal2 T.goto state nt in
    (* code = 1 + state *)
    code - 1

  let goto_prod state prod =
    goto_nt state (PackedIntArray.get T.lhs prod)

  let maybe_goto_nt state nt =
    let code = unmarshal2 T.goto state nt in
    (* If [code] is 0, there is no outgoing transition.
       If [code] is [1 + state], there is a transition towards [state]. *)
    assert (0 <= code);
    if code = 0 then None else Some (code - 1)

  exception Error =
        T.Error

  type semantic_action =
      (state, semantic_value, token) EngineTypes.env ->
      (state, semantic_value)        EngineTypes.stack

  let semantic_action prod =
    (* Indexing into the array [T.semantic_action] is off by [T.start],
       because the start productions do not have entries in this array. *)
    T.semantic_action.(prod - T.start)

  (* [may_reduce state prod] tests whether the state [state] is capable of
     reducing the production [prod]. This information could be determined
     in constant time if we were willing to create a bitmap for it, but
     that would take up a lot of space. Instead, we obtain this information
     by iterating over a line in the action table. This is costly, but this
     function is not normally used by the LR engine anyway; it is supposed
     to be used only by programmers who wish to develop error recovery
     strategies. *)

  (* In the future, if desired, we could memoize this function, so as
     to pay the cost in (memory) space only if and where this function
     is actually used. We could also replace [foreach_terminal] with a
     function [exists_terminal] which stops as soon as the accumulator
     is [true]. *)

  let may_reduce state prod =
    (* Test if there is a default reduction of [prod]. *)
    default_reduction state
      (fun () prod' -> prod = prod')
      (fun () ->
        (* If not, then for each terminal [t], ... *)
        foreach_terminal (fun t accu ->
          accu ||
          (* ... test if there is a reduction of [prod] on [t]. *)
          action state t ()
            (* shift:  *) (fun () _ _ () _ -> false)
            (* reduce: *) (fun () prod' -> prod = prod')
            (* fail:   *) (fun () -> false)
            ()
        ) false
      )
      ()

  (* If [T.trace] is [None], then the logging functions do nothing. *)

  let log =
    match T.trace with Some _ -> true | None -> false

  module Log = struct

    open Printf

    let state state =
      match T.trace with
      | Some _ ->
          fprintf stderr "State %d:\n%!" state
      | None ->
          ()

    let shift terminal state =
      match T.trace with
      | Some (terminals, _) ->
          fprintf stderr "Shifting (%s) to state %d\n%!" terminals.(terminal) state
      | None ->
          ()

    let reduce_or_accept prod =
      match T.trace with
      | Some (_, productions) ->
          fprintf stderr "%s\n%!" productions.(prod)
      | None ->
          ()

    let lookahead_token token startp endp =
      match T.trace with
      | Some (terminals, _) ->
          fprintf stderr "Lookahead token is now %s (%d-%d)\n%!"
            terminals.(token)
            startp.Lexing.pos_cnum
            endp.Lexing.pos_cnum
      | None ->
          ()

    let initiating_error_handling () =
      match T.trace with
      | Some _ ->
          fprintf stderr "Initiating error handling\n%!"
      | None ->
          ()

    let resuming_error_handling () =
      match T.trace with
      | Some _ ->
          fprintf stderr "Resuming error handling\n%!"
      | None ->
          ()

    let handling_error state =
      match T.trace with
      | Some _ ->
          fprintf stderr "Handling error in state %d\n%!" state
      | None ->
          ()

  end

end
end
module StaticVersion = struct
let require_20181113 = ()
end

end
module Lexer_warning
= struct
#1 "lexer_warning.ml"
let warn_latin1 lexbuf =
  Location.deprecated (Location.curr lexbuf) "ISO-Latin1 characters in identifiers"
;;

end
module Reason_string
= struct
#1 "reason_string.ml"
module String = struct
  include String
end

end
module Reason_parser : sig 
#1 "reason_parser.mli"

(* The type of tokens. *)

type token = 
  | WITH
  | WHILE
  | WHEN
  | VIRTUAL
  | VAL
  | UNDERSCORE
  | UIDENT of (string)
  | TYPE
  | TRY
  | TRUE
  | TO
  | TILDE
  | THEN
  | SWITCH
  | STRUCT
  | STRING of (string * string option * string option)
  | STAR
  | SLASHGREATER
  | SIG
  | SHARPOP of (string)
  | SHARPEQUAL
  | SHARP
  | SEMISEMI
  | SEMI
  | RPAREN
  | REC
  | RBRACKET
  | RBRACE
  | QUOTE
  | QUESTION
  | PUB
  | PRI
  | PREFIXOP of (string)
  | POSTFIXOP of (string)
  | PLUSEQ
  | PLUSDOT
  | PLUS
  | PERCENT
  | OR
  | OPEN
  | OF
  | OBJECT
  | NONREC
  | NEW
  | NATIVEINT of (nativeint)
  | MUTABLE
  | MODULE
  | MINUSGREATER
  | MINUSDOT
  | MINUS
  | LPAREN
  | LIDENT of (string)
  | LET
  | LESSSLASHIDENTGREATER of (string)
  | LESSSLASHGREATER
  | LESSIDENT of (string)
  | LESSGREATER
  | LESSDOTDOTGREATER
  | LESS
  | LBRACKETPERCENTPERCENT
  | LBRACKETPERCENT
  | LBRACKETLESS
  | LBRACKETGREATER
  | LBRACKETBAR
  | LBRACKETAT
  | LBRACKET
  | LBRACELESS
  | LBRACE
  | LAZY
  | INT of (string * char option)
  | INITIALIZER
  | INHERIT
  | INFIXOP4 of (string)
  | INFIXOP3 of (string)
  | INFIXOP2 of (string)
  | INFIXOP1 of (string)
  | INFIXOP0 of (string)
  | INCLUDE
  | IN
  | IF
  | GREATERRBRACE
  | GREATERDOTDOTDOT
  | GREATER
  | FUNCTOR
  | FUNCTION
  | FUN
  | FOR
  | FLOAT of (string * char option)
  | FALSE
  | EXTERNAL
  | EXCEPTION
  | ES6_FUN
  | EQUALGREATER
  | EQUAL
  | EOL
  | EOF
  | END
  | ELSE
  | DOWNTO
  | DOTDOTDOT
  | DOTDOT
  | DOT
  | DONE
  | DOCSTRING of (string)
  | DO
  | CONSTRAINT
  | COMMENT of (string * Location.t)
  | COMMA
  | COLONGREATER
  | COLONEQUAL
  | COLONCOLON
  | COLON
  | CLASS
  | CHAR of (char)
  | BEGIN
  | BARRBRACKET
  | BARBAR
  | BAR
  | BANG
  | BACKQUOTE
  | ASSERT
  | AS
  | AND
  | AMPERSAND
  | AMPERAMPER

(* This exception is raised by the monolithic API functions. *)

exception Error

(* The monolithic API. *)

val use_file: (Lexing.lexbuf -> token) -> Lexing.lexbuf -> (Ast_404.Parsetree.toplevel_phrase list)

val toplevel_phrase: (Lexing.lexbuf -> token) -> Lexing.lexbuf -> (Ast_404.Parsetree.toplevel_phrase)

val parse_pattern: (Lexing.lexbuf -> token) -> Lexing.lexbuf -> (Ast_404.Parsetree.pattern)

val parse_expression: (Lexing.lexbuf -> token) -> Lexing.lexbuf -> (Ast_404.Parsetree.expression)

val parse_core_type: (Lexing.lexbuf -> token) -> Lexing.lexbuf -> (Ast_404.Parsetree.core_type)

val interface: (Lexing.lexbuf -> token) -> Lexing.lexbuf -> (Ast_404.Parsetree.signature)

val implementation: (Lexing.lexbuf -> token) -> Lexing.lexbuf -> (Ast_404.Parsetree.structure)

module MenhirInterpreter : sig
  
  (* The incremental API. *)
  
  include MenhirLib.IncrementalEngine.INCREMENTAL_ENGINE
    with type token = token
  
end

(* The entry point(s) to the incremental API. *)

module Incremental : sig
  
  val use_file: Lexing.position -> (Ast_404.Parsetree.toplevel_phrase list) MenhirInterpreter.checkpoint
  
  val toplevel_phrase: Lexing.position -> (Ast_404.Parsetree.toplevel_phrase) MenhirInterpreter.checkpoint
  
  val parse_pattern: Lexing.position -> (Ast_404.Parsetree.pattern) MenhirInterpreter.checkpoint
  
  val parse_expression: Lexing.position -> (Ast_404.Parsetree.expression) MenhirInterpreter.checkpoint
  
  val parse_core_type: Lexing.position -> (Ast_404.Parsetree.core_type) MenhirInterpreter.checkpoint
  
  val interface: Lexing.position -> (Ast_404.Parsetree.signature) MenhirInterpreter.checkpoint
  
  val implementation: Lexing.position -> (Ast_404.Parsetree.structure) MenhirInterpreter.checkpoint
  
end

end = struct
#1 "reason_parser.ml"

(* This generated code requires the following version of MenhirLib: *)

let () =
  MenhirLib.StaticVersion.require_20181113

module MenhirBasics = struct
  
  exception Error = Parsing.Parse_error
  
  type token = 
    | WITH
    | WHILE
    | WHEN
    | VIRTUAL
    | VAL
    | UNDERSCORE
    | UIDENT of (
# 1220 "reason_parser.mly"
       (string)
# 22 "reason_parser.ml"
  )
    | TYPE
    | TRY
    | TRUE
    | TO
    | TILDE
    | THEN
    | SWITCH
    | STRUCT
    | STRING of (
# 1212 "reason_parser.mly"
       (string * string option * string option)
# 35 "reason_parser.ml"
  )
    | STAR
    | SLASHGREATER
    | SIG
    | SHARPOP of (
# 1208 "reason_parser.mly"
       (string)
# 43 "reason_parser.ml"
  )
    | SHARPEQUAL
    | SHARP
    | SEMISEMI
    | SEMI
    | RPAREN
    | REC
    | RBRACKET
    | RBRACE
    | QUOTE
    | QUESTION
    | PUB
    | PRI
    | PREFIXOP of (
# 1195 "reason_parser.mly"
       (string)
# 60 "reason_parser.ml"
  )
    | POSTFIXOP of (
# 1196 "reason_parser.mly"
       (string)
# 65 "reason_parser.ml"
  )
    | PLUSEQ
    | PLUSDOT
    | PLUS
    | PERCENT
    | OR
    | OPEN
    | OF
    | OBJECT
    | NONREC
    | NEW
    | NATIVEINT of (
# 1184 "reason_parser.mly"
       (nativeint)
# 80 "reason_parser.ml"
  )
    | MUTABLE
    | MODULE
    | MINUSGREATER
    | MINUSDOT
    | MINUS
    | LPAREN
    | LIDENT of (
# 1173 "reason_parser.mly"
       (string)
# 91 "reason_parser.ml"
  )
    | LET
    | LESSSLASHIDENTGREATER of (
# 1204 "reason_parser.mly"
       (string)
# 97 "reason_parser.ml"
  )
    | LESSSLASHGREATER
    | LESSIDENT of (
# 1167 "reason_parser.mly"
       (string)
# 103 "reason_parser.ml"
  )
    | LESSGREATER
    | LESSDOTDOTGREATER
    | LESS
    | LBRACKETPERCENTPERCENT
    | LBRACKETPERCENT
    | LBRACKETLESS
    | LBRACKETGREATER
    | LBRACKETBAR
    | LBRACKETAT
    | LBRACKET
    | LBRACELESS
    | LBRACE
    | LAZY
    | INT of (
# 1156 "reason_parser.mly"
       (string * char option)
# 121 "reason_parser.ml"
  )
    | INITIALIZER
    | INHERIT
    | INFIXOP4 of (
# 1153 "reason_parser.mly"
       (string)
# 128 "reason_parser.ml"
  )
    | INFIXOP3 of (
# 1150 "reason_parser.mly"
       (string)
# 133 "reason_parser.ml"
  )
    | INFIXOP2 of (
# 1149 "reason_parser.mly"
       (string)
# 138 "reason_parser.ml"
  )
    | INFIXOP1 of (
# 1148 "reason_parser.mly"
       (string)
# 143 "reason_parser.ml"
  )
    | INFIXOP0 of (
# 1147 "reason_parser.mly"
       (string)
# 148 "reason_parser.ml"
  )
    | INCLUDE
    | IN
    | IF
    | GREATERRBRACE
    | GREATERDOTDOTDOT
    | GREATER
    | FUNCTOR
    | FUNCTION
    | FUN
    | FOR
    | FLOAT of (
# 1136 "reason_parser.mly"
       (string * char option)
# 163 "reason_parser.ml"
  )
    | FALSE
    | EXTERNAL
    | EXCEPTION
    | ES6_FUN
    | EQUALGREATER
    | EQUAL
    | EOL
    | EOF
    | END
    | ELSE
    | DOWNTO
    | DOTDOTDOT
    | DOTDOT
    | DOT
    | DONE
    | DOCSTRING of (
# 1228 "reason_parser.mly"
       (string)
# 183 "reason_parser.ml"
  )
    | DO
    | CONSTRAINT
    | COMMENT of (
# 1227 "reason_parser.mly"
       (string * Location.t)
# 190 "reason_parser.ml"
  )
    | COMMA
    | COLONGREATER
    | COLONEQUAL
    | COLONCOLON
    | COLON
    | CLASS
    | CHAR of (
# 1115 "reason_parser.mly"
       (char)
# 201 "reason_parser.ml"
  )
    | BEGIN
    | BARRBRACKET
    | BARBAR
    | BAR
    | BANG
    | BACKQUOTE
    | ASSERT
    | AS
    | AND
    | AMPERSAND
    | AMPERAMPER
  
end

include MenhirBasics

let _eRR =
  MenhirBasics.Error

# 50 "reason_parser.mly"
  
open Migrate_parsetree.OCaml_404.Ast
open Reason_syntax_util
open Location
open Asttypes
open Longident
open Parsetree
open Ast_helper
open Ast_mapper
open Reason_string

(*
   TODO:
   - Remove all [open]s from the top of this file one by one and fix compilation
   failures that ensue by specifying the appropriate long identifiers. That
   will make the parser much easier to reason about.
   - Go back to trunk, do the same (remove [open]s, and fully specify long
   idents), to perform a clean diff.

*)

(**

   location.ml:
   ------------
   let mkloc txt loc = { txt ; loc }
   let rhs_loc n = {
     loc_start = Parsing.rhs_start_pos n;
     loc_end = Parsing.rhs_end_pos n;
     loc_ghost = false;
   }
   let symbol_rloc () = {
     loc_start = Parsing.symbol_start_pos ();
     loc_end = Parsing.symbol_end_pos ();
     loc_ghost = false;
   }

   let symbol_gloc () = {
     loc_start = Parsing.symbol_start_pos ();
     loc_end = Parsing.symbol_end_pos ();
     loc_ghost = true;
   }

   ast_helper.ml:
   ------------
   module Typ = struct
    val mk: ?loc:loc -> ?attrs:attrs -> core_type_desc -> core_type
    let mk ?(loc = !default_loc) ?(attrs = []) d =
       {ptyp_desc = d; ptyp_loc = loc; ptyp_attributes = attrs}
     ..
   end

   parse_tree.mli
   --------------
   and core_type = {
     ptyp_desc: core_type_desc;
     ptyp_loc: Location.t;
     ptyp_attributes: attributes; (* ... [@id1] [@id2] *)
   }

   and core_type_desc =
     | Ptyp_any
           (*  _ *)
     | Ptyp_var of string
           (* 'a *)
     | Ptyp_arrow of label * core_type * core_type
           (* T1 -> T2       (label = "")
              ~l:T1 -> T2    (label = "l")
              ?l:T1 -> T2    (label = "?l")
            *)
     | Ptyp_tuple of core_type list
           (* T1 * ... * Tn   (n >= 2) *)

   reason_parser.mly
   ---------------
   In general:

                                          syntax variant          {pblah_desc: core_blah_desc
                                                                   pblah_loc: {txt, loc}
                                                                   pblah_attributes: ... }
                                         /              \            /       \
   val mkblah: ~loc -> ~attributes ->     core_blah_desc     ->      core_blah
   let mkblah = Blah.mk

*)

let uncurry_payload ?(name="bs") loc = ({loc; txt = name}, PStr [])

let dummy_loc () = {
  loc_start = Lexing.dummy_pos;
  loc_end = Lexing.dummy_pos;
  loc_ghost = false;
}

let mklocation loc_start loc_end = {
  loc_start = loc_start;
  loc_end = loc_end;
  loc_ghost = false;
}

let with_txt a txt = {
    a with txt=txt;
}

let make_real_loc loc = {
    loc with loc_ghost = false
}

let make_ghost_loc loc = {
    loc with loc_ghost = true
}

let ghloc ?(loc=dummy_loc ()) d = { txt = d; loc = (make_ghost_loc loc) }

(**
  * turn an object into a real
  *)
let make_real_exp exp = {
    exp with pexp_loc = make_real_loc exp.pexp_loc
}
let make_real_pat pat = {
    pat with ppat_loc = make_real_loc pat.ppat_loc
}
(*
 * change the location state to be a ghost location or real location
 *)
let set_loc_state is_ghost loc =
    if is_ghost then make_ghost_loc loc else make_real_loc loc

let mktyp ?(loc=dummy_loc()) ?(ghost=false) d =
    let loc = set_loc_state ghost loc in
    Typ.mk ~loc d

let mkpat ?(attrs=[]) ?(loc=dummy_loc()) ?(ghost=false) d =
    let loc = set_loc_state ghost loc in
    Pat.mk ~loc ~attrs d

let mkexp ?(attrs=[]) ?(loc=dummy_loc()) ?(ghost=false) d =
    let loc = set_loc_state ghost loc in
    Exp.mk ~loc ~attrs d

let mkmty ?(loc=dummy_loc()) ?(ghost=false) d =
    let loc = set_loc_state ghost loc in
    Mty.mk ~loc d

let mksig ?(loc=dummy_loc()) ?(ghost=false) d =
    let loc = set_loc_state ghost loc in
    Sig.mk ~loc d

let mkmod ?(loc=dummy_loc()) ?(ghost=false) d =
    let loc = set_loc_state ghost loc in
    Mod.mk ~loc d

let mkstr ?(loc=dummy_loc()) ?(ghost=false) d =
    let loc = set_loc_state ghost loc in
    Str.mk ~loc d

let mkclass ?(loc=dummy_loc()) ?(ghost=false) d =
    let loc = set_loc_state ghost loc in
    Cl.mk ~loc d

let mkcty ?(loc=dummy_loc()) ?(ghost=false) d =
    let loc = set_loc_state ghost loc in
    Cty.mk ~loc d

let mkctf ?(loc=dummy_loc()) ?(ghost=false) d =
    let loc = set_loc_state ghost loc in
    Ctf.mk ~loc d

let may_tuple startp endp = function
  | []  -> assert false
  | [x] -> {x with pexp_loc = mklocation startp endp}
  | xs  -> mkexp ~loc:(mklocation startp endp) (Pexp_tuple xs)

(**
  Make a core_type from a as_loc(LIDENT).
  Useful for record type punning.
  type props = {width: int, height: int};
  type state = {nbrOfClicks: int};
  type component = {props, state};
*)
let mkct lbl =
  let lident = Lident lbl.txt in
  let ttype = Ptyp_constr({txt = lident; loc = lbl.loc}, []) in
  {ptyp_desc = ttype; ptyp_loc = lbl.loc; ptyp_attributes = []}

let mkcf ?(loc=dummy_loc()) ?(ghost=false) d =
    let loc = set_loc_state ghost loc in
    Cf.mk ~loc d

let simple_ghost_text_attr ?(loc=dummy_loc ()) txt =
  let loc = set_loc_state true loc in
  [({txt; loc}, PStr [])]

let mkExplicitArityTuplePat ?(loc=dummy_loc ()) pat =
  (* Tell OCaml type system that what this tuple construction represents is
     not actually a tuple, and should represent several constructor
     arguments.  This allows the syntax the ability to distinguish between:

     X (10, 20)  -- One argument constructor
     X 10 20     -- Multi argument constructor
  *)
  mkpat
    ~loc
    ~attrs:(simple_ghost_text_attr ~loc "explicit_arity")
    pat

let mkExplicitArityTupleExp ?(loc=dummy_loc ()) exp_desc =
  mkexp
    ~loc
    ~attrs:(simple_ghost_text_attr ~loc "explicit_arity")
    exp_desc

let is_pattern_list_single_any = function
  | [{ppat_desc=Ppat_any; ppat_attributes=[]} as onlyItem] -> Some onlyItem
  | _ -> None

let mkoperator {Location. txt; loc} =
  Exp.mk ~loc (Pexp_ident(mkloc (Lident txt) loc))

(*
  Ghost expressions and patterns:
  expressions and patterns that do not appear explicitly in the
  source file they have the loc_ghost flag set to true.
  Then the profiler will not try to instrument them and the
  -annot option will not try to display their type.

  Every grammar rule that generates an element with a location must
  make at most one non-ghost element, the topmost one.

  How to tell whether your location must be ghost:
  A location corresponds to a range of characters in the source file.
  If the location contains a piece of code that is syntactically
  valid (according to the documentation), and corresponds to the
  AST node, then the location must be real; in all other cases,
  it must be ghost.

  jordwalke: Noticed that ghost expressions are often used when inserting
   additional AST nodes from a parse rule. Either an extra wrapping one, or an
   additional inner node. This is consistent with the above description, I
   believe.
*)


let ghunit ?(loc=dummy_loc ()) () =
  mkexp ~ghost:true ~loc (Pexp_construct (mknoloc (Lident "()"), None))

let mkinfixop arg1 op arg2 =
  mkexp(Pexp_apply(op, [Nolabel, arg1; Nolabel, arg2]))

let mkinfix arg1 name arg2 =
  mkinfixop arg1 (mkoperator name) arg2

let neg_string f =
  if String.length f > 0 && f.[0] = '-'
  then String.sub f 1 (String.length f - 1)
  else "-" ^ f

let mkuminus name arg =
  match name.txt, arg.pexp_desc with
  | "-", Pexp_constant(Pconst_integer (n,m)) ->
      mkexp(Pexp_constant(Pconst_integer(neg_string n,m)))
  | ("-" | "-."), Pexp_constant(Pconst_float (f, m)) ->
      mkexp(Pexp_constant(Pconst_float(neg_string f, m)))
  | txt, _ ->
      let name = {name with txt = "~" ^ txt} in
      mkexp(Pexp_apply(mkoperator name, [Nolabel, arg]))

let prepare_functor_arg = function
  | Some name, mty -> (name, mty)
  | None, (Some {pmty_loc} as mty) ->
      (mkloc "_" (make_ghost_loc pmty_loc), mty)
  | None, None -> assert false

let mk_functor_mod args body =
  let folder arg acc =
    let name, mty = prepare_functor_arg arg.txt in
    mkmod ~loc:arg.loc (Pmod_functor(name, mty, acc))
  in
  List.fold_right folder args body

let mk_functor_mty args body =
  let folder arg acc =
    let name, mty = prepare_functor_arg arg.txt in
    mkmty ~loc:arg.loc (Pmty_functor(name, mty, acc))
  in
  List.fold_right folder args body

let mkuplus name arg =
  match name.txt, arg.pexp_desc with
  | "+", Pexp_constant(Pconst_integer _)
  | ("+" | "+."), Pexp_constant(Pconst_float _) ->
      mkexp arg.pexp_desc
  | txt, _ ->
      let name = {name with txt = "~" ^ txt} in
      mkexp(Pexp_apply(mkoperator name, [Nolabel, arg]))

let mkexp_cons consloc args loc =
  mkexp ~loc (Pexp_construct(mkloc (Lident "::") consloc, Some args))

let mkexp_constructor_unit ?(uncurried=false) consloc loc =
  let attrs = if uncurried then [uncurry_payload ~name:"uncurry" loc] else [] in
  mkexp ~attrs ~loc (Pexp_construct(mkloc (Lident "()") consloc, None))

let ghexp_cons args loc =
  mkexp ~ghost:true ~loc (Pexp_construct(mkloc (Lident "::") loc, Some args))

let mkpat_cons args loc =
  mkpat ~loc (Ppat_construct(mkloc (Lident "::") loc, Some args))

let ghpat_cons args loc =
  mkpat ~ghost:true ~loc (Ppat_construct(mkloc (Lident "::") loc, Some args))

let mkpat_constructor_unit consloc loc =
  mkpat ~loc (Ppat_construct(mkloc (Lident "()") consloc, None))

let simple_pattern_list_to_tuple ?(loc=dummy_loc ()) = function
  | [] -> assert false
  | lst -> mkpat ~loc (Ppat_tuple lst)

let mktailexp_extension loc seq ext_opt =
  let rec handle_seq = function
    | [] ->
        let base_case = match ext_opt with
          | Some ext ->
            ext
          | None ->
            let loc = make_ghost_loc loc in
            let nil = { txt = Lident "[]"; loc } in
            Exp.mk ~loc (Pexp_construct (nil, None)) in
        base_case
    | e1 :: el ->
        let exp_el = handle_seq el in
        let loc = mklocation e1.pexp_loc.loc_start exp_el.pexp_loc.loc_end in
        let arg = mkexp ~ghost:true ~loc (Pexp_tuple [e1; exp_el]) in
        ghexp_cons arg loc
  in
  handle_seq seq

let mktailpat_extension loc (seq, ext_opt) =
  let rec handle_seq = function
    [] ->
      let base_case = match ext_opt with
        | Some ext ->
          ext
        | None ->
          let loc = make_ghost_loc loc in
          let nil = { txt = Lident "[]"; loc } in
          mkpat ~loc (Ppat_construct (nil, None)) in
      base_case
  | p1 :: pl ->
      let pat_pl = handle_seq pl in
      let loc = mklocation p1.ppat_loc.loc_start pat_pl.ppat_loc.loc_end in
      let arg = mkpat ~ghost:true ~loc (Ppat_tuple [p1; pat_pl]) in
      ghpat_cons arg loc in
  handle_seq seq

let makeFrag loc body =
  let attribute = ({txt = "JSX"; loc = loc}, PStr []) in
  { body with pexp_attributes = attribute :: body.pexp_attributes }


(* Applies attributes to the structure item, not the expression itself. Makes
 * structure item have same location as expression. *)

let mkstrexp e attrs =
  match e with
  | ({pexp_desc = Pexp_apply (({pexp_attributes} as e1), args) } as eRewrite)
      when let f = (List.filter (function
        | ({txt = "bs"}, _) -> true
          | _ -> false ) e.pexp_attributes)  in
      List.length f > 0
    ->
      let appExprAttrs = List.filter (function
          | ({txt = "bs"}, PStr []) -> false
          | _ -> true ) pexp_attributes in
      let strEvalAttrs = (uncurry_payload e1.pexp_loc)::(List.filter (function
          | ({txt = "bs"}, PStr []) -> false
          | _ -> true ) attrs) in
      let e = {
        eRewrite with
        pexp_desc = (Pexp_apply(e1, args));
        pexp_attributes = appExprAttrs
      } in
      { pstr_desc = Pstr_eval (e, strEvalAttrs); pstr_loc = e.pexp_loc }
  | _ ->
      { pstr_desc = Pstr_eval (e, attrs); pstr_loc = e.pexp_loc }

let ghexp_constraint loc e (t1, t2) =
  match t1, t2 with
  | Some t, None -> mkexp ~ghost:true ~loc (Pexp_constraint(e, t))
  | _, Some t -> mkexp ~ghost:true ~loc (Pexp_coerce(e, t1, t))
  | None, None -> assert false

let array_function ?(loc=dummy_loc()) str name =
  ghloc ~loc (Ldot(Lident str, (if !Clflags.fast then "unsafe_" ^ name else name)))

let err loc s =
  raise Reason_syntax_util.(
    Error(loc, (Syntax_error s))
  )

let syntax_error_str loc msg =
  if !Reason_config.recoverable then
    Str.mk ~loc:loc (Pstr_extension (Reason_syntax_util.syntax_error_extension_node loc msg, []))
  else
    raise(Syntaxerr.Error(Syntaxerr.Other loc))

let syntax_error () =
  raise Syntaxerr.Escape_error

let syntax_error_exp loc msg =
  if !Reason_config.recoverable then
    Exp.mk ~loc (Pexp_extension (Reason_syntax_util.syntax_error_extension_node loc msg))
  else
    err loc msg

let syntax_error_pat loc msg =
  if !Reason_config.recoverable then
    Pat.extension ~loc (Reason_syntax_util.syntax_error_extension_node loc msg)
  else
    err loc msg

let syntax_error_mod loc msg =
  if !Reason_config.recoverable then
    Mty.extension ~loc (Reason_syntax_util.syntax_error_extension_node loc msg)
  else
    err loc msg

let unclosed opening closing =
  raise(Syntaxerr.Error(Syntaxerr.Unclosed(opening.loc, opening.txt,
                                           closing.loc, closing.txt)))

let unclosed_extension closing =
  Reason_syntax_util.syntax_error_extension_node closing.loc ("Expecting \"" ^ closing.txt ^ "\"")

let unclosed_mod opening closing =
  if !Reason_config.recoverable then
    mkmod(Pmod_extension (unclosed_extension closing))
  else
    unclosed opening closing

let unclosed_cl opening closing =
  if !Reason_config.recoverable then
    mkclass(Pcl_extension (unclosed_extension closing))
  else
    unclosed opening closing

let unclosed_mty opening closing =
  if !Reason_config.recoverable then
    mkmty(Pmty_extension (unclosed_extension closing))
  else
    unclosed opening closing

let unclosed_cty opening closing =
  if !Reason_config.recoverable then
    mkcty(Pcty_extension (unclosed_extension closing))
  else
    unclosed opening closing

let unclosed_exp opening closing =
  if !Reason_config.recoverable then
    mkexp(Pexp_extension (unclosed_extension closing))
  else
    unclosed opening closing

let unclosed_pat opening closing =
  if !Reason_config.recoverable then
    mkpat(Ppat_extension (unclosed_extension closing))
  else
    unclosed opening closing

let expecting nonterm =
    raise Syntaxerr.(Error(Expecting(nonterm.loc, nonterm.txt)))

let expecting_pat nonterm =
  if !Reason_config.recoverable then
    mkpat(Ppat_extension (Reason_syntax_util.syntax_error_extension_node nonterm.loc ("Expecting " ^ nonterm.txt)))
  else
    expecting nonterm

let not_expecting start_pos end_pos nonterm =
    raise Syntaxerr.(Error(Not_expecting(mklocation start_pos end_pos, nonterm)))

type labelled_parameter =
  | Term of arg_label * expression option * pattern
  | Type of string

let mkexp_fun {Location.txt; loc} body =
  let loc = mklocation loc.loc_start body.pexp_loc.loc_end in
  match txt with
  | Term (label, default_expr, pat) ->
    Exp.fun_ ~loc label default_expr pat body
  | Type str ->
    Exp.newtype ~loc str body

let mkclass_fun {Location. txt ; loc} body =
  let loc = mklocation loc.loc_start body.pcl_loc.loc_end in
  match txt with
  | Term (label, default_expr, pat) ->
    Cl.fun_ ~loc label default_expr pat body
  | Type _ ->
    let pat = syntax_error_pat loc "(type) not allowed in classes" in
    Cl.fun_ ~loc Nolabel None pat body

let mktyp_arrow ({Location.txt = (label, cod); loc}, uncurried) dom =
  let loc = mklocation loc.loc_start dom.ptyp_loc.loc_end in
  let typ = mktyp ~loc (Ptyp_arrow (label, cod, dom)) in
  {typ with ptyp_attributes = (if uncurried then [uncurry_payload loc] else [])}

let mkcty_arrow ({Location.txt = (label, cod); loc}, uncurried) dom =
  let loc = mklocation loc.loc_start dom.pcty_loc.loc_end in
  let ct = mkcty ~loc (Pcty_arrow (label, cod, dom)) in
  {ct with pcty_attributes = (if uncurried then [uncurry_payload loc] else [])}

(**
  * process the occurrence of _ in the arguments of a function application
  * replace _ with a new variable, currently __x, in the arguments
  * return a wrapping function that wraps ((__x) => ...) around an expression
  * e.g. foo(_, 3) becomes (__x) => foo(__x, 3)
  *)
let process_underscore_application args =
  let exp_question = ref None in
  let hidden_var = "__x" in
  let check_arg ((lab, exp) as arg) = match exp.pexp_desc with
    | Pexp_ident ({ txt = Lident "_"} as id) ->
        let new_id = mkloc (Lident hidden_var) id.loc in
        let new_exp = mkexp (Pexp_ident new_id) ~loc:exp.pexp_loc in
        exp_question := Some new_exp;
        (lab, new_exp)
    | _ ->
        arg in
  let args = List.map check_arg args in
  let wrap exp_apply = match !exp_question with
    | Some {pexp_loc=loc} ->
        let pattern = mkpat (Ppat_var (mkloc hidden_var loc)) ~loc in
        begin match exp_apply.pexp_desc with
        (* Transform pipe first with underscore application correct:
         * 5->doStuff(3, _, 7);
         * (5 |. doStuff)(3, _, 7)
         * 5 |. (__x => doStuff(3, __x, 7))
         *)
        | Pexp_apply(
          {pexp_desc= Pexp_apply(
            {pexp_desc = Pexp_ident({txt = Longident.Lident("|.")})} as pipeExp,
            [Nolabel, arg1; Nolabel, ({pexp_desc = Pexp_ident _} as arg2)]
            (*         5                            doStuff                   *)
          )},
          args (* [3, __x, 7] *)
          ) ->
            (* build `doStuff(3, __x, 7)` *)
            let innerApply = {arg2 with pexp_desc = Pexp_apply(arg2, args)} in
            (* build `__x => doStuff(3, __x, 7)` *)
            let innerFun =
              mkexp (Pexp_fun (Nolabel, None, pattern, innerApply)) ~loc
            in
            (* build `5 |. (__x => doStuff(3, __x, 7))` *)
            {exp_apply with pexp_desc =
              Pexp_apply(pipeExp, [Nolabel, arg1; Nolabel, innerFun])
            }
        | _ ->
          mkexp (Pexp_fun (Nolabel, None, pattern, exp_apply)) ~loc
        end
    | None ->
        exp_apply in
  (args, wrap)

(**
  * Joins a 'body' and it's 'args' to form a Pexp_apply.
  * Example:
  * 'add' (body) and '[1, 2]' (args) become a Pexp_apply representing 'add(1, 2)'
  *
  * Note that `add(. 1, 2)(. 3, 4)` & `add(. 1, 2, . 3, 4)` both
  * give `[[@uncurry] 1, 2, [@uncurry] 3, 4]]` as args.
  * The dot is parsed as [@uncurry] to distinguish between specific
  * uncurrying and [@bs]. They can appear in the same arg:
  * `add(. [@bs] 1)` is a perfectly valid, the dot indicates uncurrying
  * for the whole application of 'add' and [@bs] sits on the `1`.
  * Due to the dot of uncurried application possibly appearing in any
  * position of the args, we need to post-process the args and split
  * all args in groups that are uncurried (or not).
  * add(. 1, . 2) should be parsed as (add(. 1))(. 2)
  * The args can be splitted here in [1] & [2], based on those groups
  * we can recursively build the correct nested Pexp_apply here.
  *  -> Pexp_apply (Pexp_apply (add, 1), 2)   (* simplified ast *)
  *)
let mkexp_app_rev startp endp (body, args) =
  let loc = mklocation startp endp in
  if args = [] then {body with pexp_loc = loc}
  else
  (*
   * Post process the arguments and transform [@uncurry] into [@bs].
   * Returns a tuple with a boolean (was it uncurried?) and
   * the posible rewritten arg.
   *)
  let rec process_args acc es =
    match es with
    | (lbl, e)::es ->
        let attrs = e.pexp_attributes in
        let hasUncurryAttr = ref false in
        let newAttrs = List.filter (function
          | ({txt = "uncurry"}, PStr []) ->
              hasUncurryAttr := true;
              false
          | _ -> true) attrs
        in
        let uncurried = !hasUncurryAttr in
        let newArg = (lbl, { e with pexp_attributes = newAttrs }) in
        process_args ((uncurried, newArg)::acc) es
    | [] -> acc
    in
    (*
     * Groups all uncurried args falling under the same Pexp_apply
     * Example:
     *    add(. 2, 3, . 4, 5) or add(. 2, 3)(. 4, 5)  (equivalent)
     * This results in two groups: (true, [2, 3]) & (true, [4, 5])
     * Both groups have 'true' as their first tuple element, because
     * they are uncurried.
     * add(2, 3, . 4) results in the groups (false, [2, 3]) & (true, [4])
     *)
    let rec group grp acc = function
    | (uncurried, arg)::xs ->
        let (_u, grp) = grp in
        if uncurried = true then begin
          group (true, [arg]) ((_u, (List.rev grp))::acc) xs
        end else begin
          group (_u, (arg::grp)) acc xs
        end
    | [] ->
        let (_u, grp) = grp in
        List.rev ((_u, (List.rev grp))::acc)
    in
    (*
     * Recursively transforms all groups into a (possibly uncurried)
     * Pexp_apply
     *
     * Example:
     *   Given the groups (true, [2, 3]) & (true, [4, 5]) and body 'add',
     *   we get the two nested Pexp_apply associated with
     *   (add(. 2, 3))(. 4, 5)
     *)
    let rec make_appl body = function
      | args::xs ->
          let (uncurried, args) = args in
          let expr = if args = [] then body
          else
            let (args, wrap) = process_underscore_application args in
            let args_loc = match args, List.rev args with
              | ((_, s)::_), ((_, e)::_) -> mklocation s.pexp_loc.loc_start e.pexp_loc.loc_end
              | _ -> assert false in
            let expr = mkexp ~loc:args_loc (Pexp_apply (body, args)) in
            let expr = if uncurried then {expr with pexp_attributes = [uncurry_payload loc]} else expr in
            wrap expr
          in
            make_appl expr xs
      | [] -> {body with pexp_loc = loc}
    in
    let processed_args = process_args [] args in
    let groups = group (false, []) [] processed_args in
    make_appl body groups

let mkmod_app mexp marg =
  mkmod ~loc:(mklocation mexp.pmod_loc.loc_start marg.pmod_loc.loc_end)
    (Pmod_apply (mexp, marg))

let bigarray_function ?(loc=dummy_loc()) str name =
  ghloc ~loc (Ldot(Ldot(Lident "Bigarray", str), name))

let bigarray_get ?(loc=dummy_loc()) arr arg =
  let get = if !Clflags.fast then "unsafe_get" else "get" in
  match arg with
    [c1] ->
      mkexp(Pexp_apply(mkexp ~ghost:true ~loc (Pexp_ident(bigarray_function ~loc "Array1" get)),
                       [Nolabel, arr; Nolabel, c1]))
  | [c1;c2] ->
      mkexp(Pexp_apply(mkexp ~ghost:true ~loc (Pexp_ident(bigarray_function ~loc "Array2" get)),
                       [Nolabel, arr; Nolabel, c1; Nolabel, c2]))
  | [c1;c2;c3] ->
      mkexp(Pexp_apply(mkexp ~ghost:true ~loc (Pexp_ident(bigarray_function ~loc "Array3" get)),
                       [Nolabel, arr; Nolabel, c1; Nolabel, c2; Nolabel, c3]))
  | coords ->
      mkexp(Pexp_apply(mkexp ~ghost:true ~loc (Pexp_ident(bigarray_function ~loc "Genarray" "get")),
                       [Nolabel, arr; Nolabel, mkexp ~ghost:true ~loc (Pexp_array coords)]))

let bigarray_set ?(loc=dummy_loc()) arr arg newval =
  let set = if !Clflags.fast then "unsafe_set" else "set" in
  match arg with
    [c1] ->
      mkexp(Pexp_apply(mkexp ~ghost:true ~loc (Pexp_ident(bigarray_function ~loc "Array1" set)),
                       [Nolabel, arr; Nolabel, c1; Nolabel, newval]))
  | [c1;c2] ->
      mkexp(Pexp_apply(mkexp ~ghost:true ~loc (Pexp_ident(bigarray_function ~loc "Array2" set)),
                       [Nolabel, arr; Nolabel, c1; Nolabel, c2; Nolabel, newval]))
  | [c1;c2;c3] ->
      mkexp(Pexp_apply(mkexp ~ghost:true ~loc (Pexp_ident(bigarray_function ~loc "Array3" set)),
                       [Nolabel, arr; Nolabel, c1; Nolabel, c2; Nolabel, c3; Nolabel, newval]))
  | coords ->
      mkexp(Pexp_apply(mkexp ~ghost:true ~loc (Pexp_ident(bigarray_function ~loc "Genarray" "set")),
                       [Nolabel, arr;
                        Nolabel, mkexp ~ghost:true ~loc (Pexp_array coords);
                        Nolabel, newval]))

let exp_of_label label =
  mkexp ~loc:label.loc (Pexp_ident {label with txt=Lident(Longident.last label.txt)})

let pat_of_label label =
  mkpat ~loc:label.loc (Ppat_var {label with txt=(Longident.last label.txt)})

let check_variable vl loc v =
  if List.mem v vl then
    raise Syntaxerr.(Error(Variable_in_scope(loc,v)))

let varify_constructors var_names t =
  let rec loop t =
    let desc =
      match t.ptyp_desc with
      | Ptyp_any -> Ptyp_any
      | Ptyp_var x ->
          check_variable var_names t.ptyp_loc x;
          Ptyp_var x
      | Ptyp_arrow (label,core_type,core_type') ->
          Ptyp_arrow(label, loop core_type, loop core_type')
      | Ptyp_tuple lst -> Ptyp_tuple (List.map loop lst)
      | Ptyp_constr( { txt = Lident s }, []) when List.mem s var_names ->
          Ptyp_var s
      | Ptyp_constr(longident, lst) ->
          Ptyp_constr(longident, List.map loop lst)
      | Ptyp_object (lst, o) ->
          Ptyp_object
            (List.map (fun (s, attrs, t) -> (s, attrs, loop t)) lst, o)
      | Ptyp_class (longident, lst) ->
          Ptyp_class (longident, List.map loop lst)
      | Ptyp_alias(core_type, string) ->
          check_variable var_names t.ptyp_loc string;
          Ptyp_alias(loop core_type, string)
      | Ptyp_variant(row_field_list, flag, lbl_lst_option) ->
          Ptyp_variant(List.map loop_row_field row_field_list,
                       flag, lbl_lst_option)
      | Ptyp_poly(string_lst, core_type) ->
          List.iter (check_variable var_names t.ptyp_loc) string_lst;
          Ptyp_poly(string_lst, loop core_type)
      | Ptyp_package(longident,lst) ->
          Ptyp_package(longident,List.map (fun (n,typ) -> (n,loop typ) ) lst)
      | Ptyp_extension (s, arg) ->
          Ptyp_extension (s, arg)
    in
    {t with ptyp_desc = desc}
  and loop_row_field  =
    function
      | Rtag(label,attrs,flag,lst) ->
          Rtag(label,attrs,flag,List.map loop lst)
      | Rinherit t ->
          Rinherit (loop t)
  in
  loop t

let pexp_newtypes ?loc newtypes exp =
  List.fold_right (fun newtype exp -> mkexp ?loc (Pexp_newtype (newtype, exp)))
    newtypes exp

(**
  I believe that wrap_type_annotation will automatically generate the type
  arguments (type a) (type b) based on what was listed before the dot in a
  polymorphic type annotation that uses locally abstract types.
 *)
let wrap_type_annotation newtypes core_type body =
  let exp = mkexp(Pexp_constraint(body,core_type)) in
  let exp = pexp_newtypes newtypes exp in
  let typ = mktyp ~ghost:true (Ptyp_poly(newtypes,varify_constructors newtypes core_type)) in
  (exp, typ)


let struct_item_extension (ext_attrs, ext_id) structure_items =
  mkstr ~ghost:true (Pstr_extension ((ext_id, PStr structure_items), ext_attrs))

let expression_extension ?loc (ext_attrs, ext_id) item_expr =
  let extension = (ext_id, PStr [mkstrexp item_expr []]) in
  let loc = match loc with
    | Some loc -> loc
    | None -> make_ghost_loc (dummy_loc ())
  in
  Exp.extension ~loc ~attrs:ext_attrs extension

(* There's no more need for these functions - this was for the following:
 *
 *     fun % ext [@foo] arg => arg;
 *
 *   Becoming
 *
 *     [%ext  (fun arg => arg) [@foo]]
 *
 *   Which we no longer support.
 *)
(* Applies the attributes to the body, then wraps entire thing in an extension
 * expression, whose payload consists of a single structure item that is body
 *)
(* let wrap_exp_attrs body (ext, attrs) = *)
(*   (* todo: keep exact location for the entire attribute *) *)
(*   let body = {body with pexp_attributes = attrs @ body.pexp_attributes} in *)
(*   match ext with *)
(*   | None -> body *)
(*   | Some id -> mkexp ~ghost:true (Pexp_extension (id, PStr [mkstrexp body []])) *)

(* Why not just mkexp with the right attributes in the first place? *)
(* let mkexp_attrs d attrs = *)
(*   wrap_exp_attrs (mkexp d) attrs *)

let mkcf_attrs ?(loc=dummy_loc()) d attrs =
  Cf.mk ~loc ~attrs d

let mkctf_attrs d attrs =
  Ctf.mk ~attrs d

type let_bindings =
  { lbs_bindings: Parsetree.value_binding list;
    lbs_rec: rec_flag;
    lbs_extension: (attributes * string Asttypes.loc) option;
    lbs_loc: Location.t }

let mklbs ext rf lb loc =
  { lbs_bindings = [lb];
    lbs_rec = rf;
    lbs_extension = ext;
    lbs_loc = loc; }

let addlbs lbs lbs' =
  { lbs with lbs_bindings = lbs.lbs_bindings @ lbs' }

let val_of_let_bindings lbs =
  let str = Str.value lbs.lbs_rec lbs.lbs_bindings in
  match lbs.lbs_extension with
  | None -> str
  | Some ext -> struct_item_extension ext [str]

let expr_of_let_bindings ~loc lbs body =
    let item_expr = Exp.let_ ~loc lbs.lbs_rec lbs.lbs_bindings body in
    match lbs.lbs_extension with
    | None -> item_expr
    | Some ext -> expression_extension ~loc:(make_ghost_loc loc) ext item_expr

let class_of_let_bindings lbs body =
  if lbs.lbs_extension <> None then
    raise Syntaxerr.(Error(Not_expecting(lbs.lbs_loc, "extension")));
  Cl.let_ lbs.lbs_rec lbs.lbs_bindings body

(*
 * arity_conflict_resolving_mapper is triggered when both "implicit_arity" "explicit_arity"
 * are in the attribtues. In that case we have to remove "explicit_arity"
 *
 * However, if we simply remove explicit_arity, we would end up with a
 * wrapping tuple which has only one component (inner tuple).
 * This is against the invariance where tuples must have 2+ components.
 * Therefore, in the case we have to remove explicit_arity, we also need to
 * unwrap the tuple to expose the inner tuple directly.
 *
 *)
let arity_conflict_resolving_mapper super =
{ super with
  expr = begin fun mapper expr ->
    match expr with
      | {pexp_desc=Pexp_construct(lid, args);
         pexp_loc;
         pexp_attributes} when attributes_conflicted "implicit_arity" "explicit_arity" pexp_attributes ->
         let new_args =
           match args with
             | Some {pexp_desc = Pexp_tuple [sp]} -> Some sp
             | _ -> args in
         super.expr mapper
         {pexp_desc=Pexp_construct(lid, new_args); pexp_loc; pexp_attributes=
          normalized_attributes "explicit_arity" pexp_attributes}
      | x -> super.expr mapper x
  end;
  pat = begin fun mapper pattern ->
    match pattern with
      | {ppat_desc=Ppat_construct(lid, args);
         ppat_loc;
         ppat_attributes} when attributes_conflicted "implicit_arity" "explicit_arity" ppat_attributes ->
         let new_args =
           match args with
             | Some {ppat_desc = Ppat_tuple [sp]} -> Some sp
             | _ -> args in
         super.pat mapper
         {ppat_desc=Ppat_construct(lid, new_args); ppat_loc; ppat_attributes=
          normalized_attributes "explicit_arity" ppat_attributes}
      | x -> super.pat mapper x
  end;
}

let reason_mapper =
  default_mapper
  |> reason_to_ml_swap_operator_mapper
  |> arity_conflict_resolving_mapper

let rewriteFunctorApp module_name elt loc =
  let rec applies = function
    | Lident _ -> false
    | Ldot (m, _) -> applies m
    | Lapply (_, _) -> true in
  let rec flattenModName = function
    | Lident id -> id
    | Ldot (m, id) -> flattenModName m ^ "." ^ id
    | Lapply (m1, m2) -> flattenModName m1 ^ "(" ^ flattenModName m2 ^ ")" in
  let rec mkModExp = function
    | Lident id -> mkmod ~loc (Pmod_ident {txt=Lident id; loc})
    | Ldot (m, id) -> mkmod ~loc (Pmod_ident {txt=Ldot (m, id); loc})
    | Lapply (m1, m2) -> mkmod ~loc (Pmod_apply (mkModExp m1, mkModExp m2)) in
  if applies module_name then
    let flat = flattenModName module_name in
    mkexp ~loc (Pexp_letmodule({txt=flat; loc},
                         mkModExp module_name,
                         mkexp(Pexp_ident {txt=Ldot (Lident flat, elt); loc})))
  else
    mkexp ~loc (Pexp_ident {txt=Ldot (module_name, elt); loc})

let jsx_component module_name attrs children loc =
  let rec getFirstPart = function
    | Lident fp -> fp
    | Ldot (fp, _) -> getFirstPart fp
    | Lapply (fp, _) -> getFirstPart fp in
  let firstPart = getFirstPart module_name.txt in
  let element_fn = if String.get firstPart 0 != '_' && firstPart = String.capitalize_ascii firstPart then
    (* firstPart will be non-empty so the 0th access is fine. Modules can't start with underscore *)
    rewriteFunctorApp module_name.txt "createElement" module_name.loc
  else
    mkexp ~loc:module_name.loc (Pexp_ident(mkloc (Lident firstPart) module_name.loc))
  in
  let body = mkexp(Pexp_apply(element_fn, attrs @ children)) ~loc in
  let attribute = ({txt = "JSX"; loc = loc}, PStr []) in
  { body with pexp_attributes = attribute :: body.pexp_attributes }

(* We might raise some custom error messages in this file.
  Do _not_ directly raise a Location.Error. Our public interface guarantees that we only throw Syntaxerr or Reason_syntax_util.Error *)
let raiseSyntaxErrorFromSyntaxUtils loc fmt =
  Printf.ksprintf
    (fun msg -> raise Reason_syntax_util.(Error(loc, (Syntax_error msg))))
    fmt

let rec ignoreLapply = function
  | Lident id -> Lident id
  | Ldot (lid, id) -> Ldot (ignoreLapply lid, id)
  | Lapply (m1, _) -> ignoreLapply m1

(* Like Longident.flatten, but ignores `Lapply`s. Useful because 1) we don't want to require `Lapply` in
   closing tags, and 2) Longident.flatten doesn't support `Lapply`. *)
let rec flattenWithoutLapply = function
  | Lident id -> [id]
  | Ldot (lid, id) -> flattenWithoutLapply lid @ [id]
  | Lapply (m1, _) -> flattenWithoutLapply m1

let ensureTagsAreEqual startTag endTag loc =
  if ignoreLapply startTag <> endTag then
     let startTag = (String.concat "" (flattenWithoutLapply startTag)) in
     let endTag = (String.concat "" (flattenWithoutLapply endTag)) in
     raiseSyntaxErrorFromSyntaxUtils loc
      "Start tag <%s> does not match end tag </%s>" startTag endTag

(* `{. "foo": bar}` -> `Js.t {. foo: bar}` and {.. "foo": bar} -> `Js.t {.. foo: bar} *)
let mkBsObjTypeSugar ~loc ~closed rows =
  let obj = mktyp ~loc (Ptyp_object (rows, closed)) in
  let jsDotTCtor = { txt = Longident.Ldot (Longident.Lident "Js", "t"); loc } in
  mktyp(Ptyp_constr(jsDotTCtor, [obj]))

let doc_loc loc = {txt = "ocaml.doc"; loc = loc}

let doc_attr text loc =
  let open Parsetree in
  let exp =
    { pexp_desc = Pexp_constant (Pconst_string(text, None));
      pexp_loc = loc;
      pexp_attributes = []; }
  in
  let item =
    { pstr_desc = Pstr_eval (exp, []); pstr_loc = exp.pexp_loc }
  in
    (doc_loc loc, PStr [item])

let prepend_attrs_to_labels attrs = function
  | [] -> [] (* not possible for valid inputs *)
  | x :: xs -> {x with pld_attributes = attrs @ x.pld_attributes} :: xs

let raise_record_trailing_semi_error loc =
  let msg = "Record entries are separated by comma; we've found a semicolon instead." in
  raise Reason_syntax_util.(Error(loc, (Syntax_error msg)))

let record_exp_spread_msg =
  "Records can only have one `...` spread, at the beginning.
Explanation: since records have a known, fixed shape, a spread like `{a, ...b}` wouldn't make sense, as `b` would override every field of `a` anyway."

let record_pat_spread_msg =
  "Record's `...` spread is not supported in pattern matches.
Explanation: you can't collect a subset of a record's field into its own record, since a record needs an explicit declaration and that subset wouldn't have one.
Solution: you need to pull out each field you want explicitly."

let lowercase_module_msg =
  Printf.sprintf "Module names must start with an uppercase letter."

(* Handles "over"-parsing of spread syntax with `opt_spread`.
 * The grammar allows a spread operator at every position, when
 * generating the parsetree we raise a helpful error message. *)
let filter_raise_spread_syntax msg nodes =
  List.map (fun (dotdotdot, node) ->
    match dotdotdot with
    | Some dotdotdotLoc ->
        raise Reason_syntax_util.(Error(dotdotdotLoc, (Syntax_error msg)))
    | None -> node
    ) nodes

(*
 * See https://github.com/ocaml/ocaml/commit/e1e03820e5fea322aa3156721bc1cc0231668101
 * Rely on the parsing rules for generic module types, and then
 * extract a package type, enabling more explicit error messages
 * *)
let package_type_of_module_type pmty =
  let map_cstr = function
    | Pwith_type (lid, ptyp) ->
        let loc = ptyp.ptype_loc in
        if ptyp.ptype_params <> [] then
          err loc "parametrized types are not supported";
        if ptyp.ptype_cstrs <> [] then
          err loc "constrained types are not supported";
        if ptyp.ptype_private <> Public then
          err loc "private types are not supported";

        (* restrictions below are checked by the 'with_constraint' rule *)
        assert (ptyp.ptype_kind = Ptype_abstract);
        assert (ptyp.ptype_attributes = []);
        let ty =
          match ptyp.ptype_manifest with
          | Some ty -> ty
          | None -> assert false
        in
        (lid, ty)
    | _ ->
        err pmty.pmty_loc "only 'with type t =' constraints are supported"
  in
  match pmty with
  | {pmty_desc = Pmty_ident lid} -> (lid, [])
  | {pmty_desc = Pmty_with({pmty_desc = Pmty_ident lid}, cstrs)} ->
      (lid, List.map map_cstr cstrs)
  | _ ->
      err pmty.pmty_loc
        "only module type identifier and 'with type' constraints are supported"

let add_brace_attr expr =
  let label = Location.mknoloc "reason.preserve_braces" in
  let payload = PStr [] in
  {expr with pexp_attributes= (label, payload) :: expr.pexp_attributes }


# 1272 "reason_parser.ml"

module Tables = struct
  
  include MenhirBasics
  
  let token2terminal : token -> int =
    fun _tok ->
      match _tok with
      | AMPERAMPER ->
          125
      | AMPERSAND ->
          124
      | AND ->
          123
      | AS ->
          122
      | ASSERT ->
          121
      | BACKQUOTE ->
          120
      | BANG ->
          119
      | BAR ->
          118
      | BARBAR ->
          117
      | BARRBRACKET ->
          116
      | BEGIN ->
          115
      | CHAR _ ->
          114
      | CLASS ->
          113
      | COLON ->
          112
      | COLONCOLON ->
          111
      | COLONEQUAL ->
          110
      | COLONGREATER ->
          109
      | COMMA ->
          108
      | COMMENT _ ->
          107
      | CONSTRAINT ->
          106
      | DO ->
          105
      | DOCSTRING _ ->
          104
      | DONE ->
          103
      | DOT ->
          102
      | DOTDOT ->
          101
      | DOTDOTDOT ->
          100
      | DOWNTO ->
          99
      | ELSE ->
          98
      | END ->
          97
      | EOF ->
          96
      | EOL ->
          95
      | EQUAL ->
          94
      | EQUALGREATER ->
          93
      | ES6_FUN ->
          92
      | EXCEPTION ->
          91
      | EXTERNAL ->
          90
      | FALSE ->
          89
      | FLOAT _ ->
          88
      | FOR ->
          87
      | FUN ->
          86
      | FUNCTION ->
          85
      | FUNCTOR ->
          84
      | GREATER ->
          83
      | GREATERDOTDOTDOT ->
          82
      | GREATERRBRACE ->
          81
      | IF ->
          80
      | IN ->
          79
      | INCLUDE ->
          78
      | INFIXOP0 _ ->
          77
      | INFIXOP1 _ ->
          76
      | INFIXOP2 _ ->
          75
      | INFIXOP3 _ ->
          74
      | INFIXOP4 _ ->
          73
      | INHERIT ->
          72
      | INITIALIZER ->
          71
      | INT _ ->
          70
      | LAZY ->
          69
      | LBRACE ->
          68
      | LBRACELESS ->
          67
      | LBRACKET ->
          66
      | LBRACKETAT ->
          65
      | LBRACKETBAR ->
          64
      | LBRACKETGREATER ->
          63
      | LBRACKETLESS ->
          62
      | LBRACKETPERCENT ->
          61
      | LBRACKETPERCENTPERCENT ->
          60
      | LESS ->
          59
      | LESSDOTDOTGREATER ->
          58
      | LESSGREATER ->
          57
      | LESSIDENT _ ->
          56
      | LESSSLASHGREATER ->
          55
      | LESSSLASHIDENTGREATER _ ->
          54
      | LET ->
          53
      | LIDENT _ ->
          52
      | LPAREN ->
          51
      | MINUS ->
          50
      | MINUSDOT ->
          49
      | MINUSGREATER ->
          48
      | MODULE ->
          47
      | MUTABLE ->
          46
      | NATIVEINT _ ->
          45
      | NEW ->
          44
      | NONREC ->
          43
      | OBJECT ->
          42
      | OF ->
          41
      | OPEN ->
          40
      | OR ->
          39
      | PERCENT ->
          38
      | PLUS ->
          37
      | PLUSDOT ->
          36
      | PLUSEQ ->
          35
      | POSTFIXOP _ ->
          34
      | PREFIXOP _ ->
          33
      | PRI ->
          32
      | PUB ->
          31
      | QUESTION ->
          30
      | QUOTE ->
          29
      | RBRACE ->
          28
      | RBRACKET ->
          27
      | REC ->
          26
      | RPAREN ->
          25
      | SEMI ->
          24
      | SEMISEMI ->
          23
      | SHARP ->
          22
      | SHARPEQUAL ->
          21
      | SHARPOP _ ->
          20
      | SIG ->
          19
      | SLASHGREATER ->
          18
      | STAR ->
          17
      | STRING _ ->
          16
      | STRUCT ->
          15
      | SWITCH ->
          14
      | THEN ->
          13
      | TILDE ->
          12
      | TO ->
          11
      | TRUE ->
          10
      | TRY ->
          9
      | TYPE ->
          8
      | UIDENT _ ->
          7
      | UNDERSCORE ->
          6
      | VAL ->
          5
      | VIRTUAL ->
          4
      | WHEN ->
          3
      | WHILE ->
          2
      | WITH ->
          1
  
  and error_terminal =
    0
  
  and token2value : token -> Obj.t =
    fun _tok ->
      match _tok with
      | AMPERAMPER ->
          Obj.repr ()
      | AMPERSAND ->
          Obj.repr ()
      | AND ->
          Obj.repr ()
      | AS ->
          Obj.repr ()
      | ASSERT ->
          Obj.repr ()
      | BACKQUOTE ->
          Obj.repr ()
      | BANG ->
          Obj.repr ()
      | BAR ->
          Obj.repr ()
      | BARBAR ->
          Obj.repr ()
      | BARRBRACKET ->
          Obj.repr ()
      | BEGIN ->
          Obj.repr ()
      | CHAR _v ->
          Obj.repr _v
      | CLASS ->
          Obj.repr ()
      | COLON ->
          Obj.repr ()
      | COLONCOLON ->
          Obj.repr ()
      | COLONEQUAL ->
          Obj.repr ()
      | COLONGREATER ->
          Obj.repr ()
      | COMMA ->
          Obj.repr ()
      | COMMENT _v ->
          Obj.repr _v
      | CONSTRAINT ->
          Obj.repr ()
      | DO ->
          Obj.repr ()
      | DOCSTRING _v ->
          Obj.repr _v
      | DONE ->
          Obj.repr ()
      | DOT ->
          Obj.repr ()
      | DOTDOT ->
          Obj.repr ()
      | DOTDOTDOT ->
          Obj.repr ()
      | DOWNTO ->
          Obj.repr ()
      | ELSE ->
          Obj.repr ()
      | END ->
          Obj.repr ()
      | EOF ->
          Obj.repr ()
      | EOL ->
          Obj.repr ()
      | EQUAL ->
          Obj.repr ()
      | EQUALGREATER ->
          Obj.repr ()
      | ES6_FUN ->
          Obj.repr ()
      | EXCEPTION ->
          Obj.repr ()
      | EXTERNAL ->
          Obj.repr ()
      | FALSE ->
          Obj.repr ()
      | FLOAT _v ->
          Obj.repr _v
      | FOR ->
          Obj.repr ()
      | FUN ->
          Obj.repr ()
      | FUNCTION ->
          Obj.repr ()
      | FUNCTOR ->
          Obj.repr ()
      | GREATER ->
          Obj.repr ()
      | GREATERDOTDOTDOT ->
          Obj.repr ()
      | GREATERRBRACE ->
          Obj.repr ()
      | IF ->
          Obj.repr ()
      | IN ->
          Obj.repr ()
      | INCLUDE ->
          Obj.repr ()
      | INFIXOP0 _v ->
          Obj.repr _v
      | INFIXOP1 _v ->
          Obj.repr _v
      | INFIXOP2 _v ->
          Obj.repr _v
      | INFIXOP3 _v ->
          Obj.repr _v
      | INFIXOP4 _v ->
          Obj.repr _v
      | INHERIT ->
          Obj.repr ()
      | INITIALIZER ->
          Obj.repr ()
      | INT _v ->
          Obj.repr _v
      | LAZY ->
          Obj.repr ()
      | LBRACE ->
          Obj.repr ()
      | LBRACELESS ->
          Obj.repr ()
      | LBRACKET ->
          Obj.repr ()
      | LBRACKETAT ->
          Obj.repr ()
      | LBRACKETBAR ->
          Obj.repr ()
      | LBRACKETGREATER ->
          Obj.repr ()
      | LBRACKETLESS ->
          Obj.repr ()
      | LBRACKETPERCENT ->
          Obj.repr ()
      | LBRACKETPERCENTPERCENT ->
          Obj.repr ()
      | LESS ->
          Obj.repr ()
      | LESSDOTDOTGREATER ->
          Obj.repr ()
      | LESSGREATER ->
          Obj.repr ()
      | LESSIDENT _v ->
          Obj.repr _v
      | LESSSLASHGREATER ->
          Obj.repr ()
      | LESSSLASHIDENTGREATER _v ->
          Obj.repr _v
      | LET ->
          Obj.repr ()
      | LIDENT _v ->
          Obj.repr _v
      | LPAREN ->
          Obj.repr ()
      | MINUS ->
          Obj.repr ()
      | MINUSDOT ->
          Obj.repr ()
      | MINUSGREATER ->
          Obj.repr ()
      | MODULE ->
          Obj.repr ()
      | MUTABLE ->
          Obj.repr ()
      | NATIVEINT _v ->
          Obj.repr _v
      | NEW ->
          Obj.repr ()
      | NONREC ->
          Obj.repr ()
      | OBJECT ->
          Obj.repr ()
      | OF ->
          Obj.repr ()
      | OPEN ->
          Obj.repr ()
      | OR ->
          Obj.repr ()
      | PERCENT ->
          Obj.repr ()
      | PLUS ->
          Obj.repr ()
      | PLUSDOT ->
          Obj.repr ()
      | PLUSEQ ->
          Obj.repr ()
      | POSTFIXOP _v ->
          Obj.repr _v
      | PREFIXOP _v ->
          Obj.repr _v
      | PRI ->
          Obj.repr ()
      | PUB ->
          Obj.repr ()
      | QUESTION ->
          Obj.repr ()
      | QUOTE ->
          Obj.repr ()
      | RBRACE ->
          Obj.repr ()
      | RBRACKET ->
          Obj.repr ()
      | REC ->
          Obj.repr ()
      | RPAREN ->
          Obj.repr ()
      | SEMI ->
          Obj.repr ()
      | SEMISEMI ->
          Obj.repr ()
      | SHARP ->
          Obj.repr ()
      | SHARPEQUAL ->
          Obj.repr ()
      | SHARPOP _v ->
          Obj.repr _v
      | SIG ->
          Obj.repr ()
      | SLASHGREATER ->
          Obj.repr ()
      | STAR ->
          Obj.repr ()
      | STRING _v ->
          Obj.repr _v
      | STRUCT ->
          Obj.repr ()
      | SWITCH ->
          Obj.repr ()
      | THEN ->
          Obj.repr ()
      | TILDE ->
          Obj.repr ()
      | TO ->
          Obj.repr ()
      | TRUE ->
          Obj.repr ()
      | TRY ->
          Obj.repr ()
      | TYPE ->
          Obj.repr ()
      | UIDENT _v ->
          Obj.repr _v
      | UNDERSCORE ->
          Obj.repr ()
      | VAL ->
          Obj.repr ()
      | VIRTUAL ->
          Obj.repr ()
      | WHEN ->
          Obj.repr ()
      | WHILE ->
          Obj.repr ()
      | WITH ->
          Obj.repr ()
  
  and default_reduction =
    (16, "\000\000\000\000\000\000\000\000\004\025\004\024\004\023\004\022\004\021\003\233\004\020\004\019\004\018\004\017\004\016\004\003\004\015\004\014\004\r\004\012\004\011\004\n\004\t\004\b\004\007\004\006\004\005\004\004\003\232\004\002\004\001\004\000\003\255\003\254\003\253\003\252\003\251\003\250\003\249\003\248\003\247\003\246\003\245\003\244\003\243\003\242\003\241\003\240\003\239\003\238\003\237\003\236\003\235\003\234\000\000\000\000\000#\001[\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\005\000\160\000\155\000\000\000\000\002\005\000r\000\000\000\000\002\006\000s\003R\000\000\000\000\000\000\000\160\000\155\000\000\000\000\000r\000\000\000\000\000s\003\176\000\000\000\000\000\000\004\191\000\000\000\000\000\000\000\000\001e\000\000\000\000\000\000\000\000\003R\000\000\002}\002w\000\158\000\000\004\191\000\000\000\000\000\000\003\135\000\000\002q\002\133\000\000\000\000\002\134\002\128\000\000\000\000\000\000\000\r\000\012\004I\004H\000\000\000\158\000\000\000\000\004\025\004\024\004\023\004\022\004\021\003\233\004\020\004\019\004\018\004\017\004\016\004\003\004\015\004\014\004\r\004\012\004\011\004\n\004\t\004\b\004\007\004\006\004\005\004\004\003\232\004\002\004\001\004\000\003\255\003\254\003\253\003\252\003\251\003\250\003\249\003\248\003\247\003\246\003\245\003\244\003\243\003\242\003\241\003\240\003\239\003\238\003\237\003\236\003\235\003\234\000\000\000\000\000#\000\000\000\000\002^\000\000\000\000\000\000\000\217\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\001\000\000\000\000\000\000\002\000\000\000\001\255\000\000\001V\001W\000\216\000\000\000\219\000\000\000\218\000\000\000\221\000\000\000\220\000\000\001\190\001\239\000\000\000\000\001\240\004o\004q\000\000\000\000\0002\000\000\000\000\0002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001g\000\000\000\000\001i\000\000\000\000\002\149\002\145\000\000\000\000\000\000\000\000\000\000\003\150\000\000\000\000\000\000\000\000\000\000\000\000\000\157\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\152\000\154\000\159\000\153\000\000\003\153\003\146\004\193\000\000\000\000\000\000\000\000\000\000\002@\000\000\000\000\000\000\002\135\000\000\000\000\000\000\001h\000\000\003a\000\000\003b\000\000\0014\000\000\003`\000\000\001k\001T\000\000\001U\003i\003\145\000\000\000\000\003\139\003l\000\000\000\000\000\000\000\000\000\000\000\000\002\187\000\000\000\000\000\000\002\006\000\000\000\000\002\155\000\000\001V\001W\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\190\000\000\000\000\000\000\000\000\004]\000\000\000\000\000\000\000\000\002i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\\\000\000\000\000\002\147\000\000\000\000\000\000\000\000\000%\000\186\002>\000\000\000.\000\000\000\000\002\183\001\131\0004\000\000\000\187\002<\004u\000\000\000\000\004^\000\000\000\000\0008\000 \000\000\000\000\000!\000\000\002F\004v\000\000\000\000\000\000\000\185\002\225\000\027\000\000\001\241\000\000\000\000\000\000\001\242\000\000\000\030\000\000\000\000\000\031\004$\000\000\000\000\002\222\002\221\000\000\000\000\002f\000\000\002k\001\235\001\186\001\217\000\000\000\000\000\000\004%\000\000\000\000\002g\000\000\000\000\001\236\000\000\004&\000\000\000\000\001\218\000\000\002h\000\000\002m\000\000\000\000\002j\000\000\002l\000\000\000\000\000\000\000:\000\000\004J\000\000\000\000\003\000\002\251\000,\000\000\000\000\000\000\000\000\004K\002:\002\252\002=\000\000\002;\000\000\0005\000\000\000\000\000\000\000-\002\253\000\000\001\168\000\000\000\000\002\254\001\194\000\000\0006\000\000\000\000\000\000\000\000\002X\001\192\000\000\0007\000\000\0026\001\231\000\000\000\000\000\000\000\000\002\250\000\000\000\000\000\000\002\249\000\000\000\000\001\232\000\000\002\228\000\000\000\165\000\000\000\000\000\000\001\202\000\167\001\201\000\000\000\166\000\164\000\000\000\000\002\167\001S\000\163\000\168\002\159\000\000\000\000\000\173\000\000\000\000\000\000\000\170\001\229\000\000\000\000\001\230\000\000\004m\000\000\000\000\000\169\000\000\000\172\000\000\000\171\000\000\000\000\000\000\000\000\000\000\000\000\000\174\000\000\000\179\000\000\000\000\000\176\000\000\000\000\000\175\000\000\000\178\000\000\000\177\000*\004d\000\000\000\000\000\000\000\000\000\000\000+\004e\000\000\000\000\000\000\000\000\000\161\000\000\002Z\000\000\000\000\000\000\004p\000\000\000\000\000\000\000\000\000\000\000\000\000\026\004Z\004Y\004T\000\025\000\000\000\183\000\000\000\180\000\000\000\181\000\182\004a\004V\000\194\000\195\004f\004b\000\000\004c\000\000\000\000\000\000\000\000\004j\000\000\004k\004X\004g\004h\000\000\004i\004W\004U\004S\000\000\000\000\000\000\000\230\000\000\000\000\0019\000\000\001>\000\000\000\000\001;\000\000\000\000\001:\000\000\001=\000\000\001<\000\000\000\000\000\000\002T\000\000\000\000\000\000\000\000\002V\000\000\002U\000\000\002S\000)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\166\000\000\001\165\001\164\000\000\001\163\000(\003\014\004[\000\000\000\000\000\000\000\000\000\000\000\000\003\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\139\000\000\002p\002z\002y\002|\002{\002~\002x\002v\002u\002t\002s\002\137\000\000\002\136\002\132\002\129\002r\002\130\002\131\000\000\004\192\000\000\000\000\003\021\000\000\000\000\000\000\003\205\000\000\003\210\000\000\0032\0033\000\000\0030\0031\000\000\003\205\000\000\004]\003\210\000\000\000\000\004^\000\000\0032\0033\000\000\000\000\003\216\000\000\002\153\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\165\000\000\000\166\000\000\002i\000\000\000\000\002k\000\000\002m\000\000\000\000\002j\000\000\002l\000\000\000\000\002\228\000\164\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004m\000/\000\000\0000\000\000\000\000\000\000\0007\000\000\000\000\0006\000\000\000\000\0005\000\000\000\000\000\000\000\000\000\186\002>\000\000\000.\0004\000\000\000\187\002<\004u\000\000\000\000\0008\000 \000\000\000\000\000!\004v\000\031\000\000\000\000\000\000\000\185\002\167\001S\000\163\0019\002\159\000\000\001>\000\000\000\000\001;\000\000\000\000\001:\000\000\001=\000\000\001<\000\000\000\000\000\000\002T\000\000\000\000\000\000\000\000\002V\000\000\002U\000\000\002S\000)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\166\000\000\001\165\001\164\000\000\001\163\000(\003\014\000\000\000\000\000\000\000\000\000\161\000\000\002Z\000\000\000\000\004p\000\000\000\000\004T\000\025\000\000\000\000\000\000\000\026\004Z\004Y\004[\000\000\000\000\000\000\000\000\000\000\000\000\003\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002*\003\193\003\191\000\000\000\000\000\000\001n\000\000\000\000\001o\000\000\000\000\000\000\000\000\000\000\004\205\000\000\004\206\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\199\000\000\000\000\001\200\000\000\000\000\000\000\0024\0023\000\000\000\000\000\000\003\195\000\000\002,\001O\000\000\000\000\000\000\000\191\000\190\002\021\000\000\002+\000\000\000\000\000\000\000\000\000\000\000\000\0038\000\000\000\000\0039\000\000\000\000\003]\000\000\000\000\000\000\003\189\003\188\003_\0034\003^\0037\000\000\000\000\003V\000\000\001]\000\000\000\000\001^\003k\003\144\000\000\003\187\003\186\003j\000\000\000\000\000\000\000\000\003>\000\000\003X\000\000\000\000\001s\000\000\001y\000\000\000\000\000\000\000\000\004Q\000\000\000\000\004R\000\000\000\000\000\000\002\177\004P\002\181\001\178\000\000\000\000\004\194\000\000\000\198\000\000\000\000\000\000\001x\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0038\000\000\000\000\0039\000\000\000\157\000\000\003]\000\000\003e\000\000\000\000\001\208\000\000\003d\003c\001\207\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\198\000c\000\000\000\000\000\000\000\000\000\000\000\000\004\196\000\000\000\000\000\000\000\000\000\152\000\154\000\159\000\153\000\000\000\000\000\000\002@\000\000\000\000\000\000\000\000\001\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0030\0031\000\000\000\000\000\000\003\216\000\000\000\000\000\000\002\157\000\000\000\000\000\000\000\000\003\222\003\221\000\000\000\000\002\197\000\000\000\000\001n\000\000\000\000\001o\000\000\000\000\000\000\002\145\000\n\000\011\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\209\003\204\003\217\003\197\003\196\002\207\000\000\000\000\003\207\003/\000\000\000\000\000\000\003\231\000\000\000\000\003\222\003\221\000\000\000\000\003\220\003\219\000\000\000\000\002\203\000\000\000\000\002\209\000\000\003\218\000\000\000\000\000\000\000\000\000\000\000\000\003\209\003\204\003\217\003\197\003\196\002\207\000\000\000\000\003\207\003/\000\000\000\000\000\000\003\231\002\203\000\000\000\000\002\209\000\000\003\218\000\000\000\000\001\227\000\000\000\000\002\201\000\000\002\196\000\000\002\214\000\000\000\000\001\228\000\000\002\199\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\196\000\000\003\203\000\000\000\000\003\202\003\201\000\000\000\000\003\200\003\199\002\198\002\206\000\000\003\198\000\000\002\205\002\204\000\000\003\229\000\000\000\000\003\228\000\000\003\230\000\000\003\227\003\226\000\000\000\000\003\225\003\224\003\208\002\212\000\000\000\000\002\199\000\000\000\000\003\203\000\000\000\000\003\202\003\201\000\000\000\000\003\200\003\199\002\198\002\206\000\000\003\198\000\000\002\214\000\000\002\205\000\000\000\000\004\192\002\204\000\000\003\213\000\000\003\215\000\000\003\214\000\000\002\196\000\000\000\000\003\212\002\213\000\000\003\229\000\000\000\000\003\228\000\000\003\230\000\000\003\227\003\226\000\000\000\000\003\225\003\224\003\208\002\212\000\000\003\213\000\000\003\215\000\000\003\214\000\000\000\000\003\212\002\213\000\000\000\000\001\134\000\000\003\220\003\219\000\000\000\000\003\211\000\000\003\223\000\000\000\000\000\000\000\000\000\000\000\000\002\211\002\210\000\000\000\000\000\000\003\211\000\000\003\223\001\129\001\130\000\000\000\000\001~\000\000\000\000\000\000\000\000\000\000\000\000\000\235\000\000\000\231\000\000\000\000\000\000\000\233\001\127\000\000\000\000\001\210\000\000\000\234\001\209\000\000\000\000\000\232\000\236\000\000\000\000\000\000\000\000\000\000\000\000\003U\000\000\000\000\000\000\000\000\000\000\0034\004\193\003^\0037\000\000\000\000\000\000\000\000\003\135\000\000\000\000\000\000\000\000\000\000\000\000\002\171\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003>\000\000\000\000\000\000\003m\000\000\000\000\003n\000\000\000\000\000\000\003\189\003\188\003_\003i\003\145\003X\003l\000\000\000\000\000\000\000\000\000\000\000\000\003\143\000\000\003\142\002\007\002\027\000\000\002\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002+\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003Z\000\000\003Y\000\000\000\000\000\000\000\000\003U\000\000\000\000\001s\000\000\001q\000\000\000\000\000\000\001\244\0036\003[\001t\000\000\000\000\001\027\000\000\000\000\001\022\000\000\000\000\0035\000\000\0013\000\000\001)\000\000\001\021\000\000\000\000\000\000\000\000\001#\000\000\000\000\001$\000\000\000\000\001\020\000\000\000\000\001\024\000\000\000\000\001\023\000\000\000\000\001\030\000\000\000\000\001\026\000\000\000\000\001\025\000\000\000\000\001%\000\000\000\000\001\019\000\000\000\000\001\018\000\000\000\000\001\028\000\000\000\000\001\017\000\000\000\000\001'\000\000\000\000\001\029\000\000\001&\000\000\000\000\000\000\001\031\000\000\000\000\001 \000\000\000\000\001!\000\000\000\000\001\"\000\000\000\000\000\000\0017\000\000\001r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003Z\000\000\003Y\000\000\000\000\000\000\001]\000\000\000\000\001^\000\000\000\000\000\000\003\138\003s\000\000\003\141\001_\000\000\0036\003[\000\000\003y\000\000\001\027\000\000\000\000\001\022\000\000\000\000\003\187\003\186\0035\000\000\0013\000\000\001)\000\000\001\021\000\000\003x\000\000\000\000\000\000\000\000\000\000\001#\000\000\000\000\001$\000\000\000\000\001\020\000\000\000\000\001\024\000\000\000\000\001\023\000\000\000\000\001\030\000\000\000\000\001\026\000\000\000\000\001\025\000\000\000\000\001%\000\000\000\000\001\019\000\000\000\000\001\018\000\000\000\000\001\028\000\000\000\000\001\017\000\000\000\000\001'\000\000\000\000\001\029\000\000\001&\000\000\000\000\000\000\001\031\000\000\000\000\001 \000\000\000\000\001!\000\000\000\000\001\"\000\000\000\000\000\000\000\000\003{\003z\000\000\000\000\000\000\000\000\000\000\003|\000\000\003v\001\206\000\000\000\000\004Q\000\000\000\000\002*\004R\003\193\003\191\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\205\000\000\004\206\000\000\000\000\000\000\000\000\000\000\000\000\001\255\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\002\001\000\000\000\000\000\000\001\199\000\000\000\000\001\200\000\000\000\000\000\000\0024\0023\000\000\000\000\000\000\003\195\000\000\002,\000\000\000\000\002\177\004P\0017\0015\001\205\000\000\003@\003?\000\000\000\000\003N\000\000\000\000\003M\003L\000\000\003O\000\000\003P\000\000\000\000\000\000\003T\003S\000\000\000\000\004!\000\000\000\000\000\000\002\245\003B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\231\000\000\000\000\000\000\000\000\004 \002\244\001\233\000\000\000\000\000\000\000\000\000\000\002\232\000\000\000\000\000\000\000\000\000\000\002\229\000\000\002\233\002\230\000\000\000\000\001\234\004#\000\000\002\246\000\000\003K\003J\000\000\003I\003H\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\242\002\238\000\000\002\243\002\239\000\000\000\000\002\235\000\000\000\000\000\000\000\000\000\000\000\000\002\240\002\236\000\000\002\241\002\237\002\234\004\194\000\000\003D\000\000\000\000\000\000\000\000\000\000\000\000\003F\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001p\003\\\001(\001*\000\000\003@\003?\000\000\000\000\003N\000\000\000\000\003M\003L\000\000\003O\000\000\003P\000\000\000\000\000\000\003T\003S\000\000\003B\000\000\003K\003J\000\000\003I\003H\000\000\000\000\000\000\004\131\000\000\003=\003<\000\000\000\000\000\000\000\000\000\000\002\227\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001G\000\205\000\000\000\000\000\000\001I\000\000\000\000\000\000\000\000\001J\000\000\000\000\000\000\000\000\001H\000\000\000\000\000\000\002B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\138\000\000\000\000\000\000\001\135\002\161\000\000\000\000\000\000\000\000\000\000\000\000\003C\000\000\000\000\000\000\003E\000\000\000\000\000\000\003G\003A\000\000\000\000\000\000\000\000\002 \000\000\002\031\000\000\002\018\000\000\002\030\000\000\000\000\000\000\000\000\002\017\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\189\002\185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\171\000\000\001\172\004x\000\000\000\000\000\000\000\000\000\000\000\000\000\188\000\189\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002D\0041\002\223\000\000\000\000\000\000\000\000\001?\000\000\000\000\001D\000\000\000\000\000\000\001A\000\000\000\000\000\000\001@\000\000\000\000\001C\000\000\000\000\001B\000\197\000\196\004\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000%\000\000\004\203\000\000\000\000\000\000\000\000\004s\004t\000\000\000\000\004n\004l\001\237\000\000\000\000\001\238\000\000\001\180\000\000\000\000\000\000\000\000\0028\000\000\0029\000}\000\000\000\000\000\000\004\201\000\000\000\000\000\000\000\000\000\000\000\000\000\129\000\000\000\000\002\222\002\221\000\000\000\000\000\000\000\000\000\127\000\000\000\150\000\000\000\000\000\151\000q\000\000\000\000\000\000\000\143\000\000\001\188\000n\000p\000{\000\000\000o\000\000\000\000\000}\000\000\000\000\000\000\004\201\002\157\000\000\000\000\000\000\000\000\000\129\000\000\000\000\000\000\000\000\000\127\000\000\000\150\000\000\000\000\000\000\000\000\000\000\000\162\000\131\000\000\000u\000y\000\000\000\000\000~\000\000\000\000\000\000\000\000\000\130\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\151\000q\000\000\000\000\000\000\001\188\000n\000p\000|\000\000\000o\000\000\000\132\000\134\000\000\000\000\000\133\001\248\000z\001\247\000x\000\000\000\145\000\000\000\000\000w\000\000\000\000\000\000\000\162\000\131\000\000\000u\000y\000\000\000\000\000~\000\000\000\000\000\000\000\000\000\130\000\000\000\000\000\000\000\000\000\128\000\000\000|\000\000\000\132\000\134\000\000\000\000\000\133\001\248\000\000\002F\000z\001\247\000x\000\000\000\146\000\144\000\000\000\000\000w\000{\000\000\000\145\000\000\000\146\000\144\000\000\000\202\000\147\000\203\000\000\000\000\000\018\000\000\000\000\000\019\000\148\000\000\001\149\000\000\000\000\000\000\000\000\000\000\000E\002\165\000\000\000\000\000F\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\198\000c\000\000\000\000\000\000\000\000\000\000\000\000\004\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\000\193\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001G\000\205\000\000\000\000\000\000\001I\000\000\000\000\000\000\000\000\001J\000\000\000\000\000\000\000\000\001H\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\138\000\000\000\000\000\000\001\135\000\000\000\000\000\000\000\000\000\000\000\000\001\198\000\\\000]\000\000\000\000\000\000\000\000\000\000\000Z\000\136\000V\000\000\000[\000\000\000\000\000\000\000X\000\000\000\000\000\000\000\000\000Y\000\000\000\000\000\000\000\000\000W\000\000\000\000\002\163\000a\000\000\000g\002b\002a\000`\000\000\000\000\000d\000\000\000\000\000\000\001\136\000\000\000\000\000\000\000\000\000\000\000b\000\000\000h\000l\000\000\000\000\000\000\000\000\000\000\001\251\000\000\000\000\000\000\000\000\000\000\000\000\001\254\002\173\000\000\001\253\001\252\000f\000\000\000\000\000\000\000k\000\000\000e\001\246\002c\000\000\000\000\000\000\000\000\000\000\002`\001\245\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\152\001\151\001\143\000_\000^\000\000\000\000\000\138\000\137\000\000\000\142\000\141\000\000\000E\000\000\000\140\000\139\000\000\000\000\000F\000\000\000\142\000\141\000\000\000\000\000\140\000\139\000\000\000\000\000\138\000\137\000\000\000\000\001p\003\\\000\000\000\000\000\000\000\000\001\198\000\\\000]\000\000\000\000\000\000\000\000\000\000\000Z\000\136\000V\000\000\000[\000\000\000\000\000\000\000X\000\000\000\000\000\000\000\000\000Y\000\000\000\000\000\000\000\000\000W\000\000\000\000\002\163\000a\000\000\000g\002b\002a\000`\000\000\000\000\000d\000\000\000\000\000\000\000\000\000\000\000b\000\000\000h\000l\000\000\000\000\000\000\000\000\000\000\001\251\000\000\000\000\000\000\000\000\000\000\000\000\001\254\000\000\001\253\001\252\000f\000\000\000\000\000\000\000k\000\000\000e\001\246\002c\000\000\000\000\000\000\000\000\000\000\002`\001\245\000\000\000\000\000_\000^\000\000\000\000\000\201\000\000\000\200\000G\000I\000\000\000\000\000\000\000\000\000K\000\000\000\000\000\000\000L\000\000\000\000\000\000\000\000\000\000\000N\000\000\000\000\000P\000\000\000\000\000\000\000Q\000\000\000\000\000\000\000O\000M\000\000\000\000\000\000\000J\000H\000\000\000\000\000\014\000\000\000\000\000\015\004?\000\000\001\145\000\000\004\180\000\000\000\000\000\000\000\000\004\165\000\000\000\000\004\159\000\000\000\000\000\000\000\000\000\000\000\000\004\173\000\000\000\000\004\162\000\000\000\000\004\161\000\000\000\000\004\174\000\000\000\000\004\168\000\000\000\000\004\164\000\000\000\000\004\163\000\000\000\000\004\175\000\000\000\000\004\166\000\000\000\000\004\160\000\000\000\000\004\158\000\000\000\000\004\157\000\000\000\000\004\156\000\000\000\000\004\155\000\000\000\000\004\177\000\000\000\000\004\167\000\000\004\176\000\000\000\000\000\000\004\172\000\000\000\000\004\169\000\000\000\000\004\170\000\000\000\000\004\171\000\000\0043\000\000\004\178\000\000\000\000\004,\0044\0045\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0046\000\000\000\000\002\021\000\000\000\000\002\t\000\000\002\028\000\000\000\000\002\007\002\027\001\213\000\000\002\b\000\000\000\000\000\000\000\000\001\214\002\n\002\025\000\000\000\000\000\000\000\000\000\000\003\192\000\000\003\190\002\175\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002#\002\012\002\011\001\182\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\021\0048\000\000\001\154\000\000\002\142\000\000\002\140\002\141\002\143\004>\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002L\000\000\000\000\000\000\000\000\002N\000\000\002M\000\000\002K\000'\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\161\000\000\001\160\001\159\000\000\001\158\000&\004\030\004\\\000\000\000\000\000\000\000\000\000\000\000\000\004\031\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0021\004=\000\000\000\000\000\000\001\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0042\000\000\004\027\000\000\000\000\000\000\000\149\000\000\004@\000\000\000\000\0047\000\000\000\000\0049\000\000\0040\004F\000\000\000\000\000\000\000\000\000\000\000\000\001\152\001\151\001\143\000\000\004/\004D\004A\000\000\004\179\004E\000\000\004)\000\000\002$\000\000\002\029\000\000\000\000\002\022\000\000\002\023\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002D\003\023\002\223\000\000\003\012\000\000\000\000\000\000\000\000\000\000\000\000\000\202\000\147\000\203\000\000\000\000\000\018\000\000\000\000\000\019\000\148\000\000\001\149\000\000\000\000\000\000\000\000\000R\000\000\000\000\000\016\000\000\000\000\000\017\000S\000\000\001\147\003\025\000\000\000\000\003-\003\020\003\026\003\027\000\000\000\000\000\000\003\028\000\000\000\000\000\000\002/\002\019\000\000\000\000\000\000\000\000\000\022\000\000\000\000\000\000\000\023\003 \000\000\001\156\003&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\016\004\\\000\000\000\000\000\000\000\000\000\000\000\000\003\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0021\003%\000\000\000\000\000\000\003\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\024\000\000\003\r\000\000\000\000\000\000\000\149\000\000\000T\000\000\000\000\000\000\003\029\000\000\000\000\003!\003,\003+\003*\003)\002\216\000\000\002\217\000\000\002\215\000\000\000\000\000\000\000\000\000$\000\000\001Z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\023\000\000\003\012\000\000\000\000\000\000\000\000\000\000\000R\000\000\000\000\000\016\000\000\000\000\000\017\000S\000\000\001\147\003\025\000\000\000\000\003-\003\020\003\026\003\027\000\000\000\000\000\000\003\028\000\000\000\000\000\000\002/\002\019\000\000\000\000\000\000\000\000\000\022\000\000\000\000\000\000\000\023\003 \000\000\001\156\003&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\016\000\000\000\000\000\000\000\000\000\000\000\000\003\017\000\000\000\000\000\000\003%\000\000\000\000\000\000\003\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\024\000\000\003\r\000\000\000\000\000T\000\000\000\000\000\000\003\029\000\000\000\000\003!\003,\003+\003*\003)\000\000\003\194\0022\000\000\003\192\000\000\000\000\000\000\001Q\000\000\001\215\000\000\000\000\001\216\000\000\001R\000\000\000\000\000\000\001P\000\000\000\000\000\000\000\000\000\000\003u\003t\000\000\000\000\003\131\000\000\000\000\003\130\003\129\000\000\003\132\000\000\003\133\000\000\000\000\000\000\003\137\003\136\000\000\003w\000\000\003\128\003\127\000\000\003~\003}\003k\003\144\000\000\003j\000\000\000\000\000\000\000\000\000\000\000\000\003D\000\000\000\000\000\000\000\000\000\000\000\000\003F\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001(\000\000\000\000\000\000\000\000\000\000\000\000\001K\000\207\000\000\000\000\000\000\001M\000\000\000\000\000\000\000\000\001N\000\000\000\000\000\000\000\000\001L\001\171\000\000\000\238\000\000\003r\003q\000\000\000\000\003\139\000\000\000\000\000\000\003\138\003s\000\000\003\141\000\000\000\000\003y\003x\000\000\000\000\000\000\003{\003z\000\000\000\000\000\000\003|\003v\003V\000\000\000\000\000\000\003E\000\000\000\000\000\000\003G\003A\001*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001K\000\207\000\000\000\000\000\000\001M\000\000\000\000\000\000\000\000\001N\000\000\000\000\000\000\000\000\001L\000\000\000\000\000\000\000\000\000\000\001\171\000\000\001\172\000\238\000\000\000\000\001\206\000\000\002?\001\205\000\000\000\000\000\000\000\000\000\000\000\000\002\138\000\000\000\000\000\000\000\000\000\000\000\000\001?\000\000\000\000\001D\000\000\000\000\000\000\001A\000\000\000\000\000\000\001@\000\000\000\000\001C\000\000\000\000\001B\000\197\000\196\004\026\000\000\000\000\000\000\000>\000\000\000\000\000=\000\000\000\000\003\001\003\t\000\000\000\000\000\000\000\000\000\000\003\007\000\000\000\000\000\000\003\006\000\000\000\000\000\000\000\000\004\027\000\000\000\000\000\000\000\000\000\000\003\b\000\000\000\000\003\n\000\000\003\002\000\000\000\000\003\004\000\000\000\000\003\003\000\000\003\005\003\011\000\000\000\000\000\000\000\000\000\000\002#\002\012\002\011\000\000\000<\000;\000\000\000B\000A\000\000\000@\000?\000\000\000D\000C\000\000\000\000\000\000\000\000\000\000\000\000\003C\000\000\000\000\001{\001w\001z\000\000\001v\000\199\001u\001\243\000\000\001q\000\000\000\000\001r\001_\000\000\000\000\000\000\000\000\000\000\002\028\000\000\002\b\000\000\003$\000\000\003\194\0022\002\202\000\000\000\000\000\000\000\000\000\000\000\000\002\211\002\210\000\000\000\000\000\000\000\000\001Z\000\000\003$\000\000\004<\000\000\002$\000\000\000\000\003\143\000\000\003\142\000\000\003u\003t\000\000\000\000\003\131\000\000\000\000\003\130\003\129\000\000\003\132\000\000\003\133\000\000\000\000\000\000\003\137\003\136\000\000\003w\000\000\003\128\003\127\000\000\003~\003}\000\000\001\170\000\000\001l\000\000\000\000\001m\000\000\000\000\000\000\000\000\000\000\000\000\000\249\000\000\003=\003<\000\000\000\000\002?\003\180\000\000\000\000\000\000\003\179\003\156\000\000\003\182\000\000\000\000\003\162\003\161\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\001\003\t\000\000\000\000\000\000\000\000\000\000\003\007\000\000\000\000\000\000\003\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\b\000\000\000\000\003\n\000\000\003\002\000\000\000\000\003\004\000\000\000\000\003\003\000\000\003\005\003\011\001\250\001\173\000\000\004|\001\174\000\000\000\000\000\000\003\164\003\163\000\000\000\000\000\000\003\165\003\159\003\149\000\000\000\000\000\000\000\000\000\000\000\000\003\184\000\000\003\183\000\000\003\158\003\157\000\000\000\000\003\172\000\000\000\000\003\171\003\170\000\000\003\173\000\000\003\174\000\000\000\000\000\000\003\178\003\177\000\000\003\160\000\000\003\169\003\168\000\000\003\167\003\166\003\148\003\185\003\152\003\147\000\000\0018\000\000\000\000\003e\000\000\000\000\003d\003c\000\000\000\000\001\173\000\000\000\242\001\220\000\000\003\151\000\000\000\000\000\244\000\000\001\173\000\000\000\243\001\219\000\000\003m\000\000\000\000\003n\000\000\001j\000\000\003a\000\000\003b\000\000\003`\000\000\001\\\000\000\000\000\004~\000\000\001\173\000\000\004}\000\000\000$\000\000\002\224\000/\000\000\000\168\000\000\000\173\000\000\000\000\000\000\000\170\000\000\000\000\000\169\000\000\000\172\000\000\000\171\000\000\000\000\000\000\000\000\000\000\000\000\000\174\000\000\000\179\000\000\000\000\000\176\000\000\000\000\000\175\000\000\000\178\000\000\000\177\000*\004d\000\000\000\000\000\000\000\000\000\000\000+\004e\000\000\000\000\000\183\000\000\000\180\000\000\000\181\000\182\004a\004V\000\194\000\195\004f\004b\000\000\004c\000\000\000\000\000\000\000\000\004j\000\000\004k\004X\004g\004h\000\000\004i\004W\004U\004S\000\000\000\000\000\000\000\000\004\028\000\000\000\000\000\000\000\000\000\000\000\000\004\029\000\000\0018\000\000\003f\000\000\003h\000\000\003g\000\000\000\000\000\000\000\000\000\000\000\000\000\249\000\000\002 \000\000\002\031\000\000\002\030\002\024\000\000\002\029\000\000\000\000\002\022\000\000\002\023\000\000\003f\000\000\003h\000\000\003g\000\000\003r\003q\000\000\000\000\001\\\000\000\000\000\000\000\001a\000\000\001c\001d\001b\001f\000\000\000\000\001\173\000\000\000\242\000\000\003\155\003\154\000\000\000\000\000\000\000\244\000\000\001\173\000\000\000\243\000\000\000\000\000\000\000\000\000>\000\000\000=\000\000\000<\000;\000\000\000B\000A\000\000\000@\000?\000\000\000D\000C\000\000\000\000\000\000\002\190\000\000\0015\000\000\002\191\000\000\000\000\000\000\004+\004*\000\000\001X\000\001\000\000\000\000\001Y\000\002\000\000\000\003\000\000\002\192\000\000\000\004\000\000\002\193\000\000\000\000\002\194\000\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002L\000\000\000\000\000\000\000\000\002N\000\000\002M\000\000\002K\000'\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\161\000\000\001\160\001\159\000\000\001\158\000&\004\028\000\000\000\000\000\000\000\000\000\000\000\000\004\029\000\000\000\000\000\000\000\000\004~\000\000\001\173\000\000\004}\000\000\000\000\000\000\000\000\001\173\000\000\004|\000\000\000\000\000\228\000\223\000\224\000\227\000\225\000\000\004N\000\000\000\000\000\000\000\000\004<\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\131\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\171\000\000\004x\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0041\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\208\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\201\000\000\000\200\000G\000I\000\000\000\000\000K\000\000\000\000\000\000\000L\000\000\000\000\000\000\000\000\000\000\000N\000\000\000\000\000P\000\000\000\000\000\000\000Q\000\000\000\000\000\000\000O\000M\000\000\000\000\000\000\000J\000H\000\000\000\000\000\014\000\000\000\000\000\015\004?\000\000\001\145\000\000\004\180\000\000\000\000\000\000\000\000\004\165\000\000\000\000\004\159\000\000\000\000\000\000\000\000\000\000\000\000\004\173\000\000\000\000\004\162\000\000\000\000\004\161\000\000\000\000\004\174\000\000\000\000\004\168\000\000\000\000\004\164\000\000\000\000\004\163\000\000\000\000\004\175\000\000\000\000\004\166\000\000\000\000\004\160\000\000\000\000\004\158\000\000\000\000\004\157\000\000\000\000\004\156\000\000\000\000\004\155\000\000\000\000\004\177\000\000\000\000\004\167\000\000\004\176\000\000\000\000\000\000\004\172\000\000\000\000\004\169\000\000\000\000\004\170\000\000\000\000\004\171\000\000\0043\000\006\000\000\000\210\000\000\004\178\000\000\000\209\0044\0045\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0046\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\021\0048\000\000\001\154\004>\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\030\000\000\000\000\000\000\000\000\000\000\000\000\004\031\000\000\000\000\000\000\000\000\004=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0042\000\000\000\000\004@\000\000\000\000\0047\000\000\000\000\0049\000\000\0040\004F\000\000\004/\004D\004A\000\000\004\179\004E\004O\000\000\000\211\004\189\000\007\000\000\000\000\000\213\000\000\000\000\000\212\004\190\000\214\000\215")
  
  and error =
    (126, "\161\226\128\000N\137|\222\254\002\131\248\128\128a\194\135\138\002a:%\243{\248\n\015\226\002\001\135\000\000\000\000\000 \001\000\000\128\000\000\000\000\000\000\031}\196\b ~\195\000\001`\227\220\028X\020\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002>(\"\004\232\151\205\239\224(?\128(\006<\031}\196\b ~\195\000\001`\227\220\028X\020\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\128\000\000\000\000\000\000\bX\160\000\019\002\0305\191\128 \242\000\160\bp\000\000\000\000\002\000\016\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000@\000 \000\000\000\000\000\000\015\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\192\000\000\000\000\128\004\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\b\000\000\000\000\000\000\000\004\130\000\001\000 cZ\232\000\003\000\000\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\130\000\001\000 cZ\232\000\003\000\000\000\130\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\022.\004\007\240\151\143o\231\203<\128\b\"\\\192H \000\016\130\0065\174\128\0000\000\000\b \001 \128\000@\b\024\214\186\000\000\192\000\000 \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H \000\016\002\0065\174\128\0000\000\000\b \001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\022.\004\007\240\151\143o\231\203<\128\b\"\\\192H \000\016\130\0065\174\128\0000\000\000\b \001 \128\000@\b\024\214\186\000\000\192\000\000 \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000 \000\000\128\000\002\003\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000 \002\000\000\b\000\000 0\000\000\000\000\000\000\000\128\b\000\000 \000\000\128\192\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H \000\144\002\0065\174\128\0000\000\000\b \001 \128\000@\b\024\214\186\000\000\192\000\000 \128\004\130\000\001\000 cZ\232\000\003\000\000\000\130\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!b\224@\127\tx\246\254|\179\200\000\130%\204\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \128@@\b\024\214\186\000\000\192\000\000 \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\b\000\004\000\129\157k\160\000\012\000\000\002\b\000H \000\016\002\0065\174\128\0000\000\000\b \001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\022.\004\007\240\151\143o\231\203<\128\b\"\\\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\138\001\0010!\227[\248\002\015 \002\000\135\002\022(\004\004\192\135\141o\224\b<\128\b\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000@\017 \000\b \002\000\000\000P\000\004\000\000\001\000D\128\000 \128\b\000\000\bX\160\000\019\002\0305\191\128 \242\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!b\224@\127\tx\246\254|\179\200\000\131%\204\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\001\000D\128\000 \128\b\000\000\031}\196\b ~\195\000\001`\227\220\028X\020\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\030(\001$\232\151\205\239\224(?\128(\014\028\031}\196\b ~\195\000\001`\227\220\028X\020\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\135\138\000I:%\243{\248\n\015\224\002\003\135\007\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\002\000\000\002`\000\000@\001\000\000\000\n\n\128\000@0\000\000@@\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000 \218\000\000\024\000H 0\002\130\140\b\016\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000 \128\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000 \218\000\000\024\000H 0\002\130\140\b\016\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\002\r\160\000\001\128\004\130\003\000((\192\129\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\130\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\002\000\000\002\000\000D\004\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\152\000\000\000\000@\000\000\002\128\160\000\016\012\160\b\018\000\000`\029\160\000\001 \018\004\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000&\000\000\004\000\018\000\000\000 \168 \132\003\b\002\004\000\000\024\007h\000\000\b\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\003\b\002\004\000\001\024\007h\000\000\b\000\128\000\000\004\000\000\000\000\000 \000\000\000\000\000\000\000\000\004\000\000\r\128\000\001\000\004\128\001\000h\n\192\163\000\194\000\129\000\000F\001\218\000\000\002\000 \000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\001\128D\128\000\000\000\b\000\000\016\000\0006\000\000\004\000\018\000\000\001\160\163\002\004\003\000\000@\000\001\024\004H\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\016\000\000\000\000\001\128D\128\000\000\000\b\000\000\031}\196\b ~\195\000\001`\227\220\028X\020\028\161\226\128\018N\137|\222\254\002\131\248\000\128\225\192\004\130\000\001\b cZ\232\000\003\000\000\000\130\000\018\b\000\004\000\129\141k\160\000\012\000\000\002\b\000H \000\016\002\006u\174\128\0000\000\000\b \001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\b\000\000 \000\000\128\192\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\002\000\000\000\004\000\000\000\000\000\000\000 \002\000\000\b\000\000 0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\b\000\004\000\129\157k\160\000\012\000\000\002\b\bX\160\000\019\002\0305\191\128 \242\002\"\np\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\022(\000\004\192\135\141o\224\b<\128\b\002\028\000H \000\016\130\0065\174\128\0000\000\000\b \001 \128\000@\b\024\214\186\000\000\192\000\000 \128\133\138\000\0010!\227[\248\002\015 \" \167\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\b\000\133\138\000A0!\227[\248\002\015 \"\000\167\002\022(\000\004\192\135\141o\224\b<\128\b\002\028\000H \000\016\130\0065\174\128\0000\000\000\b \001 \128\000@\b\024\214\186\000\000\192\000\000 \128\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000@\000\000\b\128\000\133\138\000\0010!\227[\248\002\015 \002\000\135\015\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\200X\160\000\019\002\0305\191\128 \242\000 \bp}\247\016 \129\251\012\000\005\131\143pq`Pr\135\138\000I:%\243{\248\n\015\224\002\003\135\000\018\b\000\004 \129\141k\160\000\012\000\000\002\b\000H \000\016\002\0065\174\128\0000\000\000\b \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\000 \000\128\000(\000\000\000\002\000\000\000\004\130\000\001\000 cZ\232\000\003\000\000\000\130\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\016L;\182\159\194>\253\190\159\0121,\163\171\167!b\128@L\tx\214\254\000\131\200\000\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\022.\004\007\240\151\143o\231\203<\128\b2\\\200X\160\016\019\002\0305\191\128 \242\000 \bp!b\128@L\bx\214\254\000\131\200\000\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\002\000\000\000\004\000\000\000\000\000\000\000 \002\000\000\b\000\000 0\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!b\128\016L\bx\214\254\000\131\200\b\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\130\000\001\000 kZ\232\000\003\000 \000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\1308\001\128\"oZ\232\000\003\000\b\000\130\000\018\b\000\004\000\129\141k\160\000\012\000\000\002\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\240\016\000\000\000\000\001\128+\128\000\000\000\000\000\000\bX\184\000\031\194^=\191\159,\242\000 \137s\001\000\000\000\000\000\016\004H\000\002\b\000\128\000\002\135\138\000!:%\243{\248\n\015\224\002\001\135\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\002`\000\000\000\000\000\000\000\002\b\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128\000 \000\000\b\000\000\000\000\000\000\000\000\000\004\000\000\000\001\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\192 \000\002\000 A\002\016\000\128\012\000 \016\000\127\255\255\255\255\255\255\255\255\255\255\255\255\255\255\252\004\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\t\128\000\001\000\004\000\000\000(*\000\001\000\192\000\001\001\000\b\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\128\000\000\000\004\000\000\000(\n\000\001\000\202\000\129 \000\006\001\218\000\000\018\001 @\128\000\000\000\152\000\000\016\000H\000\000\000\130\160\130\016\012 \b\016\000\000`\029\160\000\000 \002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\000\129\000\000\006\001\218\000\000\000\000 \000\160\003\000\002\020\000\000\024\007h\000\000\000\000\128\002\128\012\000\b\016\000\000`\029\160\000\000\000\002\000\n\000\000\000\000\128\000\000\000\000\000\000\000\000`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\b\000\000\b\000@\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\0000\128 @\000\001\128v\128\000\000\128\b\000\000\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\140\000\000\000\000\b\000\000\006\002\012\000 \004\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\012 \b\016\000\004`\029\160\000\000 \n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\194\000\129\000\000F\001\218\000\000\002\000 \000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\0000\128 @\000\017\128v\128\000\000\128\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\r\128\000\001\000\004\128\001\000h\n\192\163\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\002\000\b\000\000\000\000\001\b\000\000\000\000\000\000\000\016\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012 \b\016\000\000`\028\160\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\012 \b\016\000\000`\029\160\000\000 \002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\216\000\000\000\000H\000\000\006\128\172\n0\012 \b\016\000\000`\029\160\000\000 \002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\r\128\000\000\000\004\128\000\000(\n\192\163\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\004\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\128\000\000\194\000\145\000\000F\001\218\000\000\002\000\160\000\000\003\b\002\004\000\001\024\007h\000\000\b\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\012 \b\016\000\000`\029\160\000\000 \002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\012 \b\016\000\000`\029\160\000\000 \002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\b\128\000\012 \b\016\000\000`\029\160\000\000 \002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\0000\128 @\000\001\128v\128\000\000\128\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\b\128\000\012 \b\016\000\000`\029\160\000\000 \002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\002\000\000\000\000\128\b\000\000\000\000@\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000 \000\000 \001\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \002\000\000\002\000\016\000\000\000\000 \000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\002\004\000\000\024\007h\000\000\000\000\128\000\128\004\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\001\000\000\001\000\004\000\001\000\000\b\000 \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\004\000\001\000\000\b\000 \128\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000@\000\000@\001\000\000@\000\002\000\b \000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\016\000\004\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\012\000\b\016\000\000`\029\160\000\000\000\002\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000@\000\016\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000(\000\000\000\004\000\000\000\000\016\000\004\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\002\b\000@\000\000\000\006\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\"\000\0000\128 @\000\001\128v\128\000\000\128\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\"\000\0000\128 @\000\001\128v\128\000\000\128\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000 \000\b \001\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\130\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\b\000\000\012 \t\016\000\000`\029\160\000\000 \002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\152\000\000\000\000@\000\000\000\128\160\130\016\012 \b\016\000\000`\029\160\000\000 \002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000&\000\000\004\000\018\000\000\000 ( \132\003\b\002\004\000\000\024\007h\000\000\b\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\128 @\000\001\128v\128\000\004\128\b\016 \000\194\000\145\000\000F\001\218\000\000\002\000 \000\000\000\000\000\152\000\000\016\000H\000\000\000\128\160\130\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\002\000\000\003\b\002D\000\001\024\007h\000\000\b\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\002\020\000\000\024\007h\000\000\000\000\128\002\128\000\000\002`\000\000@\001 \000\000\002\002\130\b@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000&\000\000\004\000\018\000\000\000 ( \132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002`\000\000@\001 \000\000\002\002\130\b@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\000\000\000\000\004\000\024\000\000\016\000 @\000\000\000\000\152\000\000\016\000H\000\000\000\128\160\130\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000H\000\000\000\000\004\000\b\000\000\016\000\000@\000\000\000\000\152\000\000\016\000H\000\000\000\128\160\130\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\128\000\001\000\004\128\000\000\b\n\b!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002`\000\000@\001 \000\000\002\002\130\b@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\152\000\000\016\000H\000\000\000\128\160\130\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\128\000\001\000\004\128\000\000\b\n\b!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\152\000\000\016\000H\000\000\000\128\160\130\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003(\002\004\000\000\024\007(\000\000H\000\001\002\000\000\000\002`\000\000@\001 \000\000\002\n\130\b@0\128$@\000\017\128v\128\000\000\128\b\000\000\000\192\000\133\000\000\006\001\218\000\000\000\000 \000\160\001 \000\000\000\000\016\000`\000\000@\000\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000&\000\000\000\000\016\000\000\000 (\000\132\003\b\002\004\000\000\024\007h\000\000\b\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\0000\128 @\000\001\128v\128\000\000\128\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\216\000\000\000\000H\000\000\002\128\172\b\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000&\000\000\004\000\016\000\000\000\160(\000\004\002\000\000\004\004\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\128\000\001\000\004\000\000\000(\n\000\001\000\000\000&\000\000\000\000\016\000\000\000\160(\000\004\000\000\000\152\000\000\000\000@\000\000\000\128\160\000\016\000\000\002`\000\000\000\001\000\000\000\002\002\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002`\000\000\000\001\000\000\000\002\002\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002`\000\000\000\001\000\000\000\002\002\128\b@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\128 @\000\001\128r\128\000\004\128\000\016 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\152\000\000\000\000@\000\000\002\128\160\000\016\004\128\000\002\000\000@\001\160\000\001\000\018\004\b\000\018\000\000\000\000\001\000\006\128\000\004\000\b\016 \000\000\000\000\000\000\130\000\016\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128\000\000\000\000@\000\160\000\001\000\000\004\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\000\000\001\000\002\128\000\004\000\000\016 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000&\004\000\004\000\016\000\000\000\160(\000\004\000\000\000\152\016\000\000\000@\000\000\002\128\160\000\016\004\128\000\002\000\000@\001\128\000\001\000\002\004\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\000\000\000\000\004\000\024\000\000\016\000 @\128\000\000\000\152\000\000\016\000H\000\000\000\128\128\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\128\000\001\000\004\128\000\000\b\b\b \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002`\000\000@\001 \000\000\002\002\002\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\152\000\000\016\000H\000\000\000\128\128\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\128\000\001\000\004\128\000\000\b\b\b \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\152\000\000\016\000H\000\000\000\128\128\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\000\000\001\000\006\000\000\004\000\b\016\000\000H\000\000\000\000\004\000\b\000\000\016\000\000@\000\000\000\000\152\000\000\000\000@\000\000\000\128\128\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000H\000\000\000\000\004\000\024\000\000\016\000 @\000\001 \000\000\000\000\016\000 \000\000@\000\001\000\000\000\000\002`\000\000\000\001\000\000\000\002\002\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000&\000\000\000\000\016\000\000\000  \000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002`\000\000\000\001\000\000\000\002\002\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\152\000\000\000\000@\000\000\000\128\128\002\000\004\128\000\000\000\000@\001\128\000\001\000\002\004\000\000\018\000\000\000\000\001\000\002\000\000\004\000\000\016\000\000\000\000&\000\000\000\000\016\000\000\000  \000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\004\128\000\000\000\000@\001\128\000\001\000\002\004\000\000\018\000\000\000\000\001\000\002\000\000\004\000\000\016\000\000\000\000&\000\000\000\000\016\000\000\000  \000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002`\000\000\000\001\000\000\000\002\002\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\152\000\000\000\000@\000\000\000\128\128\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\004\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\004\128\000\002\000\000@\001\128\000\001\000\002\004\b\000\018\000\000\000\000\001\000\006\000\000\004\000\b\016 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\128\000\000\000\000\000\000\000\b \000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128\000 \000\000\b\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\t\128\000\000\000\000\128\000\000(\000\000\000\000 \000\002\000 A\002\016\000\128\012\000 \016\000\000\000\000\000\000\001\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\007\240\006\003\000\007\195\000\000\000 P\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\012 \b\016\000\000`\029\160\000\000 \002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031}\196\b ~\195\000\001`\227\220\028X\020\028\161\226\128\018N\137|\222\254\002\131\248\000\128\225\192\012\130\b\000\016\000\224\019\184\000\003@\002\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\2008\144\031\192^\r;\159\0124\000 \201c\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\004\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\128\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\004`\017 \000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\006\001\018\000\000\000\000 \000\000\128\128\000\b\000\129\004\b@\002\0000\000\128@\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\240\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000 \000\000\"\004\000\004\000\016\000\000\000\128(\000\004\002\000\000\004\004\000 \000\000\000\000\000\000\000\000\002\000\000\002 @\000\000\001\000\000\000\b\002\128\000@\018\000\000\b\000\001\000\006\000\000\004\000\b\016 \000H\000\000\000\000\004\000\024\000\000\016\000 @\128\128\000\000\136\000\000\016\000H\000\000\000\000\128\130\000\012 \b\016\000\000`\029\160\000\000 \002\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000 \128\004\000\000\000\000h\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\b\000\000\b\000@\000\000\000\000\128\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000 \000\000 \001\000\000\000\000\002\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\128\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\t\128\000\000\000\004\000\000\000\b\n\b!\000\194\000\129\000\000\006\001\218\000\000\002\000 \000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\003\000\000\003`\000\000@\001\000\000\000\026\002\176(\1920\128 @\000\017\128v\128\000\000\128\b\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\b\016\000\000`\029\160\000\000\000\002\000\n\000\000\000\001\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\bP\000\000`\029\160\000\000\000\002\000\n\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\002\004\000\000\024\007h\000\000\000\000\128\002\128\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\001\128\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\0000\128 @\000\001\128v\128\000\000\128\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000\003`\000\000@\001\000\000\000\026\002\176(\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\b\002\004\000\000\024\007(\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\012 \b\016\000\000`\029\160\000\000 \002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\000\000\216\000\000\000\000@\000\000\006\128\172\n0\012 \b\016\000\000`\029\160\000\000 \002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000\003`\000\000\000\001\000\000\000\n\002\176(\192\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\b\128\000\001\000\004\128\000\000\000\b\b \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\002\000\000\002 \000\000@\001 \000\000\000\002\002\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\136\000\000\016\000H\000\000\000\000\128\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\b\128\000\001\000\004\128\000\000\000\b\b \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\136\000\000\016\000H\000\000\000\000\128\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\000\000\001\000\006\000\000\004\000\b\016\000\000H\000\000\000\000\004\000\b\000\000\016\000\000@\000\128\000\000\136\000\000\000\000@\000\000\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000H\000\000\000\000\004\000\024\000\000\016\000 @\000\001 \000\000\000\000\016\000 \000\000@\000\001\000\002\000\000\002 \000\000\000\001\000\000\000\000\002\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\"\000\000\000\000\016\000\000\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\002 \000\000\000\001\000\000\000\000\002\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\136\000\000\000\000@\000\000\000\000\128\002\000\004\128\000\000\000\000@\001\128\000\001\000\002\004\000\000\018\000\000\000\000\001\000\002\000\000\004\000\000\016\000 \000\000\"\000\000\000\000\016\000\000\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\004\128\000\000\000\000@\001\128\000\001\000\002\004\000\000\018\000\000\000\000\001\000\002\000\000\004\000\000\016\000 \000\000\"\000\000\000\000\016\000\000\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\002 \000\000\000\001\000\000\000\000\002\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\136\000\000\000\000@\000\000\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\152\000\000\000\000@\000\000\000\128\160\000\016\012 \b\016\000\000`\029\160\000\000 \002\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\194\000\129\000\000\006\001\218\000\000\002\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000\003`\000\000\000\001\000\000\000\002\002\160 @\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\128\000\000\152\000\000\016\000@\000\000\002\128\160\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\t\128\000\001\000\004\000\000\000(\n\000\001 \000\000&\000\000\000\000\016\000\000\000\160(\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\t\128\000\000\000\004\000\000\000\b\b\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\004\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\004\128\000\002\000\000@\001\128\000\001\000\002\004\b\000\018\000\000\000\000\001\000\006\000\000\004\000\b\016 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128\000 \000\000\b\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000 \000\000\000\000\000\000\000\000\b\000\000\b\128\000\000\000\000\128\000\000 \000\000\000\000@\000\000\000\000\006\001\018\000\000\000\000 \000\000\192\000\000\216\000\000\016\000@\000\000\000\130\136\b\016\012\000\001\000\000\004`\017 \000\000\000\002\000\000\012\000\000\004\000\000\001\000\000\000\000\000\000 \136\000\000@\000\000\000\000\006\001\018\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\016\000\000\000\000\000\000\000\000\000\002\000\000\000\128\000\000\000\001\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000 \000 \000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\128\000\003\b\002\004\128\000\024\007h\000\000\b\000\128\000\000\012 \b\016\000\000`\029\160\000\000 \002\000\000\004\000\000\r\128\000\000\000\004\128\000\000(\n\192\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\b\002\004\000\000\024\007h\000\000\b\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\128\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\003`\000\000\000\001 \000\000\n\n0 @\000\000\000\000\000\000\000\000\000\000\000  \000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\216\000\000\000\000H\000\000\002\130\140\b\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\r\128\000\000\000\004\128\000\000(\b\192\129\000 \000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\016\000\0006\000\000\004\000\018\000\000\001\160\163\002\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000@\000\000\000\000\006\001\018\000\000\000\000 \000\000@\000\000\216\000\000\000\000H\000\000\002\128\140\b\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\001\128D\128\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\004\001\018\000\000\130\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\004\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\000\001\000\000\000@\017 \000\b \002 \000\002\022(\000\004\192\135\141o\224\b<\128\b\002\028\031\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255!b\128\000L\bx\214\254\000\131\200\000\128!\192\133\138\000\0010!\227[\248\002\015 \" \167\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bX\160\004\019\002\0305\191\128 \242\002 \bp\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\b\000\004\000\129\141k\160\000\012\000\000\002\b\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000A0\238\218\127\b\251\246\250|0\196\178\142\174\156\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\027\182\143\192<\012\158\031\012\001$\163\163\135\001 \128\000@\b\024\214\186\000\000\192\000\000 \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \128\000@\b\026\214\186\000\000\192\b\000 \128\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\004\195\187i\252#\239\219\233\240\195\018\202:\186p\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\130\000\001\000 cZ\232\000\003\000\000\000\130\000\000\000\224\002\000\b \002\000\000\000\000 \000\000\000H \000\016\002\0065\174\128\0000\000\000\b A0\238\218\127\b\251\246\250|0\196\178\142\174\156\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\b\000\004\000\129\141k\160\000\012\000\000\002\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#j\128@L\tx\214\254\000\131\200\002\136!\192\141\170\001\0010!\227[\248\002\015 \002\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\218\160\000\019\002\0305\191\128 \242\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000`\000\000\000\000\000\000\000\000\000\016\006\000\007\240\007\131\000\007\195\000\000\000 P\192\000\000\016\000\000\000\000\000\000\000\000\000\001 \000\003\b\002\004\000\000\024\007h\000\000\b\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\128 @\000\017\128v\128\000\000\128\b\000\000\000@\000\000\000\000\006\001\018\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\003`\000\000\000\000\000\000\000\b\0000 \000\000\000\r\128\000\000\000\000\000\000\000 \000\192\128\000\194\000\129\000\000\006\001\218\000\000\002\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\004\000\000\000\000\000`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\2426(\000$\192\135\141o\224\b<\128\bJ\028\b\216\160\000\019\002\0305\191\128 \242\000!(p\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000@\000 \000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\128\000\000\000\000\000\000\000H \000\016\002\0065\174\128\0000\000\000\b \000\016n\218?\000\2402x|0\004\178\142\142\028\004\130\000\001\000 cZ\232\000\003\000\000\000\130\004\019\014\237\167\240\143\191o\167\195\012K(\234\233\200X\160\000\019\002\0305\191\128 \242\000 \bp!b\128\000L\bx\214\254\000\131\200\b\136)\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\022(\001\004\192\135\141o\224\b<\128\136\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000@\000\000\b\000\002\000\000\000\000\000\000 \000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\b\000\000\000\000\002\b\000\000\000\000\000\000\000\001\000\000\000\000\000\000\b \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\003\b\002\004\000\000\024\007h\000\000\b\000\128\000\002\000\000\002 \000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\b\000\000\000\000\000\000\000\000\000 \000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\003\b\002\004\000\000\024\007h\000\000\b\000\128\000\002\000\000\002 \000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\004\128\000\133\138\000\0010!\227[\248\002\015 \002\000\135\000\018\b\000\004\000\129\141k\160\000\012\000\000\002\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\128\000n\218?\000\2402x|p\000\162\142\142\028\133\138\001\0010%\227[\248\002\015 \002\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\004\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\016\000\000\000\000\000\000\000\002\000\014\162\t\000\016\004\224\019\184\000\003@\n\000\130\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\b\000\"\000\1282\b \000@\019\128N\224\000\r\000\b\002\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\012\130\b\000\016\000\224\019\184\000\003@\"\000\162\0002\b \000@\003\128N\224\000\r\000\b\002\b\000\000\000\000\000\000\000\000\000\128\000 \000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\2008\144\031\192^\r;\159\0124\000 \201c\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\128\000 \000\000\000\000\003 \130\000\004\0008\004\238\000\000\208\b\128(\131\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\240\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200 \128\001\000\014\001;\128\0004\002 \n \003 \130\000\004\0008\004\238\000\000\208\000\128 \128\012\130\b@\016\000\224\019\184\000\003@\"\000\130\b\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000@\000\000\000\000\000\000\000\000\000 \000\b2\b!\000@\003\128N\224\000\r\000\136\002\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\b\000\000\000\004\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\128\000\000\000\000\000\000\000\000\000\128\000 \192\000\002\000\000\002\000\000\000\000\000\002\000\000\000\128\000\000\b\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\b\000\000\000\000\000\000\000\000\000\b\128 \012\130\b\000\016\000\224\019\184\000\003@\002\000\130\0002\b \000@\003\128J\160\000\012\000\000\002\b\000\2008\144\031\192^\r;\159\0124\000 \137c\003 \130\000\004\0008\004\238\000\000\208\000\128 \128\004\000\000\000\000\000 \000\000\000\000\000\000\000\000\b2\b-\128@\003\128J\160\000\012\000\000\154\170\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\r\128\000\000\000\000\000\000\000\000@\152\162\000\000 \000\001\000\b\000\000\128\000 \000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\192@\000\000\000\000\004\000*\000\000\000\000\000\000\000\003 \130@\004\0008\004\238\000\000\208\000\128 \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\b!\000@\003\128N\224\000\r\000\136\002\b \000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\128\000\000\000\000\000\128\000\000 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\b \000@\003\128J\160\000\012\000\000\002\b\000\2008\144\031\192^\r;\159\0124\000 \137c\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\2482\b \000@\003\128N\224\000\r\000\b\002\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\216\000\000\000\000\000\000\000\000\000\t\138 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\018\000\r\128\000\001\000\n\128\000\004\000\000\152\162\000\200 \144\001\000N\001;\128\0004\000 \b \003 \130\000\004\0008\004\238\000\000\208\000\128 \128\004\000\000\000\000\000 \000\000\000\000\000\000\000\000\0012\b-\128@\003\128J\160\016\012h\000\154\170\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\r\128\000\000\000\000\000\016\000h@\152\162\000\000 \000\001\000\b\000\000\128\000 \000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\192@\000\000\000\000\004\000*\000\000\000\000\000\000\000\003 \130@\004\0008\004\238\000\000\208\000\128 \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\131 \130\000\004\0008\004\238\000\000\208\000\128 \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\r\128\000\000\000\000\000\016\000h\000\152\162\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017 \000\216\000\000\016\000\168\001\000F\128\t\138 \012\130\t\000\016\004\224\019\184\000\003@\002\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\128\002 \128\003\b\002\004\000\000\024\007h\000\000\b\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\b \000@\003\128N\224\000\r\000\b\002\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003 \130\000\004\0008\004\238\000\000\208\000\128 \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\128\000\000\200 \144\001\000N\001;\128\0004\000 \b \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200 \128\001\000\014\001;\128\0004\002 \n \003 \130\000\004\0008\004\238\000\000\208\000\128 \128\000\000\000\000\000\000\000\000\000\000\000\000\000 (\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\128\000\200 \128\001\000\014\001;\128\0004\002 \n \003 \130\000\004\0008\004\238\000\000\208\000\128 \128\000\000\000\000\000\000\000\000\000\000\000\000\000 (\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\130\b@\016\000\224\019\184\000\003@\"\000\130\b\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000 \000\000\000\000\000 \000\000\b\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\b \000@\003\128N\224\000\r\000\136\002\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\130\b@\016\000\224\019\184\000\003@\"\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\128\000\000\000\000\000\128\000\000 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\b\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200 \128\001\000\014\001;\128\0004\002 \n \000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\b!\000@\003\128N\224\000\r\000\136\002\b \000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\128\000\000\000\000\000\128\000\000 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\252\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\b \000@\003\128N\224\000\r\000\b\002\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\007\240\006\003\000\007\195\000\000\000 P\192\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\004\000\000\000\000\000\000\000\000\000\000\136 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\131\b\002\004\000\000\024\007h\000\000\b\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\004\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003 \130\000\004\0008\004\238\000\000\208\000\128 \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003 \130\000\004\0008\004\238\000\000\208\b\128(\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200 \132\001\000\014\001;\128\0004\002 \b \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\b\000\000\002\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\004\000\000\000\000\000\000\000\000\000\000\136 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\131\b\002\004\000\000\024\007h\000\000\b\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\004\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\b\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\b\000\000\000\000\000\000\000\000\000\b\002\000\000\000\000\000\000\000`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\t\000\000\000\000\000\000\000\000\000\000\128\160 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\012\130\b\000\016\000\224\019\184\000\003@\002\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\002\000\200 \128\001\000\014\001;\128\0004\000 \b \128\000\000@\000\000\000\000\000\000\000\000\000\001\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000$\000\000\000\000\000\000\000\000\000\002\002\128\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\128\002\000\000!b\128\002L\bx\214\254\000\131\200\000\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\003 \130\000\004\0008\004\238\000\000\208\000\128 \128\000\000\000\000\000\000\000\000\000\004\000\000\000\000\b\002\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\128\000\000\000\000\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\163\137\001\252\005\224\211\185\240\195@\n\b\1500\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\128\000 \000\000\000\000\000\000\000@\000\000\000\000\002\000\000\128\000\000\000\000\014\162\t\000\016\004\224\019\184\000\003@\002\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\b\000\000\014\162\t\000\016\004\224\019\184\000\003@\002\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\b\000\bX\160\000\019\002\0305\191\128 \242\000 \bp!b\128\000L\bx\214\254\000\131\200\000\128!\192\004\130\000\001\000 cZ\232\000\003\000\000\000\130\000\001\006\237\163\240\015\003'\135\195\000I(\232\225\192\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000 \000\160\000\000\000\000\000\000\002\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\000\000\000\128\004\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\b\000\000\000\000\000\000\000\004\130\000\001\000 cZ\232\000\003\000\000\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\006\237\163\240\015\003'\135\199\000\n(\232\225\192H \000\016\002\0065\174\128\0000\000\000\b \001 \128\000@\b\024\214\186\000\000\192\000\000 \128\004\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bX\184\016\031\194^=\191\159,\242\000 \137s\000\000\000\000\002\000\016\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\b\000:\136$\000@\019\128N\224\000\r\000(\002\b\000\000\000\000\000\000\000\000\002\000\000\001\000\000 \000\003\000\002\004\000\000\024\007h\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000 @\000\001\128v\128\000\000\000\b\000\000\000\000\000\000\000\000\000\000\002\000\000\001\000\000\000\000!b\128\000L\bx\214\254\000\131\200\000\128!\192\000\000\000\000\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\200 \128\001\000\014\001;\128\0004\000 \b \000\000\000\000\000\000\000\000\000\001\000\000\000\000\002\000\133\138\000\0010!\227[\248\002\015 \002\000\135\002\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\004\027\182\143\192<\012\158\031\012\001$\163\163\135!b\128\000L\bx\214\254\000\131\200\000\128!\192\b\000\000\000\000\000`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\b\000\bX\160\000\019\002\0305\191\128 \242\000 \bp!b\128\000L\bx\214\254\000\131\200\000\128!\192\004\130\000\001\000 cZ\232\000\003\000\000\000\130\b\000\006\237\163\240\015\003'\135\199\000\b(\232\225\192H \000\016\002\0065\174\128\0000\000\000\b \128\000n\218?\000\2402x|p\000\162\142\142\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\b\000\004\000\129\141k\160\000\012\000\000\002\b\bX\160\000\019\002\0305\191\128 \242\002\"\np\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000 \000\027\182\143\192<\012\158\031\028\000(\163\163\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\001\000\000\000\000\000\024\002\184\000\000\000\000\000\000\000\133\139\128\001\252%\227\219\249\242\207 \002\b\1510\016\000\000\000\000\001\000D\128\000 \128\b\000\000\000\000\000\000\000\000\004\000\002\000\000\000\000\000 \000\129\000\000\000\000\000\024\004H\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\000\001\000\004\128\000\000\b(\136\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\012\000\001\000\000\000`\017 \000\000\000\002\000\000\004\000\000\004\000\000\001\000\000\000\000\000\000 \136\000\000\192\000\016\000\000F\001\018\000\000\000\000 \000\000\000\000\000@\000\000\000\000\000\000\000\004\000\b\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\004\001\018\000\000\130\000 \000\000\000\000\000@\000\000\016\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\001\000D\128\000 \128\b\000\000\000\000\0000\000\000\004\000\018\000\000\000 \" \004\003\000\000@\000\001\024\004H\000\000\000\000\128\000\002\002\000\000 \002\004\016!\000\b\000\192\002\001\000\000\000\000\000\000\000\017\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\003\b\002\004\000\000\024\007h\000\000\b\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\223q\002\b\031\176\192\000X8\247\007\022\005\007(x\160\004\147\162_7\191\128\160\254\000 8p!b\224@\127\tx\246\254|\179\200\000\131%\204\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\bX\160\000\019\002\0305\191\128 \242\000 \bp\127\255\255\255\255\255\255\255\255\255\255\255\255\255\255\252\004\000\000\000\000\000`\n\224\000\000\000\000\000\000\002\022.\000\007\240\151\143o\231\203<\128\b\"\\\192@\000\000\000\000\004\001\018\000\000\130\000 \000\000\000\000\000\000\000\000\016\000\b\000\000\000\000\000\128\002\004\000\000\000\000\000`\017 \000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\138\001\0010!\227[\248\002\015 \002\000\135\002\022(\000\004\192\135\141o\224\b<\128\b\002\028 \000\027\182\143\192<\012\158\031\028\000 \163\163\135\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0026\168\004\004\192\151\141o\224\b<\128(\130\028\b\218\160\016\019\002\0305\191\128 \242\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\002\000\000#j\128@L\bx\214\254\000\131\200\002\128!\192\141\170\000\0010!\227[\248\002\015 \002\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\232X\160\000\019\002\0305\191\128 \242\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000A\131h|\001\128\193\001\240\192\018B:8z\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016`\218\031\000`0@|0\004\144\142\142\029\004\195\187i\252#\239\219\233\240\195\018\202:\186p\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bX\160\000\019\002\0305\191\128 \242\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000(X\160\000\019\002\0305\191\128 \242\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000A\131h|\001\128\193\001\240\192\018B:8r\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\024\000\135\192\024\012\000\031\012\000\000\000\161\003\161b\128\000L\bx\214\254\000\131\200\000\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\006\r\161\240\006\003\004\007\195\000I\b\232\225\232X\160\000\019\002\0305\191\128 \242\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000A\131h|\001\128\193\001\240\192\018B:8z\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016`\218\031\000`0@|0\004\144\142\142\030\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\0246\135\192\024\012\016\031\012\001$#\163\135\161b\128\000L\bx\214\254\000\131\200\000\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\006\r\161\240\006\003\004\007\195\000I\b\232\225\232X\160\000\019\002\0305\191\128 \242\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000A\131h|\001\128\193\001\240\192\018B:8z\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016`\218\031\000`0@|0\004\144\142\142\030\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\0246\135\192\024\012\016\031\012\001$#\163\135\161b\128\000L\bx\214\254\000\131\200\000\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\006\r\161\240\006\003\004\007\195\000I\b\232\225\232X\160\000\019\002\0305\191\128 \242\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000A\131h|\001\128\193\001\240\192\018B:8z\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016`\218\031\000`0@|0\004\144\142\142\030\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\0246\135\192\024\012\016\031\012\001$#\163\135\161b\128\000L\bx\214\254\000\131\200\000\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\006\r\161\240\006\003\004\007\195\000I\b\232\225\232X\160\000\019\002\0305\191\128 \242\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000A\131h|\001\128\193\001\240\192\018B:8z\022(\000\004\192\135\141o\224\t<\128\b\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\161b\128\000L\bx\214\254\000\131\200\000\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\006\r\161\240\006\003\004\007\195\000I\b\232\225\192\004\0246\135\192\024\012\016\031\012\001$#\163\135\161b\128\000L\bx\214\254\000\131\200\000\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\006\r\161\240\006\003\004\007\195\000I\b\232\225\232X\160\000\019\002\0305\191\128 \242\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000A\131h|\001\128\193\001\240\192\018B:8z\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016`\218\031\000`0@|0\004\144\142\142\030\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\0246\135\192\024\012\016\031\012\001$#\163\135!b\128\000L\bx\214\254\000\131\200\000\128!\192\000A\131h|\001\128\193\001\240\192\018B:8p\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\138\000\0010!\227[\248\002\015 \002\000\135\015\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\192@\000\000\000\000\006\000\174\000\000\000\000\000\000\000!b\224\000\127\tx\246\254|\179\200\000\130%\204\004\000\000\000\000\000@\017 \000\b \002\000\000\000\000\000\000\000\000\001\000\000\128\000\000\000\000\b\000 @\000\000\000\000\006\001\018\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\016\000\000\000\000\000\000\000\000\000\002\002\000\161b\128@L\bx\214\254\000\131\200\000\128)\192\000\000\128\000\000\000\000\000\000\000\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H \000\016\002\006\181\174\128\0000\002\000\b \000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\b\000\004\000\129\141k\160\000\012\000\000\002\b\000\000\003\128\b\000 \128\b\000\000\000\000\128\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H \000\016\002\0065\174\128\0000\000\000\b \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\001\128H|\001\128\192\001\240\192\000\000\b\0160\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000(X\160\000\019\002\0305\191\128 \242\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\001\131h|\001\128\193\001\241\192\002\002:8z\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000`\218\031\000`0@|p\000\128\142\142\030\000\001\187h\252\003\192\201\225\241\192\002\138:8p\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bX\160\000\019\002\0305\191\128 \242\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\0246\135\192\024\012\016\031\028\000 #\163\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\006\000!\240\006\003\000\007\195\000\000\000(@\200X\160\000\019\002\0305\191\128 \242\000 \bp\128\000`\218\031\000`0@|p\000\128\142\142\030\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\0246\135\192\024\012\016\031\028\000 #\163\135\161b\128\000L\bx\214\254\000\131\200\000\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\006\r\161\240\006\003\004\007\199\000\b\b\232\225\232X\160\000\019\002\0305\191\128 \242\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\001\131h|\001\128\193\001\241\192\002\002:8z\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000`\218\031\000`0@|p\000\128\142\142\030\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\0246\135\192\024\012\016\031\028\000 #\163\135\161b\128\000L\bx\214\254\000\131\200\000\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\006\r\161\240\006\003\004\007\199\000\b\b\232\225\232X\160\000\019\002\0305\191\128 \242\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\001\131h|\001\128\193\001\241\192\002\002:8z\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000`\218\031\000`0@|p\000\128\142\142\030\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\0246\135\192\024\012\016\031\028\000 #\163\135\161b\128\000L\bx\214\254\000\131\200\000\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\006\r\161\240\006\003\004\007\199\000\b\b\232\225\232X\160\000\019\002\0305\191\128 \242\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\001\131h|\001\128\193\001\241\192\002\002:8z\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000`\218\031\000`0@|p\000\128\142\142\030\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\0246\135\192\024\012\016\031\028\000 #\163\135\161b\128\000L\bx\214\254\000\131\200\000\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\006\r\161\240\006\003\004\007\199\000\b\b\232\225\232X\160\000\019\002\0305\191\128$\242\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\0246\135\192\024\012\016\031\028\000 #\163\135\128\000`\218\031\000`0@|p\000\128\142\142\030\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\0246\135\192\024\012\016\031\028\000 #\163\135\161b\128\000L\bx\214\254\000\131\200\000\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\006\r\161\240\006\003\004\007\199\000\b\b\232\225\232X\160\000\019\002\0305\191\128 \242\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\001\131h|\001\128\193\001\241\192\002\002:8z\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000`\218\031\000`0@|p\000\128\142\142\028\004\000\000\000\000\000 \000\160\000\000\000\000\000\000\002\022(\000\004\192\135\141o\224\b<\128\b\002\028 \000\024\004\135\192\024\012\000\031\012\000\000\000\129\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\000\002\000\000\000\000\000\000\000\000\000\002\000\000!b\128\bL\bx\214\254\000\131\200\000\128!\192\000\001\128(|\001\128\192\001\240\192\000\000(\0160\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\n\031\000`0\000|0\000\000\n\004\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\003\b\002\004\000\000\024\007h\000\000\b\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\128 @\000\017\128v\128\000\000\128\b\000\000\000@\000\000\000\000\006\001\018\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\000\000@\000\000\000\000\000\000\000\000\000\b\b\000\002\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\128\000\128\000\000\000\000\000\000\000\000\000\000\000\000\002\000\002\000\000\012 \b\018\000\000`\029\160\000\000 \002\000\000\0000\128 @\000\001\128v\128\000\000\128\b\000\0000\000\0006\000\000\000\000\016\000\000\000 *\002\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012 \b\016\000\000`\029\160\000\000 \002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\002\002\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\000\r\128\000\001\000\004\000\000\000\b(\128\129\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\000\r\128\000\000\000\004\000\000\000\b(\128\129\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\000\000\216\000\000\016\000@\000\000\000\130\136\b\016\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\000\000\216\000\000\016\000@\000\000\000\130\136\b\016\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\002\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\000\r\128\000\000\000\004\000\000\000\b(\128\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\000\000\216\000\000\000\000@\000\000\000\128\136\b\016\002\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\003\000\000\003`\000\000@\001\000\000\000\002\n  @\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\004\000\000\000\000\000`\017 \000\000\000\002\000\000\012\000\000\r\128\000\000\000\004\000\000\000\b\b\128\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\024\004H\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\004\000\000\000\000\000\000\000\000\000\000\192\128\000\194\000\129\000\000\006\001\218\000\000\002\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\016\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bX\160\000\019\002\0305\191\128 \242\000 \bp\128\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bX\160\004\019\002\0305\191\128 \242\002 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000@\000\000\b\000\002\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\128\b\000\000\b\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bX\160\000\019\002\0305\191\128 \242\000 \bp\128\000`\n\031\000`0\000|0\000\000\n\004\014\000\002\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!b\128\000L\bx\214\254\000\131\200\000\128!\192\000\000\002\000\000\000\000\000\000\000\000\000\000 \000\000\016\000\000\000\000\000\128\000\000\000\000\000\128\000\000\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\128\000\000\b\000\000\000\000\000\000\000\000\000\b\128\000\133\138\000\0010!\227[\248\002\015 \002\000\135\b\000\006\000\161\240\006\003\000\007\195\000\000\000\160@\224\000\000\002\000\000\000\000\000\000\000\000\000\002\000\000\129\000\000\b\000\000\b\000\000\000\000\000\b\000\000\000\004\000\000\000\000\000 \000\000\000\000\000\000\000\000\b\000\000\000\128\000\000\000\000\000\000\000\000\000\136\000\bX\160\000\019\002\0305\191\128 \242\000 \bp\128\000`\n\031\000`0\000|0\000\000\n\004\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\b\000\000\000\000\128\000\000\000\000\000\128\000\000 \000\000\002\000\000\000\000\000\000\000\000\000\002 \000!b\128\000L\bx\214\254\000\131\200\000\128!\194\000\001\128(|\001\128\192\001\240\192\000\000(\0160\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000 \000\000\000\000\000\000\000\000\b\000\000\b\128\000\000\000\000\000\000\000\000\000\136\000\bX\160\000\019\002\0305\191\128 \242\000 \bp\128\000`\138\031\000`0\000|0\000\000\n\004\014\000\000\002 \000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 @\000\002\000\000\002\000\000\000\000\000\002\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\002\000\000\002 \000\000\000\000\000\000\000\000\000\"\000\002\022(\000\004\192\135\141o\224\b<\128\b\002\028 \000\024\"\135\192\024\012\000\031\012\000\000\002\129\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\002 \000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\b\000\000\000\000\000\000\000\000\000\b\000\002\000\002\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\128\000\004\000\000\000\000\000 \000\000\000\000\000 \000\000\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000 \000\000\"\000\000\000\000\000\000\000\000\000\002 \000!b\128\000L\bx\214\254\000\131\200\000\128!\194\000\001\130(|\001\128\192\001\240\192\000\000(\0168\000\000\b\128\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\002 \000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!b\128\000L\bx\214\254\000\131\200\000\128!\194\000\001\130(|\001\128\192\001\240\192\000\000(\0160\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 @\000\002\000\000\002\000\000\000\000\000\002\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\002\000\000\002 \000\000\000\000\000\000\000\000\000\"\000\002\022(\000\004\192\135\141o\224\b<\128\b\002\028 \000\024\"\135\192\024\012\000\031\012\000\000\002\129\003\128\000\000\136\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\"\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000`\018\031\000`0\000|0\000\000\002\004\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\006\237\163\240\015\003'\135\199\000((\232\225\200X\160\000\019\002\0305\191\128 \242\000 \bp\128\000`\218\031\000`0@|p\000\128\142\142\028\004\000\000\000\000\000 \000\160\000\000\000\000\000\000\002\022(\000\004\192\135\141o\224\b<\128\b\002\028 \000\024\004\135\192\024\012\000\031\012\000\000\000\129\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\001\187h\252\003\192\201\225\241\192\n\n:8r\022(\000\004\192\135\141o\224\b<\128\b\002\028 \000\0246\135\192\024\012\016\031\028\000 #\163\135!b\128\000L\bx\214\254\000\131\200\000\128!\192\000\000\000 \000\000\000\000\000\000\000\000\000 \000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000 \000\027\182\143\192<\012\158\031\028\000\160\163\163\135!b\128\000L\bx\214\254\000\131\200\000\128!\194\000\001\131h|\001\128\193\001\241\192\002\002:8x\000\006\237\163\240\015\003'\135\199\000((\232\225\200X\160\000\019\002\0305\191\128 \242\000 \bp\128\000`\218\031\000`0@|p\000\128\142\142\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\016\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bX\160\000\019\002\0305\191\128 \242\000 \bp\128\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bX\160\004\019\002\0305\191\128 \242\002 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000@\000\000\b\000\002\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\128\b\000\000\b\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\002\031\000`0\000|0\000\000\n\004\012\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\006\004!\240\006\003\000\007\195\000\000\000 @\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255!b\128\000L\bx\214\254\000\131\200\000\128!\194\000\001\130h|\001\128\192\001\240\192\002\000\b\01602\b\"\000`\019\128N\224\000\r\000\b\002\b\000\200 \136\001\000\014\001;\128\0004\000 \b \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\130\b\000\016\000\224\019\184\000\003@\002\000\130\000\000\000\000\000\000\000\000\000\000\000\000 \000\024\"\000\194\000\129\000\000\006\001\218\000\000\002\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\133\138\000\0010!\227[\248\002\015 \002\000\135\015\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\192\000\000\000\000\000\004\000\000\000\000\000\128\001`\136\003\168\130@\004\0018\004\238\000\000\208\002\128 \128\000\000\000\000\000\000\000\000 \000\000\b\000\002\000\000\000\000\000\000\000\000\000\000\128\000\000 \000\000\000\bX\160\000\019\002\0305\191\128 \242\000 \bp\128\000`\154\031\000`0@|0\000\128\130\004\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\234 \144\001\000N\001;\128\0004\000 \b \000\000\000\000\000\000\000\000\b\000\000\002\000\000\128\000\000\000\000\000\000\000\000\000 \000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\b\000\002\000\000\000\000\000\000\000\000\000\000\128\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\b\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000 \000\b\000\000\000\000\000\000\000\000\000\002\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014 \b\016\000\004`\029\160\000\000 \002\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\0000\128 @\000\001\128v\128\000\000\128\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000!b\128\000L\bx\214\254\000\131\200\000\128!\195\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\240\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\194\000\129\000\000\006\001\218\000\000\002\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\133\138\000\0010!\227[\248\002\015 \002\000\135\015\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\192\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000!b\128\000L\bx\214\254\000\131\200\000\128!\195\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\240\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\128!b\128\000L\bx\214\254\000\131\200\000\128!\195\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\240\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000}\247\016 \129\251\012\000\005\131\143pq`Pr\135\138\000I:%\243{\248\n\015\224\002\003\135\000\018\b\000\004\000\129\141k\160\000\012\000\000\002\b \000\027\166\143\192<\012\142\031\012\000 \128\129\003!b\128\000L\bx\214\254\000\131\200\000\128!\194\000\001\128H|\001\128\192\001\240\192\000\000\b\0160\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\002\000\n\000\000\000\000\000\000\000!b\128\000L\bx\214\254\000\131\200\000\128!\194\000\001\128H|\001\128\192\001\240\192\000\000\b\0160\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bX\160\000\019\002\0305\191\128 \242\000 \bp\000\000\000\b\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\016\004H\000\002\b\000\128\000\000\020\000\001\000\000\000@\017 \000\b \002\000\000\002\022(\000\004\192\135\141o\224\b<\128\b\002\028 \000\024\016\135\192\024\012\000\031\012\000\000\001\161\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\004\000\000\000\000\004`\017 \000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\006\001\018\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\004\000\000\000\000\004`\017 \000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\006\001\018\000\000\000\000 \000\000\000\000\000@\000\000\000\000\000\000\000\000\000\012\000\000\004\000\000\000\000\004`\017 \000\000\000\002\000\000\000\016\000\000\000\000\001\128D\128\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\135\138\000!:%\243{\248\n\015\224\002\001\135\000\000\000\000\000 \001\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\004\000\002\000\000\000\000\000\000\000\001 \128\000@\b\024\214\186\000\000\192\000\000 \130\000\001\186h\252\003\192\200\225\240\192\002\136\b\0162\022(\000\004\192\135\141o\224\b<\128\b\002\028 \000\024&\135\192\024\012\000\031\012\000 \000\129\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \001\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\128\003 \130\000\004\0008\004\238\000\000\208\000\128 \128@\000\000\000\000\000\000\000\000\000\000\016\000\000\b\002\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\024\000\135\192\024\012\000\031\012\001\000\000\129\003\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\133\138\000\0010!\227[\248\002\015 \002\000\135\b\000\006\r\161\240\006\003\004\007\199\000\b\b\232\225\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000`\154\031\000`0\000|0\000\128\002\006\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\012\130\b\000\016\000\224\019\184\000\003@\002\000\130\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000 \bX\160\000\019\002\0305\191\128 \242\000 \bp\000\016`\002\031\000`0\000|0\000\016\002\004\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bX\160\000\019\002\0305\191\128 \242\000 \bp\000\000`B\031\000`0\000|0\000\000\002\004\012\004\130\000\001\000 cZ\232\000\003\000\000\000\130\b\000\006\233\163\240\015\003#\135\195\000\b  @\192\000\000\000\000\000\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\012 \b\016\000\000`\029\160\000\000 \002\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\128\152\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\000\000\000\016\000 \000\000@\000\001\000\002\000\000\002`\000\000@\001 \000\000\n\002\002\b\000\018\000\000\000\000\001\000\002\000\000\004\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\002`\000\000@\001 \000\000\n\002\002\b\000\018\000\000\000\000\001\000\002\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\002\000\000\002`\000\000@\001 \000\000\n\002\002\b\000\018\000\000\000\000\001\000\002\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\002\000\000\002`\000\000@\001 \000\000\n\002\002\b\000\018\000\000\000\000\001\000\002\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\152\000\000\016\000H\000\000\002\128\128\130\000\004\128\000\000\000\000@\000\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000&\000\000\004\000\018\000\000\000\160  \128\001 \000\000\000\000\016\000 \000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\b\000\bX\160\000\019\002\0305\191\128 \242\000 \bp\128\000`\154\031\000`0\000|0\000\128\002\004\012\012\000\b\016\000\000`\029\160\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\bX\160\000\019\002\0305\191\128 \242\000 \bp\128\000`\154\031\000`0\000|0\000\128\002\004\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\136\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\128\000\000 \000\000\000\000\000\000\001\001\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000D\004\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\002\000\000\000\003\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\240\128\000\000\000\000 \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\0000\128 @\000\001\128v\128\000\000\128\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\194\000\129\000\000\006\001\218\000\000\002\000 \000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\002\000\000\0020\000\000\000\000\000\000\000\016\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\003\b\002\004\000\000\024\007h\000\000\b\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\0000\128 @\000\001\128v\128\000\000\128\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\004H\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\r\128\000\001\000\004\000\000\000\b\b\000\001\000\194\000\129\000\000\006\001\218\000\000\002\000 \000\000\000\000\000@\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\002\001\018\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\240\128\000\000\000\000 \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\0000\128 @\000\001\128v\128\000\000\128\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\003\b\002\004\000\000\024\007h\000\000\b\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\012 \b\016\000\000`\029\160\000\000 \002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\002\001\018\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\247\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\192\194\000\129\000\000\006\001\218\000\000\002\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\012 \b\016\000\000`\029\160\000\000 \002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\b\002\004\000\000\024\007h\000\000\b\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\"`\000\000\002\000 \000\000\000\b\000\000\b\000\000\000\000\002\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\012 \b\016\000\000`\029\160\000\000 \002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\0000\128 @\000\001\128v\128\000\000\128\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\004H\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002`\000\000@\001 \000\000\n\002\000\000@0\128 @\000\001\128v\128\000\000\128\b\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\004H\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\128 @\000\001\128v\128\000\000\128\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\247\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\128\000\000\000\000\000\000\000\000\000\000\000\031\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012 \b\016\000\000`\029\160\000\000 \002\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\194\000\129\000\000\006\001\218\000\000\002\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\128 @\000\001\128v\128\000\000\128\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\016\000\002&\000\000\000 \002\000\000\000\000\128\000\000\128\000\000\000\000 \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\194\000\129\000\000\006\001\218\000\000\002\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\003\b\002\004\000\000\024\007h\000\000\b\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\128D\128\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\b\002\004\000\000\024\007h\000\000\b\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\252\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\"\000\000\000\000\000\000\000\000\000\000\000\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\252\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\004H\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\152\000\000\000\000@\000\000\000\128\128\000\016 \000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\b\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000&\000\000\000\000\016\000\000\000  \000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\128\000\000 \000\b\000\000\234 \145\001\000N\001;\128\0004\000\160\b \000\000\000\000\000\000\000\000\b\000\000\002\000\000\128\000\004\000\000\000\000\000`\017 \000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\004\000\000\000\000\000`\017 \000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\128\000\000\000\127\255\255\255\255\255\255\255\255\255\255\255\255\255\255\252 \000\000\000\000\b \000\000\000\000\000\000\000\004\000\000\000\000\000\000 \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\012 \b\016\000\000`\029\160\000\000 \002\000\000\000\000\000\b\128\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b \000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\012 \b\016\000\000`\029\160\000\000 \002\000\000\000\000\000\b\128\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\018\000\002\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\024\"\135\192\024\012\000\031\012\000\000\000\129\003\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\006\b\161\240\006\003\000\007\195\000\000\000 @\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000`\017 \000\b \002\001\000\000\016\000\000\000\000\001\128D\128\000 \128\b\004\000?\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\003 \130 \006\0008\004\238\000\000\208\000\128 \128\012\130\b\128\016\000\224\019\184\000\003@\002\000\130\0002\b \000@\003\128N\224\000\r\000\b\002\b\000\000\000\000\000\000\000\000\000\000\000\000\128\000`\136\003\b\002\004\000\000\024\007h\000\000\b\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\002\022(\000\004\192\135\141o\224\b<\128\b\002\028\031\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\000\000\000\000\000\000\016\000\000\000\000\002\000\005\130 \014\162\t\000\016\004\224\019\184\000\003@\n\000\130\000\000\000\000\000\000\000\000\000\128\000\000 \000\b\000\000\000\000\000\000\000\000\000\002\000\000\000\128\000\000\000!b\128\000L\bx\214\254\000\131\200\000\128!\192\000\001\130(|\001\128\193\001\240\192\002\002\b\024p\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\168\130@\004\0018\004\238\000\000\208\000\128 \128\000\000\000\000\000\000\000\000 \000\000\b\000\002\000\000\000\000\000\000\000\000\000\000\128\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\b\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000 \000\b\000\000\000\000\000\000\000\000\000\002\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\128\000 \000\000\000\000\000\000\000\000\000\b\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0008\128 @\000\017\128v\128\000\000\128\b\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\012 \b\016\000\000`\029\160\000\000 \002\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\bX\160\000\019\002\0305\191\128 \242\000 \bp\127\255\255\255\255\255\255\255\255\255\255\255\255\255\255\252\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\0000\128 @\000\001\128v\128\000\000\128\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000!b\128\000L\bx\214\254\000\131\200\000\128!\193\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\240\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\bX\160\000\019\002\0305\191\128 \242\000 \bp\127\255\255\255\255\255\255\255\255\255\255\255\255\255\255\252\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000 \bX\160\000\019\002\0305\191\128 \242\000 \bp\127\255\255\255\255\255\255\255\255\255\255\255\255\255\255\252\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\b\000\004\000\129\141k\160\000\012\000\000\002\b \000\003\162\b\000$\000\142\000\000\000\000\128\000\000\001\000\000\000\000\000\024\004H\000\002\b\000\128A\000\004\000\000\000\000\000`\017 \000\b \002\001\000\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000 \000\0006\000\000\004\000\016\000\000\000   \012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\003\168\130@\004\0018\004\238\000\000\208\002\128 \128\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\016\000\000\000\000\001\128D\128\000 \128\b\004\000 \000\0006\000\000\004\000\150\000\000\000   \012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\006\001\018\000\000\130\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\162\t\000\016\004\224\019\184\000\003@\002\000\130\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000@\000\000\000\000\006\001\018\000\000\130\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\001\000\000\000\000\000\024\004H\000\002\b\000\128@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\004\000\000\000\000\000`\017 \000\b \002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\"\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\194\000\129\000\000\006\001\218\000\000\002\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\137\128\000\004\b\001\128\000\000\000 \000  \000\000\000\000\b \000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200 \136\001\128\014\001;\128\0004\000 \b \003 \130 \004\0008\004\238\000\000\208\000\128 \128\012\130\b\000\016\000\224\019\184\000\003@\002\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H \000\016\002\0065\174\128\0000\000\000\b \128\000\014\136 \000\144\0028\000\000\000\002\000\000\000\004\000\000\000\000\000`\017 \000\b \002\001\004\000\016\000\000\000\000\001\128D\128\000 \128\b\004\000 \000\000\"\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012 \b\016\000\000`\029\160\000\000 \002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000\000\000\000\000\000\000\001\000 \000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\003\b\002\004\000\000\024\007h\000\000\b\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\128\000\000 \000\b\000\000\226\000\129\000\000\006\001\218\000\000\002\000 \000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\0000\128 @\000\001\128v\128\000\000\128\b\000\000\000\000\000\000\000\000\000\000\002\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\132\000\000\137\128\000\000\b\001\128\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\128\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\200 \128\001\000\014\001;\128\0004\000 \b \128\000\000\136\000\000\000\000\000\000\000\000\000\000\002\002\000\000\002 \000\000\000\000\000\000\000\000\000\000\000\015\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\015\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\192\000\000\"\000\000\000\000\016\000\000\000  \000\132\003 \130\000\004\0008\004\238\000\000\208\000\128 \128\000\000\002 \000\000\000\001\000\000\000\002\002\000\b@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\200 \128\001\000\014\001;\128\0004\000 \b \000\000\000\136\000\000\000\000@\000\000\000\128\128\002\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\224\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\004\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000`\017 \000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000@\000\000\000\000\006\001\018\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\001\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\024\004H\000\000\000\000\128\000\002\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\254\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \128\000@\b\024\214\186\000\000\192\000\000 \128\000\000: \128\002@\b\224\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\024\004H\000\002\b\000\128A\000\004\000\000\000\000\000`\017 \000\b \002\001\000\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\"\000\000\004\000\016\000\000\000  \000\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\003\168\130@\004\0018\004\238\000\000\208\002\128 \128\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\016\000\000\000\000\001\128D\128\000 \128\b\004\000\000\000\000\"\000\000\004\000\150\000\000\000  \000\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\006\001\018\000\000\130\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\162\t\000\016\004\224\019\184\000\003@\002\000\130\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000@\000\000\000\000\006\001\018\000\000\130\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\001\000\000\000\000\000\024\004H\000\002\b\000\128@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\004\000\000\000\000\000`\017 \000\b \002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\"\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\194\000\129\000\000\006\001\218\000\000\002\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\137\128\000\004\b\001\128\000\000\000 \000  \000\000\000\000\b \000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H \000\016\002\0065\174\128\0000\000\000\b \000\000\014\136 \000\144\0028\000\000\000\002\000\000\000\004\000\000\000\000\000`\017 \000\b \002\001\004\000\016\000\000\000\000\001\128D\128\000 \128\b\004\000\000\000\000\"\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012 \b\016\000\000`\029\160\000\000 \002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000\000\000\000\000\000\000\001\000 \000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\003\b\002\004\000\000\024\007h\000\000\b\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\128\000\000 \000\b\000\000\226\000\129\000\000\006\001\218\000\000\002\000 \000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\0000\128 @\000\001\128v\128\000\000\128\b\000\000\000\000\000\000\000\000\000\000\002\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\247\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\193\000\000\"`\000\000\002\000`\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000 \000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\1282\b \000@\003\128N\224\000\r\000\b\002\b\000\000\000\"\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\136\000\000\000\000\000\000\000\000\000\000\000\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\240\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\240\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\255\255\255\255\255\255\255\255\255\255\255\255\255\255\252\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\006\001\018\000\000\130\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\128\000 \000\000\000\000\000\000\000\004\000\000\000\000\002\000\000\128\000\000\000\000\014\162\t\000\016\004\224\019\184\000\003@\002\000\130\000\000\000\000\000\000\000\000\000\128\000\000 \000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\b\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000 \000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\b\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\128\000\000 \000\b\000\000\234 \144\001\000N\001;\128\0004\000\160\b \000\000\000\000\000\000\000\000\b\000\000\002\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000:\136$\000@\019\128N\224\000\r\000\b\002\b\000\000\000\000\000\000\000\000\002\000\000\000\128\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\128\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\128\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\002\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000&\000\000\000\000\016\000\000\000  \000\004\b\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\t\128\000\000\000\004\000\000\000\b\b\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!b\128\000L\bx\214\254\000\131\200\000\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\b\000\004\000\129\141k\160\000\012\000\000\002\b \000\027\166\143\192<\012\142\031\012\000 \128\129\003\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\254\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\024&\135\192\024\012\000\031\012\000 \000\129\003\161b\128\000L\bx\214\254\000\131\200\000\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\006\t\161\240\006\003\000\007\195\000\b\000 @\200X\160\000\019\002\0305\191\128 \242\000 \bp\000\000`\002\031\000`0\000|0\000\000\002\132\012\133\138\000\0010!\227[\248\002\015 \002\000\135\b\000\006\t\161\240\006\003\000\007\195\000\b\000 @\232X\160\000\019\002\0305\191\128 \242\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\001\130h|\001\128\192\001\240\192\002\000\b\016:\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000`\154\031\000`0\000|0\000\128\002\004\014\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\024&\135\192\024\012\000\031\012\000 \000\129\003\161b\128\000L\bx\214\254\000\131\200\000\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\006\t\161\240\006\003\000\007\195\000\b\000 @\232X\160\000\019\002\0305\191\128 \242\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\001\130h|\001\128\192\001\240\192\002\000\b\016:\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000`\154\031\000`0\000|0\000\128\002\004\014\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\024&\135\192\024\012\000\031\012\000 \000\129\003\161b\128\000L\bx\214\254\000\131\200\000\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\006\t\161\240\006\003\000\007\195\000\b\000 @\232X\160\000\019\002\0305\191\128 \242\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\001\130h|\001\128\192\001\240\192\002\000\b\016:\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000`\154\031\000`0\000|0\000\128\002\004\014\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\024&\135\192\024\012\000\031\012\000 \000\129\003\161b\128\000L\bx\214\254\000\131\200\000\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\006\t\161\240\006\003\000\007\195\000\b\000 @\232X\160\000\019\002\0305\191\128 \242\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\001\130h|\001\128\192\001\240\192\002\000\b\016:\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000`\154\031\000`0\000|0\000\128\002\004\014\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\024&\135\192\024\012\000\031\012\000 \000\129\003\161b\128\000L\bx\214\254\000\147\200\000\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000`\154\031\000`0\000|0\000\128\002\004\014\000\001\130h|\001\128\192\001\240\192\002\000\b\016:\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000`\154\031\000`0\000|0\000\128\002\004\014\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\024&\135\192\024\012\000\031\012\000 \000\129\003\161b\128\000L\bx\214\254\000\131\200\000\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\006\t\161\240\006\003\000\007\195\000\b\000 @\232X\160\000\019\002\0305\191\128 \242\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\001\130h|\001\128\192\001\240\192\002\000\b\0160\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bX\160\000\019\002\0305\191\128 \242\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\002`\000\000\000\000\000\000\000\002\000\000\000\n\030(\001\132\232\151\205\239\224(?\136\b\006\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\006\233\163\240\015\003#\135\195\000\b  @\200X\160\000\019\002\0305\191\128 \242\000 \bp\128\000`\018\031\000`0\000|0\000\000\002\004\014\000\001\186h\252\003\192\200\225\240\192\n\b\b\0162\022(\000\004\192\135\141o\224\b<\128\b\002\028 \000\024&\135\192\024\012\000\031\012\000 \000\129\003\001\000\000\000\000\000\b\000(\000\000\000\000\000\000\000\133\138\000\0010!\227[\248\002\015 \002\000\135\b\000\006\001!\240\006\003\000\007\195\000\000\000 @\224\000\027\166\143\192<\012\142\031\012\000\160\128\129\003!b\128\000L\bx\214\254\000\131\200\000\128!\194\000\001\130h|\001\128\192\001\240\192\002\000\b\0162\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\000\002\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\002\000\001\186h\252\003\192\200\225\240\192\n\b\b\0162\022(\000\004\192\135\141o\224\b<\128\b\002\028 \000\024&\135\192\024\012\000\031\012\000 \000\129\003\128\000n\154?\000\24028|0\002\130\002\004\012\133\138\000\0010!\227[\248\002\015 \002\000\135\b\000\006\t\161\240\006\003\000\007\195\000\b\000 @\192\000\000\000\000\000\004\000\002\000\000\000\128\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\b\000\002\000\000\016\000\000\000\000\001\000D\128\000 \128\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\152\000\000\016\000H\000\000\000\128\128\000\016\020\000\001\000\000\000@\017 \000\b \002 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\016\000\000\004\000\002\000\000\000\000\002 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000`\017 \000\000\000\002\000\000\004\000\000\004\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\216\000\000\016\000H\000\000\000\130\136\128\016\000\000\001\000\000\000\000\000\000\000\000\000\000 \000\000P\000\004\000\000\001\000D\128\000 \128\b\000\000\000\000\000\016\000\000\004\000\002\000\000\000\000\002 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\128\000\004\000\000\000\000\000`\016 \000\000\000\000\000\000\0000\000\000\000\000\001\128D\128\000\000\000\b\000\0000\000\000\016\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\004\000\000\000\000\000@\017 \000\b \002\000\000\b\000\000\r\128\000\001\000\004\128\000\000\b\b\136\001\000@\000\000\000\000\004\001\018\000\000\130\000 \000\000\128\000\000\216\000\000\016\000H\000\000\000\128\136\128\016\004\000\000\000\000\000`\017 \000\000\000\002\000\000\004\000\000\000\000\000\000\000\000\128\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\002\000\000\000\128\000 \000\128\000\000\152\000\000\000\000@\000\000\000\128\128\000\016\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\128\000\000 \000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\128\000\000 \000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\002`\000\000\000\001\000\000\000\002\002\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\b\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\223\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\002\000\000\002`@\000@\001\000\000\000\n\002\128\000H\000\000\t\129\000\000\000\004\000\000\000(\n\000\001\000H\000\000 \000\004\000\024\000\000\016\000 @\128\001 \000\000\000\000\016\000`\000\000@\000\129\002\000\004\128\000\000\000\000@\001\128\000\001\000\002\004\000\000\018\000\000\000\000\001\000\002\000\000\004\000\000\016\000 \000\000&\000\000\000\000\016\000\000\000  \000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\018\000\000\000\000\001\000\006\000\000\004\000\b\016\000\000H\000\000\000\000\004\000\b\000\000\016\000\000@\000\128\000\000\152\000\000\000\000@\000\000\000\128\128\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\t\128\000\000\000\004\000\000\000\b\b\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\152\000\000\000\000@\000\000\000\128\128\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000&\000\000\000\000\016\000\000\000  \000\128\001 \000\000\000\000\016\000`\000\000@\000\129\000\000\004\128\000\000\000\000@\000\128\000\001\000\000\004\000\b\000\000\t\128\000\000\000\004\000\000\000\b\b\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\001 \000\000\000\000\016\000`\000\000@\000\129\000\000\004\128\000\000\000\000@\000\128\000\001\000\000\004\000\b\000\000\t\128\000\000\000\004\000\000\000\b\b\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\152\000\000\000\000@\000\000\000\128\128\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000&\000\000\000\000\016\000\000\000  \000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\004\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\001\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\001 \000\000\128\000\016\000`\000\000@\000\129\002\000\004\128\000\000\000\000@\001\128\000\001\000\002\004\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000@\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\002`\000\000\000\000\000\000\000\002\b\000\000\000\024\000\002\000\000\000\128\000\000\000\000\000\000\000\000\000@\000\000\000\016\002\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\003\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\240\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003 \130 \006\0018\004\238\000\000\208\000\128 \128\012\130\b\128\016\000\224\019\184\000\003@\002\000\130\0002\b \000@\003\128N\224\000\r\000\b\002\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\016\004H\000\002\b\000\128\000\003\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\240\000\000\000\000\000\001\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\003\b\002\004\000\000\024\007h\000\000\b\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\000\000\000\016\000 \000\000@\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\136\000\000\000\000\000\128\000\000\000\000\000\000\000\000\002\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\128\000\000\152\000\000\000\000@\000\000\000\128\128\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\t\128\000\000\000\004\000\000\000\b\b\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\252\000\000\000\000\000\000@\000 \000\000\b\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\002\000\000\000\128\000 \000\128\000\000\152\000\000\000\000@\000\000\000\128\128\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\030(\000\004\232\151\205\239\224(?\128\b\006\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\002`\000\000\000\001\000\000\000\002\002\000\000@2\b \000@\003\128N\224\000\r\000\b\002\b \000\000&\000\000\000\000\016\000\000\000  \000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\012\130\b\000\016\000\224\019\184\000\003@\002\000\130\b\000\000\t\128\000\000\000\004\000\000\000\b\b\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\030(\000\004\232\151\205\239\224(?\128\b\006\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\135\138\000a:%\243{\248\n\015\226\002\001\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\001\000\000\000@\000 \000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\006\001\018\000\000\000\000 \000\000\192\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\252\014 \bP\002\004p=\160\b\000\224\002\001\000\000\016\000\000\000\000\001\128D\128\000\000\000\b\000\000\016\000\000&\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\0000\128 @\000\001\128v\128\000\000\128\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\002`\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128\000\000\000\000@\000\128\000\001\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002 \000\000\000\000\002\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\128\000\000 \000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\128\000\000\000\001\000\000\000\000\000\b\004H\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\152\000\000\000\000@\000\000\000\128\128\000\016 \000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\b\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000&\000\000\000\000\016\000\000\000  \000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\001\000\000\000\000\000\024\004H\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\128\000\000\000\004\000\000\000\b\b\000\001\002\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\128\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002`\000\000\000\001\000\000\000\002\002\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\152\000\000\000\000\000\000\000\000\128\000\000\000\002\000\000`\002\004\016!\000\b\000\194\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\128\000\000 \000\b\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\152\000\000\000\000\000\000\000\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\b\000\000@\000\000\000\000\006\001\018\000\000\000\000 \000\000@\000\000\152\000\000\000\000@\000\000\000\128\128\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000 \000\000\000\000\152\000\000\000\000@\000\000\000\128\128\000\016\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002`\000\000\000\001\000\000\000\002\002\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\152\000\129\004\b\000\002\0000\128\000@\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\240\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000&\004\000\004\000\016\000\000\000\160(\000\004\000\000\000\152\016\000\000\000@\000\000\002\128\160\000\016\004\128\000\002\000\000@\001\128\000\001\000\002\004\b\000\018\000\000\000\000\001\000\006\000\000\004\000\b\016 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\004\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\004\128\000\002\000\000@\001\128\000\001\000\002\004\b\000\018\000\000\000\000\001\000\006\000\000\004\000\b\016 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\128\000\000\000\000\000\000\000\b \000\000\000`\000\b\000\000\002\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\002`\000\000\000\000 \000\000\n\000\000\000\000\016\000\000\000\000\001\128D\128\000\000\000\b\000\000\016\000\000&\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\003\b\002\004\000\000\024\007h\000\000\b\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\001\128D\128\000\000\000\b\000\000\016\000\000&\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\0000\128 @\000\001\128v\128\000\000\128\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\000\000\001\000\002\000\000\004\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\128\000\000\000\000\b\000\000\000\000\000\000\000\000\000 \000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\t\128\000\000\000\004\000\000\000\b\b\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\152\000\000\000\000@\000\000\000\128\128\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\128\000\000 \000\b\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\152\000\000\000\000\000\000\000\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\b\000\000\000\000&\000\000\000\000\016\000\000\000  \000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0008\128)@\b\017\192\242\128 \003\128\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000n\146?\000\24028|0\004\002\002\004\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\bX\160\000\019\002\0305\191\128 \242\000 \bp\000\000`\018\031\000`0\000|0\000\000\002\004\012\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000`\017 \000\000\000\002\000\000\012\000\000\b\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\012 \b\016\000\000`\029\160\000\000 \002\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128\000\000\000\000@\000\128\000\001\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002 \000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000@\000\000\000\000\006\001\018\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\002 \000\000\000\001\000\000\000\000\002\000\000@\128\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016 \000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\136\000\000\000\000@\000\000\000\000\128\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\"\000\000\000\000\000\000\000\000\000\000\000\000\128\128\000\b\000\129\004\b@\002\0000\000\128@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000 \000\000\b\000\002\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\"\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\002\000\000\016\000\000\000\000\001\128D\128\000\000\000\b\000\0000\000\000\"\000\000\000\000\016\000\000\000\000 \000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\b\000 \000\000\"\000\000\000\000\016\000\000\000\000 \000\004\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\136\000\000\000\000@\000\000\000\000\128\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000  \000\"\000 A\002\000\000\128\012\000\000\016\000\127\255\255\255\255\255\255\255\255\255\255\255\255\255\255\252\004\000\000\000\000\000 \000\000\000\000\000\000\000\000\b\000\000\b\129\000\001\000\004\000\000\000 \n\000\001 \000\000\"\004\000\000\000\016\000\000\000\128(\000\004\001 \000\000\128\000\016\000`\000\000@\000\129\002\000\004\128\000\000\000\000@\001\128\000\001\000\002\004\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000@\000@\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000H\000\000 \000\004\000\024\000\000\016\000 @\128\001 \000\000\000\000\016\000`\000\000@\000\129\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\000\002\000\000\000\128\000\000\000\000\000\000\000\000\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\128\000\000\136\000\000\000\000\b\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\003\b\002\004\000\000\024\007h\000\000\b\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\001\128D\128\000\000\000\b\000\0000\000\000\"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\0000\128 @\000\001\128v\128\000\000\128\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\000\000\001\000\002\000\000\004\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\128\000\000\000\000\b\000\000\000\000\000\000\000\000\002\000\000\002 \000\000\000\001\000\000\000\000\002\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\002\000\000\000\128\000 \000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\002 \000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000 \000\128\000\000\136\000\000\000\000@\000\000\000\000\128\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000\001\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\002\000\000\192\000\000\216\000\000\000\000@\000\000\004\128\136\b\016\012\000\001\000\000\000`\017 \000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\016\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000 \000\0000\000\004\000\000\001\128D\128\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\128\000\016\000\0006\000\000\000\000\018\000\000\001\160#\002\004\000\000\000@\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\b\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\001\000\000\000\000\000\016\004H\000\002\b\000\128\000\000\000\000\003\000\000\000@\001 \000\000\002\002\"\000H\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000 \000\000\000@\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!b\128\000L\bx\214\254\000\131\200\000\128!\194\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!b\128\016L\bx\214\254\000\131\200\b\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\001\000\000\000 \000\b\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\002\000 \000\000 \000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\027\182\143\192<\012\158\031\028\000(\163\163\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\001\131h|\001\128\193\001\241\192\002\002:8p0\000 @\000\001\128v\128\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000!b\128\000L\bx\214\254\000\131\200\000\128!\194\000\001\131h|\001\128\193\001\241\192\002\002:8x\000\006\001!\240\006\003\000\007\195\000\000\000 @\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016n\218?\000\2402x|0\006\146\142\142\028\133\138\000\0010!\227[\248\002\015 \002\000\135\000\001\006\r\161\240\006\003\004\007\195\000I\b\232\225\192@\000\000\000\000\002\000\n\000\000\000\000\000\000\000!b\128\000L\bx\214\254\000\131\200\000\128!\194\000\001\128H|\001\128\192\001\240\192\000\000\b\0160\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\027\182\143\192<\012\158\031\012\001\164\163\163\135!b\128\000L\bx\214\254\000\131\200\000\128!\192\000A\131h|\001\128\193\001\240\192\018B:8r\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\000\002\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000A\187h\252\003\192\201\225\240\192\026J:8r\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\004\0246\135\192\024\012\016\031\012\001$#\163\135\000\016n\218?\000\2402x|0\006\146\142\142\028\133\138\000\0010!\227[\248\002\015 \002\000\135\000\001\006\r\161\240\006\003\004\007\195\000I\b\232\225\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016`\002\031\000`0\000|0\000\016\002\004\012\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\006\004!\240\006\003\000\007\195\000\000\000 @\192H \000\016\002\0065\174\128\0000\000\000\b \128\000n\218?\000\2402x|p\000\130\142\142\030\000\001\131h|\001\128\193\001\241\192\002\002:8p\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\168\130@\004\0018\004\238\000\000\208\000\128 \128\000\000\000\000\000\000\000\000 \000\000\016\000\002\000\000\000\000\000\000\000\000\000\000\128\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\b\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000@\000\b\000\000\000\000\000\000\000\000\000\002\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\001\000\000 \000\000\000\000\000\000\000\000\000\b\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\0246\135\192\024\012\016\031\028\000 #\163\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000n\218?\000\2402x|p\000\162\142\142\028\004\130\000\001\000 cZ\232\000\003\000\000\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H \000\016\002\0065\174\128\0000\000\000\b \128\000n\218?\000\2402x|p\000\162\142\142\028\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \128\000@\b\024\214\186\000\000\192\000\000 \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\022(\000\004\192\135\141o\224\b<\128\b\002\028 \000\024\004\135\192\024\012\000\031\012\000\000\000\129\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\128\002\128\000\000\000\000\000\000\bX\160\000\019\002\0305\191\128 \242\000 \bp\128\000`\018\031\000`0\000|0\000\000\002\004\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bX\160\000\019\002\0305\191\128 \242\000 \bp\000\000\000\b\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\138\000\0010!\227[\248\002\015 \002\000\135\b\000\006\r\161\240\006\003\004\007\199\000\b\b\232\225\224\000\024\004\135\192\024\012\000\031\012\000\000\000\129\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\000\000\128\000\000\000\000\000\000\000\000\000\128\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\0246\135\192\024\012\016\031\012\001$#\163\135\003\000\002\004\000\000\024\007h\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\002\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\004\0246\135\192\024\012\016\031\012\001$#\163\135\000\016`\002\031\000`0\000|0\000\016\002\004\012\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\006\004!\240\006\003\000\007\195\000\000\000 @\192H \000\016\002\0065\174\128\0000\000\000\b \000\016n\218?\000\2402x|0\004\146\142\142\028\000\001\129\b|\001\128\192\001\240\192\000\000(\0160\000\000\000\000\000\000\000\000\128\000\000@\000\b\000\000\000\000\000\000\000\000\000\002\000\000\001\000\000\000\000!b\128\000L\bx\214\254\000\131\200\000\128!\192\000A\131h|\001\128\193\001\240\192\018B:8p\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\168\130@\004\0018\004\238\000\000\208\000\128 \128\000\000\000\000\000\000\000\000 \000\000\016\000\002\000\000\000\000\000\000\000\000\000\000\128\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\b\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000@\000\b\000\000\000\000\000\000\000\000\000\002\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\001\000\000 \000\000\000\000\000\000\000\000\000\b\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\b \000@\003\128N\224\000\r\000\b\002\b\004\000\000\000\000\000\000\000\000\000\000\001\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\133\138\000\0010!\227[\248\002\015 \002\000\135\000\001\006\r\161\240\006\003\004\007\195\000I\b\232\225\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016`\218\031\000`0@|0\004\144\142\142\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\002\000\000!b\128@L\bx\214\254\000\131\200\000\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\001\187h\252\003\192\201\225\241\192\002\n:8x\000\006\b\161\240\006\003\000\007\195\000\000\000 @\192\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000!b\128\000L\bx\214\254\000\131\200\000\128!\194\000\001\130(|\001\128\192\001\240\192\000\000\b\0168\000\006\232\163\240\015\003#\135\195\000\000 \168@\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\252\012\130\b\128\026\004\224\019\184\000\003@\002\000\130\000\018\000\000\000\000\001\000\002\000\000\004\000\000\016\000\000\000\000 \000\000\004\000\018\000\000\000\160  \128\001 \000\000\000\000\016\000 \000\000@\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\004\000\018\000\000\000\160  \128\001 \000\000\000\000\016\000 \000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\004\000\018\000\000\000\160  \128\001 \000\000\000\000\016\000 \000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\004\000\018\000\000\000\160  \128\001 \000\000\000\000\016\000 \000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\001\000\004\128\000\000(\b\b \000H\000\000\000\000\004\000\b\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000@\001 \000\000\n\002\002\b\000\018\000\000\000\000\001\000\002\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bX\160\000\019\002\0305\191\128 \242\000 \bp\000\000\000\136\000\000\000\000\000\000\000\000\000\b\000\000\004\000\000 \000\000 \000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@ \002\000\000\002\000\000\000\000\000\002\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\bX\160\000\019\162_5\191\128 \246\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000@\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\b\000\000\002\022(\000\004\232\151\205o\224\b=\128\b\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\b\000\000\002\000\000\128\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\002\022(\000\004\232\151\205o\224\b=\128\b\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\016\000\000\000\000@\000\000\000\0002\b\"\000h\003\128N\224\000\r\000\b\002\b\000H\000\000\000\000\004\000\b\000\000\016\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\002\000\000\000\133\138\000\001:%\243[\248\002\015`\002\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\252\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\022(\000\004\200\151\205o\224\b=\128\b\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\240\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\252\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\b\000\002\000\000\016\000\000\000\000\001\000D\128\000 \128\b\000\000\000\000\000 \000\000\004\000\018\000\000\000  \000\004\001\000\000\000\000\000\024\004H\000\000\000\000\128\000\001\000\000\000\000\000\000\000\000 \000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\016\000\002&\002\000\016 \006\000\000@\000\128\000\143\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\192@\000\000\000\000\006\000\174\000\000\000\000\000\000\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\248\000\006\001!\240\006\003\000\007\195\000\000\000 @\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!b\128\000L\bx\214\254\000\131\200\000\128!\192\000A\131h|\001\128\193\001\240\192\018B:8p\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\b\000\000\000\000\000\000\000\000\0002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\b\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016`\218\031\000`0@|0\004\144\142\142\028\000\001\129\b|\001\128\192\001\240\192\000\000:\0160\016\000\000\000\000\017\128D\128\000\000\000\b\000\000\000@\000\000\000\000F\001\018\000\000\000\000 \000\000\128\000\000@\000\000\016\000\b\000\000\000\000\b\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\000\000\152\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\003 \130\000\004\0008\004\238\000\000\208\000\128 \128\000\000\000\000\000\000\000\000\000\000\000\000\000$\000\1282\b \000@\003\128N\224\000\r\000\b\002\b \000\000\016\000\000\000\000\000\000\000\000\000\000@\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\001\000\000\000\000\000\000\000\000\000\000\000 \bX\160\000\019\002\0305\191\128 \242\000 \bp\000\000`\018\031\000`0\000|0\000\000\002\004\012\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000 \000\000\000\000\002\000\b\016\000\000\000\000\001\128D\128\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000 \000\000\000@\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!b\128\000L\bx\214\254\000\131\200\000\128!\194\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!b\128\016L\bx\214\254\000\131\200\b\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\001\000\000\000 \000\b\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\002\000 \000\000 \000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\138\000A0!\227[\248\002\015 \002\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\130\000\001\000 cZ\232\000\003\000\000\000\130\000\000\000\224\002\000\b \002\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\002\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\024\000\135\192\024\012\000\031\012\000\000\002\129\003!b\128\000L\bx\214\254\000\131\200\000\128!\192\000\001\129\b|\001\128\192\001\240\192\000\000\b\0160\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\b\000\004\000\129\141k\160\000\012\000\000\002\b\016\000\003\128\b\000$\000\142\000\000\000\000\128\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H \000\016\002\0065\174\128\0000\000\000\b \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\138\000\0010!\227[\248\002\015 \002\000\135\b\000\006\001!\240\006\003\000\007\195\000\000\000 @\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\0002\b \000@\003\128N\224\000\r\000\b\002\b\004\000\000\000\000\000\000\000\000\000\000\001\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\133\138\000\001:%\243[\248\002\015`\002\000\135\0002\b\"\000h\019\128N\224\000\r\000\b\002\b\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000!b\128\000N\137|\214\254\000\131\216\000\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000 \000\000\bX\160\000\019\162_5\191\128 \246\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000 \000\000\b\000\002\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\bX\160\000\019\162_5\191\128 \246\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\016\000\000\000\000@\000\000\000\0002\b\"\000h\003\128N\224\000\r\000\b\002\b\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000 \000\000\bX\160\000\019\162_5\191\128 \246\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\247\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!b\128\000L\137|\214\254\000\131\216\000\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\223\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\247\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\255\255\255\255\255\255\255\255\255\255\255\255\255\255\252\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\000(\000\000\000\000\000\000\000\133\138\000\0010!\227[\248\002\015 \002\000\135\b\000\006\001!\240\006\003\000\007\195\000\000\000 @\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\000\000\128\000\000\000\000\000\000\000\000\000\128\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\001\000\000\000\000\000\024\002\184\000\000\000\000\000\000\000\133\139\128\001\252%\227\219\249\242\207 \002\b\1510\016\000\000\000\000\001\000D\128\000 \128\b\000\000\000\000\000\000\000\000\004\000\002\000\000\000\000\000 \000\129\000\000\000\000\000\024\004H\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\002\000\000\000\004\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\022(\000\004\192\135\141o\224\b<\128\b\002\028 \000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\022(\001\004\192\135\141o\224\b<\128\136\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\016\000\000\002\000\000\128\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@ \002\000\000\002\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\001\131h|\001\128\193\001\241\192\002\002:8x\000\006\000!\240\006\003\000\007\199\000\000\000\160@\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000@\000\000\b\000\002\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\000 \000\128\000(\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\014\000 \000\128\000(\000\000\000\002\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\138\000A0!\227[\248\002\015 \"\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\003\128\b\000 \000\n\000\000\000\000\128\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000@\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\002`\000\000@\001 \000\000\002\002\130\b@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\202\000\129\000\000\006\001\218\000\000\018\000 @\128\003\b\002D\000\001\024\007h\000\000\b\000\128\000\002\000\000\002`\000\000@\001 \000\000\002\002\130\b@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\000\133\000\000\006\001\218\000\000\000\000 \000\160\128\000\000\152\000\000\016\000H\000\000\000\128\160\130\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\t\128\000\001\000\004\128\000\000\b\n\b!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\152\000\000\016\000H\000\000\000\128\160\130\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\000\000\001\000\006\000\000\004\000\b\016\000 \000\000&\000\000\004\000\018\000\000\000 ( \132\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\000\000\001\000\002\000\000\004\000\000\016\000 \000\000&\000\000\004\000\018\000\000\000 ( \132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\002`\000\000@\001 \000\000\002\002\130\b@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\152\000\000\016\000H\000\000\000\128\160\130\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000 \000\000&\000\000\004\000\018\000\000\000 ( \132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\002`\000\000@\001 \000\000\002\002\130\b@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000&\000\000\004\000\018\000\000\000 ( \132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\202\000\129\000\000\006\001\202\000\000\018\000\000@\128\128\000\000\152\000\000\016\000H\000\000\000\130\160\130\016\012 \t\016\000\004`\029\160\000\000 \002\000\000\0000\000!@\000\001\128v\128\000\000\000\b\000(\000H\000\000\000\000\004\000\024\000\000\016\000 @\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\t\128\000\000\000\004\000\000\000\b\n\000! \000\000&\000\000\000\000\016\000\000\000  \000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000&\000\000\000\000\016\000\000\000 (\000\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003(\002\004\000\000\024\007(\000\000H\000\001\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\t\128\000\000\000\004\000\000\000(\n\000\001\000H\000\000 \000\004\000\026\000\000\016\001 @\128\001 \000\000\000\000\016\000h\000\000@\000\129\002\000\000\000\000\000\000\b \001\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\000\000\000\000\004\000\n\000\000\016\000\000@\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\000\000\000\016\000(\000\000@\000\001\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\002`@\000@\001\000\000\000\n\002\128\000H\000\000\t\129\000\000\000\004\000\000\000(\n\000\001\000H\000\000 \000\004\000\024\000\000\016\000 @\128\001 \000\000\000\000\016\000`\000\000@\000\129\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\018\000\000\b\000\001\000\006\000\000\004\000\b\016 \000H\000\000\000\000\004\000\024\000\000\016\000 @\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\004\000\002\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\004\000\000\000\000\000`\017 \000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\bX\160\000\019\002\0305\191\128 \242\000 \bp\000\000`\002\031\000`0\000|0\000\000\n\004\012\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\006\004!\240\006\003\000\007\195\000\000\000 @\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000`B\031\000`0\000|0\000\000\006\132\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\016\000\000\000\000\017\128D\128\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\000\000\000\000\001\024\004H\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\016\000\000\004\000\002\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000`\017 \000\000\000\002\000\000\012\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\001\000\000\128\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\000\000\000\000\000\024\004H\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016L;\182\159\194>\253\190\159\0121,\163\171\167\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\006\237\163\240\015\003'\135\199\000\n(\232\225\208L;\182\159\194>\253\190\159\0121,\163\171\167\000\000.\002 \000\152\0028 0\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\224\"\000\t\128#\130\003\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\128\b\000 \000\n\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\003\128\b\000 \000\n\000\000\000\000\128\000\000@\000\014\000 \000\128\000(\000\000\000\002\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\027\182\143\192<\012\158\031\028\000 \163\163\135!b\128\000L\bx\214\254\000\131\200\000\128!\192\000\000\002 \000\000\000\000\000\000\000\000\000 \000\000\016\000\000\128\000\000\128\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\b\000\004\000\129\141k\160\000\012\000\000\002\b\000\004\027\182\143\192<\012\158\031\012\001$\163\163\135\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\b\000\004\000\129\141k\160\000\012\000\000\002\b \000\027\166\143\192<\012\142\031\012\000 \128\129\003\161\226\128\024N\137|\222\254\002\131\248\128\128a\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\b\016@\132\000 \003\b\b\004\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\128 @\000\001\128v\128\000\000\128\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\002\031\000`0\000|0\000\128\002\004\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\b \000@\003\128N\224\000\r\000\b\002\b\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\030( \004\232\151\205\239\224(?\136\b\006\028\000\000\000\000\000\128\004\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\b\000\000\000\000\000\000\000\004\130\000\001\000 cZ\232\000\003\000\000\000\130\000\000\006\232#\240\015\003#\135\195\000\b  @\223\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\002\000@\000@\001\000\000\000\n\002\128\000@\000\000\b\001\000\000\000\004\000\000\000(\n\000\001\000H\000\000 \000\004\000\024\000\000\016\000 @\128\001 \000\000\000\000\016\000`\000\000@\000\129\002\000\004\128\000\000\000\000@\001\128\000\001\000\002\004\000\000\018\000\000\000\000\001\000\002\000\000\004\000\000\016\000\000\000\000 \000\000\000\000\016\000\000\000  \000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\018\000\000\000\000\001\000\006\000\000\004\000\b\016\000\000H\000\000\000\000\004\000\b\000\000\016\000\000@\000\000\000\000\128\000\000\000\000@\000\000\000\128\128\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\004\000\000\000\b\b\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000@\000\000\000\128\128\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\016\000\000\000  \000\128\001 \000\000\000\000\016\000`\000\000@\000\129\000\000\004\128\000\000\000\000@\000\128\000\001\000\000\004\000\000\000\000\b\000\000\000\000\004\000\000\000\b\b\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\001 \000\000\000\000\016\000`\000\000@\000\129\000\000\004\128\000\000\000\000@\000\128\000\001\000\000\004\000\000\000\000\b\000\000\000\000\004\000\000\000\b\b\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000@\000\000\000\128\128\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\016\000\000\000  \000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000@\000@\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000H\000\000 \000\004\000\024\000\000\016\000 @\128\001 \000\000\000\000\016\000`\000\000@\000\129\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\b\000\004 \129\141k\160\000\012\000\000\002\b\000H \000\016\002\0065\174\128\0000\000\000\b @\000\014\000 \000\128\000(\000\000\000\002\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H \000\016\130\0065\174\128\0000\000\000\b \001 \128\000@\b\024\214\186\000\000\192\000\000 \128\000\0008\000\128\002\000\000\160\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000H  \000\000\006\000\000\128\000\016 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\002\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\000\b\000\000\002\000\000\000\000\000\000\000\000\000\001\000\000\000\000@\b\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000 \000\000\000\000\000\000\000\000\007\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!b\224@\127\tx\246\254|\179\200\000\131%\204\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\bX\160\000\019\002\0305\191\128 \242\000 \bp\000\000`\002\031\000`0\000|0\000\000\n\004\012\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\006\004!\240\006\003\000\007\195\000\000\000 @\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\255\255\255\255\255\255\255\255\255\255\255\255\255\255\252\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\006\b!\240\006\003\000\007\195\000\b\000 @\192\200 \136\001\128N\001;\128\0004\000 \b \001 \128\000@\b\024\214\186\000\000\192\000\000 \128\000\001\186\b\252\003\192\200\225\240\192\002\b\b\0160\016\000\000\000\000\001\000D\128\000 \128\b\000\000\031\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\000\000\000\000\002\000\016\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000@\000 \000\000\000\000\000\000\000\018\b\000\004\000\129\141k\160\000\012\000\000\002\b\000\000\027\160\143\192<\012\142\031\012\000(\128\129\003!b\128\000L\bx\214\254\000\131\200\000\128!\192\000\001\130\b|\001\128\192\001\240\192\002\000\b\0160\000\000\000\000 \001\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\130\b|\001\128\192\001\240\192\002\000\b\0240\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\012\130\b\000\016\000\224\019\184\000\003@\002\000\130\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000 \bX\160\000\019\002\0305\191\128 \242\000 \bp\000\016`\002\031\000`0\000|0\000\016\002\004\012\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\006\004!\240\006\003\000\007\195\000\000\000 @\192H \000\016\002\0065\174\128\0000\000\000\b \000\000n\130?\000\24028|0\000\130\002\004\012\000\000\000\000\000\000`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\194\000\129\000\000\006\001\218\000\000\002\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\128\000\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\006\b!\240\006\003\000\007\195\000\b\000 @\192\192\000\129\000\000\006\001\218\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\006\b!\240\006\003\000\007\195\000\b\000 @\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\128\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\128\000\000 \000\b\000\000\234 \145\001\000N\001;\128\0004\000\160\b \000\000\000\000\000\000\000\000\b\000\000\002\000\000\128\000\000\000\000\000\000\000\000\000 \000\000\b\000\000\000\007\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\192\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000`\017 \000\b \002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\162\t\000\016\004\224\019\184\000\003@\002\000\130\000\000\000\000\000\000\000\000\000\128\000\000 \000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\b\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000 \000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\b\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\128\000\000 \000\b\000\000\234 \144\001\000N\001;\128\0004\000\160\b \000\000\000\000\000\000\000\000\b\000\000\002\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000:\136$\000@\019\128N\224\000\r\000\b\002\b\000\000\000\000\000\000\000\000\002\000\000\000\128\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\128\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\128\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\002\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\016\000\000\000  \000\004\b\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\004\000\000\000\b\b\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!b\128\000L\bx\214\254\000\131\200\000\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\b\000\004\000\129\141k\160\000\012\000\000\002\b\000\000\027\160\143\192<\012\142\031\012\000 \128\129\003\127\255\255\255\255\255\255\255\255\255\255\255\255\255\255\254\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024 \135\192\024\012\000\031\012\000 \000\129\003\161b\128\000L\bx\214\254\000\131\200\000\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\b!\240\006\003\000\007\195\000\b\000 @\200X\160\000\019\002\0305\191\128 \242\000 \bp\000\000`\002\031\000`0\000|0\000\000\002\132\012\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\006\b!\240\006\003\000\007\195\000\b\000 @\232X\160\000\019\002\0305\191\128 \242\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\130\b|\001\128\192\001\240\192\002\000\b\016:\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\130\031\000`0\000|0\000\128\002\004\014\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024 \135\192\024\012\000\031\012\000 \000\129\003\161b\128\000L\bx\214\254\000\131\200\000\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\b!\240\006\003\000\007\195\000\b\000 @\232X\160\000\019\002\0305\191\128 \242\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\130\b|\001\128\192\001\240\192\002\000\b\016:\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\130\031\000`0\000|0\000\128\002\004\014\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024 \135\192\024\012\000\031\012\000 \000\129\003\161b\128\000L\bx\214\254\000\131\200\000\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\b!\240\006\003\000\007\195\000\b\000 @\232X\160\000\019\002\0305\191\128 \242\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\130\b|\001\128\192\001\240\192\002\000\b\016:\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\130\031\000`0\000|0\000\128\002\004\014\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024 \135\192\024\012\000\031\012\000 \000\129\003\161b\128\000L\bx\214\254\000\131\200\000\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\b!\240\006\003\000\007\195\000\b\000 @\232X\160\000\019\002\0305\191\128 \242\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\130\b|\001\128\192\001\240\192\002\000\b\016:\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\130\031\000`0\000|0\000\128\002\004\014\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024 \135\192\024\012\000\031\012\000 \000\129\003\161b\128\000L\bx\214\254\000\147\200\000\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\130\031\000`0\000|0\000\128\002\004\012\000\001\130\b|\001\128\192\001\240\192\002\000\b\016:\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\130\031\000`0\000|0\000\128\002\004\014\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024 \135\192\024\012\000\031\012\000 \000\129\003\161b\128\000L\bx\214\254\000\131\200\000\128!\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\b!\240\006\003\000\007\195\000\b\000 @\232X\160\000\019\002\0305\191\128 \242\000 \bp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\130\b|\001\128\192\001\240\192\002\000\b\0160\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000n\130?\000\24028|0\000\130\002\004\012\133\138\000\0010!\227[\248\002\015 \002\000\135\b\000\006\001!\240\006\003\000\007\195\000\000\000 @\192\000\027\160\143\192<\012\142\031\012\000\160\128\129\003!b\128\000L\bx\214\254\000\131\200\000\128!\192\000\001\130\b|\001\128\192\001\240\192\002\000\b\0160\016\000\000\000\000\000\128\002\128\000\000\000\000\000\000\bX\160\000\019\002\0305\191\128 \242\000 \bp\128\000`\018\031\000`0\000|0\000\000\002\004\012\000\001\186\b\252\003\192\200\225\240\192\n\b\b\0162\022(\000\004\192\135\141o\224\b<\128\b\002\028\000\000\024 \135\192\024\012\000\031\012\000 \000\129\003!b\128\000L\bx\214\254\000\131\200\000\128!\192\000\000\000 \000\000\000\000\000\000\000\000\000 \000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\027\160\143\192<\012\142\031\012\000\160\128\129\003!b\128\000L\bx\214\254\000\131\200\000\128!\192\000\001\130\b|\001\128\192\001\240\192\002\000\b\0160\000\006\232#\240\015\003#\135\195\000(  @\200X\160\000\019\002\0305\191\128 \242\000 \bp\000\000`\130\031\000`0\000|0\000\128\002\004\012\000\000\000\000\000\000@\000 \000\000\b\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\002\000\000\000\128\000 \000\000\000\000\128\000\000\000\000@\000\000\000\128\128\000\016\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\128\000\000 \000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\128\000\000 \000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\001\000\000\000\002\002\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\255\255\255\255\255\255\255\255\255\255\255\255\255\255\253\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\240\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000 \004\000\004\000\016\000\000\000\160(\000\004\000\000\000\128\016\000\000\000@\000\000\002\128\160\000\016\004\128\000\002\000\000@\001\128\000\001\000\002\004\b\000\018\000\000\000\000\001\000\006\000\000\004\000\b\016 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\004\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\001\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\001 \000\000\128\000\016\000`\000\000@\000\129\002\000\004\128\000\000\000\000@\001\128\000\001\000\002\004\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\000\b\000\000\002\000\000\000\000\000\000\000\000\000\001\000\000\000\000@\b\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000 \000\000\000\000\000\000\000\000\007\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003 \130 \006\0018\004\238\000\000\208\000\128 \128\004\000\000\000\000\000@\017 \000\b \002\000\000\007\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\192\000\000\000\000\000\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\012 \b\016\000\000`\029\160\000\000 \002\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\"\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\004\000\000\000\b\b\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\255\255\255\255\255\255\255\255\255\255\255\255\255\255\252\000\000\000\000\000\000@\000 \000\000\b\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\002\000\000\000\128\000 \000\000\000\000\128\000\000\000\000@\000\000\000\128\128\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\030(\000\004\232\151\205\239\224(?\128\b\006\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\135\138\000\001:%\243{\248\n\015\224\002\001\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\138\000\0010!\227[\248\002\015 \002\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\135\138\b\001:%\243{\248\n\015\226\002\001\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\002\000\000\000\002\030( \004\232\151\205\239\224(?\136\b\006\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\128\000\000\000\135\138\b\001:%\243{\248\n\015\226\002\001\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")
  
  and start =
    7
  
  and action =
    ((32, "\000\000_&\000\000_&\000\000R\000\000\000e2\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000_\240\000\000e2\000\000\000\000\000\000\000\000\000\000P\b\000\000\131B\000\000R\000\000\000P\b\000\000\000\000\000\000R\000\000\000P\b\000\001Jz\000\000\000\000\000\000\000\000\000\000\000\000\000\001Jz\000\000\022,\000\000\000\000\000\000\000\000\000\000N\158\000\000U\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000V\224\000\001Iv\000\001LP\000\000\000\000\000\000\000\000\000\001LP\000\0006\250\000\000\000\000\000\000O\214\000\000Y\178\000\000\000\000\000\000\000\000\000\000W\208\000\001Iv\000\001LP\000\000\000\000\000\000Z\182\000\000P@\000\000Z\182\000\000Z\182\000\000\000\000\000\001I\248\000\001I\248\000\001I\248\000\0006\250\000\000\000\000\000\000W\208\000\000\000\000\000\000\000\000\000\000\000\000\000\001Jz\000\000\000\000\000\001F\212\000\001F\212\000\0006\250\000\000\000\000\000\000W\208\000\000\000\000\000\000\000\000\000\000\175\028\000\000\175\210\000\000\000\000\000\000\000\000\000\000a,\000\000\133\200\000\000\"\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000V\224\000\000\000\000\000\000a,\000\000f(\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000_\254\000\000f(\000\000\000\000\000\000_&\000\000(\216\000\000\000\000\000\000^\004\000\000\143\224\000\000O\166\000\000\000\000\000\001J\216\000\000+\188\000\000U\164\000\000Q\132\000\001KP\000\000+\188\000\001K\200\000\000+\188\000\000O\248\000\000\000\000\000\000+\188\000\000W\210\000\000P\226\000\000\000\000\000\000Sh\000\000\000\000\000\000a\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000P\212\000\000\000\000\000\000a\004\000\000\000\000\000\000U\128\000\000\000\000\000\000a\004\000\000\000\000\000\000R\184\000\000\000\000\000\000\000\000\000\000W\004\000\000_\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000aB\000\000\171\192\000\000\000\000\000\000W\198\000\001Q\238\000\000\000\000\000\000R\238\000\000R\146\000\001' \000\0006\250\000\001M\138\000\001' \000\000a\004\000\000\000\000\000\000_f\000\001)\252\000\000k\204\000\000S\000\000\000_f\000\000f(\000\000_&\000\001Iv\000\001LP\000\001F\212\000\000+\188\000\000Z\182\000\000\000\000\000\000Q\220\000\000Z\182\000\000\000\000\000\001F\212\000\000\129\154\000\000\000\000\000\000\000\000\000\000B\176\000\001Iv\000\001LP\000\000\129\154\000\000Uf\000\000\000\000\000\000P2\000\000\129\168\000\000B\176\000\001Iv\000\001LP\000\000V~\000\000\000\000\000\000WD\000\000U\030\000\000\"\242\000\000\000\252\000\000\"\242\000\000f(\000\000_&\000\001Iv\000\001LP\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000a\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\143\168\000\001F\212\000\000a\004\000\000Ob\000\000\137\134\000\000\000\000\000\000W\208\000\000\176\136\000\000\177>\000\000\000\000\000\000Y\186\000\000Q\220\000\000Z\182\000\000\000\000\000\000R\024\000\000\000\000\000\000\129\154\000\000\000\000\000\000S\218\000\000\000\000\000\000W\020\000\000\000\000\000\000Q<\000\000\000\000\000\000\000\000\000\001F\212\000\000\000\000\000\000\000\000\000\000\000\000\000\001\n\236\000\001F\212\000\000\000\000\000\000\000\000\000\000)\210\000\000O\176\000\000Z\160\000\000a,\000\000_&\000\000Qb\000\000\000\000\000\000\000\000\000\000^\012\000\000P\160\000\000\000\000\000\000P\150\000\000U\176\000\000\000\000\000\000a0\000\000\000\000\000\000\000\000\000\000\001\248\000\000\145*\000\000(\216\000\000c*\000\000\146D\000\000O\166\000\000X\n\000\000\000\000\000\000b\246\000\001L\210\000\000V\214\000\001Q\238\000\000\000\000\000\000h\164\000\001!\000\000\000h\164\000\000Rr\000\000\000\000\000\000W\168\000\000X\184\000\001G\154\000\000a\004\000\000}*\000\000a\004\000\000U\212\000\000\000\000\000\000Y`\000\000~t\000\000\000\000\000\001Q\200\000\000Yr\000\000Z\022\000\001' \000\000\000\000\000\000\000\000\000\000\000\000\000\001M\206\000\000\000\000\000\000P\192\000\000Y,\000\000\000\000\000\000\000\000\000\000\000\000\000\000\140\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000Z>\000\000d>\000\000\000\000\000\000P\188\000\001!\000\000\000\000\000\000\000\000\000\000\001Nz\000\001!\000\000\000\000\000\000\000*\204\000\000\000\000\000\000\000\000\000\001\011L\000\000[n\000\000a\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000P\188\000\000\000\000\000\000W\244\000\000~\222\000\001Q\200\000\000\000\000\000\000\\@\000\000\000\000\000\000\\\026\000\001!\000\000\000\000\000\000\000\000\000\000\000\\\140\000\001!\000\000\000\000\000\000\000\000\000\000\000Ul\000\001G\154\000\000\000\000\000\000]j\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000W\020\000\000]D\000\001G\154\000\000\000\000\000\000Y\146\000\001G\154\000\000\000\000\000\000R\232\000\000O\128\000\000\000\000\000\000W\020\000\000\000\000\000\000S\246\000\000Z\006\000\000\000\000\000\000W\020\000\000\000\000\000\000^~\000\000\000\000\000\000W\168\000\000_\170\000\000\000\000\000\000_\242\000\000\000\000\000\000h\164\000\000a\004\000\000l(\000\000\000\000\000\000+\188\000\000\000\000\000\000m\242\000\000+\188\000\000\000\000\000\000\000\000\000\000\000\000\000\000V\254\000\000a\004\000\000s\230\000\000+\188\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000+\188\000\000\000\000\000\000`\164\000\000\000\000\000\000a\242\000\000V\254\000\000h\164\000\000\000\000\000\000\000\000\000\000a\242\000\000\000\000\000\000V\254\000\000a\242\000\000\000\000\000\000\000\000\000\000a\196\000\000\000\000\000\000[\170\000\000Z>\000\000a\004\000\000Z>\000\000\000\000\000\000\000\000\000\000b\000\000\000\000\000\000\000Z\b\000\000\000\000\000\000\000\000\000\000P*\000\000b\\\000\000Y\216\000\001G\154\000\000\000\000\000\000b\168\000\000^>\000\001G\154\000\000\000\000\000\000V\198\000\000P*\000\000\000\000\000\000c\002\000\000\000\000\000\000c|\000\000\000\000\000\000``\000\000[|\000\001!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000c\200\000\000\000\000\000\000\000\000\000\000\163\186\000\001!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001$\192\000\001Q\238\000\000\000\000\000\001L\210\000\001' \000\001$\192\000\000\000\000\000\000\000\000\000\000[\180\000\001F\134\000\000\000\000\000\000dH\000\000\000\000\000\001O$\000\001$\192\000\000\000\000\000\001$\192\000\000\000\000\000\001$\192\000\000\000\000\000\000d\018\000\001$\192\000\000d\174\000\000d\242\000\000P\206\000\001$\192\000\000\000\000\000\001$\192\000\000\000\000\000\000e\188\000\001$\192\000\000\000\000\000\000fL\000\001$\192\000\000\000\000\000\001$\192\000\000\000\000\000\001$\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000{\144\000\000V\214\000\001O$\000\001P\252\000\000d\018\000\000\000\000\000\000\000\000\000\000\151\012\000\001!\000\000\000f\028\000\001!\000\000\000\000\000\000\001S\024\000\000\000\000\000\000f\012\000\000\132\188\000\000O\166\000\000\000\000\000\000\132\188\000\000b\246\000\000W\208\000\000W\208\000\000N\202\000\000f\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000W\208\000\000\000\000\000\000N\202\000\000\000\000\000\000\151\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000{\144\000\000\000\000\000\000\147\016\000\000gj\000\000gj\000\000P*\000\000\000\000\000\000kf\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000kf\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\161\206\000\000b\246\000\000l\170\000\000\000\000\000\000q\180\000\000m\152\000\000\000\000\000\000m\152\000\000\000\000\000\000f\182\000\000m\152\000\000\000\000\000\000gd\000\000m\152\000\000\000\000\000\000m\152\000\000\000\000\000\000m\152\000\000\000\000\000\000q\180\000\000Q\190\000\000^\\\000\000\000\000\000\000f\178\000\000q\180\000\000Q\190\000\000`\160\000\000\000\000\000\000b\204\000\000\000\000\000\000c\166\000\000\000\000\000\000\000\000\000\000jF\000\000q\180\000\000Q\190\000\000jF\000\000g\140\000\000q\180\000\000Q\190\000\000jF\000\000\000\000\000\000jF\000\000\000\000\000\000\000\000\000\000jF\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000g\200\000\000fb\000\000Xj\000\000i\180\000\000l\170\000\000q\180\000\000\000\000\000\000Qb\000\000\022,\000\000S\244\000\000O\176\000\000c\218\000\000a\004\000\000OD\000\000\145*\000\000V\146\000\000\000\000\000\001\012\184\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000U\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000j$\000\000\000\000\000\000i~\000\001!\000\000\000\000\000\000\000f(\000\000_&\000\001\030\232\000\000\000\000\000\000+\188\000\000\000\000\000\000Z.\000\000\000\000\000\000\000\000\000\000[\016\000\000\000\000\000\000\000\000\000\000}H\000\000\000\000\000\000g@\000\000\000\000\000\000\000\000\000\000i\166\000\000g^\000\000\000\000\000\000ON\000\000\000\000\000\000\000\000\000\000j\204\000\000W\142\000\000\000\000\000\000[h\000\000\000\000\000\000_f\000\000\141\250\000\000(\216\000\000h$\000\000\136\128\000\000O\166\000\000|x\000\000l\170\000\000r\188\000\000f\138\000\001Q\238\000\000j\242\000\000\000\000\000\000kn\000\000\000\000\000\000Z\248\000\000\000\000\000\000W\168\000\000k\210\000\000\000\000\000\000l$\000\000\000\000\000\000W\168\000\000l\148\000\000\000\000\000\000l\194\000\000\000\000\000\000V\198\000\000l\196\000\000\000\000\000\000\000\000\000\001\"0\000\001(\252\000\000\022,\000\001N\018\000\001' \000\000[\180\000\000m\030\000\000\000\000\000\000\000\000\000\000a0\000\000\000\000\000\000h\164\000\000[\170\000\000m>\000\000\000\000\000\001!\000\000\000mP\000\000\000\000\000\000h\164\000\000m\144\000\000\000\000\000\000V\130\000\000Y`\000\000m\026\000\001(\252\000\000\000\000\000\000\000\000\000\001M\204\000\000\000\000\000\000\000\000\000\000\143\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000m \000\001(\252\000\000\000\000\000\000\000\000\000\001N\218\000\001(\252\000\000\000\000\000\000\000\000\000\000\000\000\000\001OB\000\000m\170\000\000a0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000f\138\000\000\000\000\000\000m\188\000\000f\138\000\000\000\000\000\000n\028\000\000f\138\000\000\000\000\000\000f\138\000\000\000\000\000\000f\138\000\000\000\000\000\000r\188\000\000R\174\000\000Q\000\000\000\000\000\000\000mj\000\000r\188\000\000R\174\000\000Q\240\000\000\000\000\000\000R\224\000\000\000\000\000\000S\208\000\000\000\000\000\000\000\000\000\000U\176\000\000r\188\000\000R\174\000\000U\176\000\000m\134\000\000r\188\000\000R\174\000\000U\176\000\000\000\000\000\000U\176\000\000\000\000\000\000\000\000\000\000U\176\000\000\000\000\000\000\000\000\000\000\000\000\000\000V\224\000\001!\000\000\000m\248\000\001(\252\000\000\000\000\000\000\135\016\000\000\000\000\000\000h\152\000\000iv\000\000\000\000\000\000iv\000\000aB\000\000\000\000\000\000\000\000\000\000V\224\000\000`8\000\000h\152\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000m\252\000\000h\212\000\000Xj\000\000n\228\000\000l\170\000\000r\188\000\000\000\000\000\000d\242\000\000a0\000\000W\130\000\000y.\000\000Z\150\000\000l\138\000\000g\176\000\000_f\000\000\000\000\000\000\000\000\000\000\000\000\000\000W\182\000\000Z\150\000\000Yf\000\000\000\000\000\000n`\000\000c\172\000\000\000\000\000\000O0\000\000[\136\000\0017\174\000\001!\000\000\001Sv\000\000\000\000\000\001!\000\000\000\000\000\000\000o&\000\000Z\020\000\000+\188\000\000\178\016\000\000UT\000\000+\188\000\000\179|\000\000\000\000\000\000\128N\000\000Z\150\000\000\000\000\000\000nx\000\000i<\000\001O\134\000\000\000\000\000\000\000\000\000\000n\140\000\000_f\000\000\175\238\000\000\000\000\000\000_f\000\000\000\000\000\000\000\000\000\000oH\000\000oH\000\000a,\000\000\000\000\000\000\000\000\000\000\000\000\000\000\\\184\000\000\000\000\000\000\1444\000\000B\176\000\000,\182\000\000B\176\000\000\129\154\000\000n\194\000\000\000\000\000\000P2\000\000n\210\000\000\000\000\000\000\1388\000\000o\150\000\000\000\000\000\001I\248\000\000a\004\000\000PR\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000f\254\000\001F\212\000\000\000\000\000\000Q\224\000\000\000\000\000\001F\212\000\000o\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000QB\000\000\000\000\000\000\000\000\000\000\000\000\000\001F\212\000\000\151B\000\001I\248\000\000R2\000\000\000\000\000\001F\212\000\000\000\000\000\000~\234\000\000\130\144\000\000\000\000\000\000\137\134\000\000\000\000\000\000V\162\000\001\012\184\000\000O@\000\001!\000\000\000\000\000\000\001R&\000\000_f\000\000\000\000\000\000\130\158\000\000O6\000\001!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\\\206\000\000X\148\000\000\000\000\000\000o\214\000\000\000\000\000\000-r\000\000\1282\000\000\131B\000\000\000\000\000\000R\000\000\000P\b\000\001I\248\000\000`\208\000\001I\248\000\000S\"\000\000\"\242\000\000\129\154\000\000o*\000\000\000\000\000\000P2\000\000o8\000\000\000\000\000\000\138<\000\000\000\000\000\000o\238\000\000\000\000\000\000[\198\000\000\000\000\000\000T.\000\000O\188\000\000\000\000\000\000]\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\244\000\000^2\000\000P*\000\000o\220\000\000or\000\001(\252\000\000P@\000\000\000\000\000\000\000\000\000\000R\004\000\000X\004\000\000o\250\000\000o\140\000\001(\252\000\000\\2\000\000\000\000\000\000p\016\000\000N\194\000\000\"\242\000\001Jz\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000a0\000\000g\220\000\000\139\002\000\000\000\000\000\000R\136\000\000_d\000\001\030\232\000\000p\018\000\000\000\000\000\000p\022\000\000Z\140\000\001\030\232\000\000p~\000\000W\142\000\000\129\156\000\001G\228\000\000ON\000\000V\254\000\000\000\000\000\000\000\000\000\000~0\000\000p\138\000\000a\172\000\000\000\000\000\000V\254\000\000\129\156\000\000\003\234\000\000\000\000\000\000\138<\000\001G\228\000\000\138<\000\000T\202\000\000\000\000\000\000\000\000\000\000Q\250\000\000\129\156\000\000\000\000\000\000PH\000\000_\186\000\000\000\000\000\000o\206\000\000j&\000\000\000\000\000\000U\184\000\000_2\000\000W6\000\000\000\000\000\000\000\000\000\000\000\000\000\000Y*\000\001G\228\000\001\tb\000\000~0\000\001G\228\000\000a0\000\001\011z\000\000a0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001%D\000\000^\012\000\000\000\000\000\000\000\000\000\000\004\230\000\000X\020\000\001GV\000\000\000\000\000\000\1388\000\000]\254\000\000\000\000\000\000\000\000\000\000PH\000\000T0\000\000\000\000\000\000\000\000\000\001\t\000\000\000}H\000\000\000\000\000\000\005\226\000\001G\228\000\000\000\000\000\000f\206\000\000\000\000\000\001#\170\000\001D\158\000\001\030\232\000\000a\004\000\001\t\000\000\000a\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001N6\000\000`\154\000\000\000\000\000\000\000\000\000\000.l\000\000c\172\000\001Hf\000\000\000\000\000\000\000\000\000\000/f\000\001\030\232\000\000\000\000\000\000\1400\000\000\000\000\000\001H\030\000\001E \000\000\000\000\000\000Up\000\001!\000\000\000\000\000\000\001\030\232\000\000\000\000\000\001\030\232\000\000\000\000\000\000_N\000\001'`\000\000\000\000\000\000pj\000\000\000\000\000\000\129\156\000\001\030\232\000\000R\242\000\000`h\000\000\138<\000\001\030\232\000\000U\194\000\000\000\000\000\000o\188\000\000\000\000\000\000\1388\000\000b\190\000\000\000\000\000\000\000\000\000\000PH\000\000U\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000`\000\000\000\000\000\000S\\\000\000\000\000\000\000\000\000\000\000a\144\000\000\000\000\000\000\129\156\000\000o\190\000\000\000\000\000\000\1598\000\000\000\000\000\000fV\000\000\000\000\000\000\000\000\000\000PH\000\000V\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000_N\000\000pv\000\000\000\000\000\000\129\156\000\000o\194\000\000\000\000\000\000\138<\000\000gR\000\000\000\000\000\000\000\000\000\000PH\000\000Wp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\222\000\000\000\000\000\001G\228\000\000\000\000\000\000W\248\000\000\000\000\000\001\012\184\000\000p\128\000\000\000\000\000\000\000\000\000\000gn\000\000\000\000\000\001(\252\000\000\000\000\000\000U\146\000\000\000\000\000\001G\228\000\000\000\000\000\000_N\000\000p\150\000\000\000\000\000\000\000\000\000\000b\134\000\000\000\000\000\000\129\156\000\000o\236\000\000\000\000\000\000\173\168\000\000\000\000\000\000hD\000\000\000\000\000\000\000\000\000\000PH\000\000\\\214\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000i:\000\000\000\000\000\001F@\000\000\000\000\000\000_\026\000\000\000\000\000\000_N\000\000p\178\000\000\000\000\000\000\000\000\000\000Q^\000\000Q\152\000\000\000\000\000\000`\148\000\000\000\000\000\000\000\000\000\000an\000\000p\230\000\000\000\000\000\000p\000\000\000\000\000\000\000p\184\000\000p\138\000\001\030\232\000\000R\\\000\001G\228\000\000`,\000\000\000\000\000\000\000\000\000\000bH\000\000\003\234\000\000p\252\000\000\000\000\000\000p\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000TX\000\000\137\134\000\000\000\000\000\000R\000\000\000p\154\000\001\030\232\000\000]\200\000\000B\176\000\000X\232\000\000\000\000\000\000h\204\000\000\000\000\000\000[\n\000\000[\016\000\001&\222\000\000\000\000\000\000\000\000\000\000bj\000\001'`\000\000\000\000\000\000p\208\000\000\000\000\000\000\000\000\000\000bj\000\000p\210\000\000\000\000\000\000\000\000\000\000W@\000\000B\176\000\000B\176\000\001I\248\000\000i\168\000\000p\164\000\000\000\000\000\000Yf\000\000\"\242\000\000R\000\000\000P\b\000\001Jz\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000j\134\000\001L\250\000\001L\250\000\000\022,\000\000\000\000\000\000V\224\000\000R\136\000\000`\\\000\001\031v\000\000X0\000\000+\188\000\000\000\000\000\000+\188\000\000^\154\000\000\"\242\000\000R\000\000\000p\174\000\001\030\232\000\000`p\000\000B\176\000\000B\176\000\000k`\000\000\"\242\000\000X\232\000\000Y&\000\000\"\242\000\000\"\242\000\001Jz\000\000w|\000\001Jz\000\000l>\000\000\000\000\000\001L\250\000\000\129\154\000\000p6\000\000\000\000\000\000P2\000\000p8\000\000\000\000\000\000p\236\000\000a0\000\000m\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\172\000\000P\160\000\000[\144\000\000a,\000\000c\170\000\000_f\000\000\000\000\000\000p\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\147\028\000\000\000\000\000\000f6\000\000p\224\000\000b\240\000\000o$\000\000T\162\000\000q\"\000\000p\226\000\000a,\000\000b*\000\000\000\000\000\000a,\000\000\148\180\000\000p\002\000\000\141\250\000\000V\146\000\000p\\\000\001(\252\000\000\000\000\000\000f(\000\000_&\000\000X\192\000\000q\012\000\000p\218\000\000B\176\000\0001,\000\000Q\144\000\000\\\128\000\000a,\000\000d\006\000\000b\006\000\000\000\000\000\000q\016\000\000\000\000\000\000\158\132\000\000\"\242\000\000xZ\000\000p\220\000\000\000\000\000\000\127J\000\000\131\248\000\000\000\000\000\000q\024\000\000\000\000\000\000b\220\000\000\128\232\000\000\137\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002&\000\000\177\244\000\000\000\000\000\000\139\148\000\000\178\170\000\000\000\000\000\000\140`\000\000T\018\000\000\000\000\000\000B\176\000\000\000\000\000\000B\176\000\000\000\000\000\000\179`\000\000\000\000\000\000\141,\000\000B\176\000\0015\024\000\000\180\022\000\000\000\000\000\000\141\248\000\000\180\204\000\000\000\000\000\000\142\196\000\000\181\130\000\000\000\000\000\000\143\144\000\000\1828\000\000\000\000\000\000\144\\\000\000\182\238\000\000\000\000\000\000\145(\000\000\183\164\000\000\000\000\000\000\145\244\000\000\184Z\000\000\000\000\000\000\146\192\000\000\185\016\000\000\000\000\000\000\147\140\000\000\185\198\000\000\000\000\000\000\148X\000\000\186|\000\000\000\000\000\000\149$\000\000\1872\000\000\000\000\000\000\149\240\000\000\187\232\000\000\000\000\000\000\150\188\000\000\188\158\000\000\000\000\000\000\151\136\000\000\189T\000\000\000\000\000\000\152T\000\000\137\134\000\000\000\000\000\000\190\n\000\000\000\000\000\000\153 \000\000\153\236\000\000\190\192\000\000\000\000\000\000\154\184\000\000\191v\000\000\000\000\000\000\155\132\000\000\192,\000\000\000\000\000\000\156P\000\000\192\226\000\000\000\000\000\000\157\028\000\000B\176\000\000\157\232\000\000\000\000\000\000q\026\000\000\000\000\000\000\"\242\000\000\bz\000\000R\128\000\000]p\000\000a,\000\000d\216\000\000b\224\000\000\000\000\000\000q$\000\000\000\000\000\000\\\158\000\000\132\174\000\000S\192\000\000\000\000\000\001F\212\000\000p\236\000\000\000\000\000\001F\212\000\000\151\200\000\000p\244\000\000\000\000\000\000\000\000\000\001F\212\000\000\000\000\000\000\000\000\000\000\"\242\000\000\000\000\000\000\000\000\000\0011x\000\000\000\000\000\000\193\152\000\000\000\000\000\000\194*\000\000\194\198\000\000\000\000\000\000\195X\000\000m\250\000\000\000\000\000\000\000\000\000\000\000\000\000\000\"\242\000\000\000\000\000\000\"\242\000\000\000\000\000\000\195\244\000\000\000\000\000\000\196\134\000\000\000\000\000\000B\176\000\001C\250\000\000\"\242\000\000\197R\000\000\197\238\000\000\000\000\000\000\198\128\000\000\199\028\000\000\000\000\000\000\199\174\000\000\200J\000\000\000\000\000\000\200\220\000\000\201x\000\000\000\000\000\000\202\n\000\000\202\166\000\000\000\000\000\000\2038\000\000\203\212\000\000\000\000\000\000\204f\000\000\205\002\000\000\000\000\000\000\205\148\000\000\2060\000\000\000\000\000\000\206\194\000\000\207^\000\000\000\000\000\000\207\240\000\000\208\140\000\000\000\000\000\000\209\030\000\000\209\186\000\000\000\000\000\000\210L\000\000\210\232\000\000\000\000\000\000\211z\000\000\212\022\000\000\000\000\000\000\212\168\000\000\213D\000\000\000\000\000\000\213\214\000\000\158\132\000\000\000\000\000\000\214r\000\000\000\000\000\000\215\004\000\000\215\208\000\000\216l\000\000\000\000\000\000\216\254\000\000\217\154\000\000\000\000\000\000\218,\000\000\218\200\000\000\000\000\000\000\219Z\000\000\219\246\000\000\000\000\000\000\220\136\000\000]<\000\000\"\242\000\0011\228\000\000\000\000\000\000\000\000\000\000B\176\000\000\\f\000\000\131B\000\0012`\000\000q.\000\000\000\000\000\0012\220\000\000\000\000\000\000\000\000\000\000\tv\000\001(\252\000\000\000\000\000\001RN\000\000y.\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000a\128\000\000c\190\000\000Yf\000\000O0\000\000\\\164\000\0017\174\000\001(\252\000\000\135\234\000\000\000\000\000\001(\252\000\000\000\000\000\000q\\\000\000[B\000\000qh\000\000[\134\000\000+\188\000\000c&\000\000\000\000\000\000\221\012\000\000qj\000\000\\v\000\000+\188\000\000c\240\000\000\000\000\000\000]f\000\000+\188\000\000d\030\000\000\000\000\000\000ah\000\000qh\000\000\222\164\000\000\000\000\000\000\242\188\000\000c\190\000\000\000\000\000\000p\174\000\000j\\\000\000\1346\000\000\000\000\000\000\000\000\000\000p\200\000\000y.\000\000\243\136\000\000\000\000\000\000y.\000\000\000\000\000\000[t\000\001(\252\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000b\024\000\000\000\000\000\000\000\000\000\000Q\220\000\000qN\000\000\000\000\000\000\"\242\000\000Y\000\000\000\000\000\000\000\000\000\000\000\1596\000\000\000\000\000\000qP\000\000\000\000\000\000O\188\000\000T.\000\000b\212\000\000\000\000\000\000\000\000\000\000]\020\000\000^\162\000\000\000\000\000\000\"\242\000\001'\210\000\000U\028\000\000\000\000\000\000\000\000\000\000B\176\000\000Z\134\000\000PH\000\000_\186\000\000X:\000\000\"\242\000\001(N\000\000Z\146\000\000PH\000\000_\186\000\000gV\000\000\"\242\000\001(\246\000\000\000\000\000\000f:\000\000h\174\000\000\"\242\000\001)r\000\000\000\000\000\000\000\000\000\000\000\000\000\000_\186\000\000d\012\000\000\"\242\000\001\031\232\000\000b\198\000\000\000\000\000\000PH\000\000_\186\000\000h\186\000\000\"\242\000\001 d\000\000\000\000\000\000dr\000\000\000\000\000\000\000\000\000\000]R\000\000X\222\000\000\000\000\000\000\000\000\000\000X\222\000\000\000\000\000\000a\004\000\000\000\000\000\000\000\000\000\000cL\000\000\000\000\000\000\000\000\000\000d\148\000\000PH\000\000_\186\000\000iz\000\000\"\242\000\001\031\232\000\000ff\000\000\000\000\000\000\000\000\000\000g\b\000\000\000\000\000\000\000\000\000\000\"\242\000\001!(\000\000\000\000\000\000PH\000\000_\186\000\000k\208\000\000\"\242\000\001\031\232\000\000g$\000\000\000\000\000\000\000\000\000\000iH\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0013H\000\000\000\000\000\000n\216\000\000\"\242\000\000\221T\000\000_\186\000\000\"\242\000\0013\196\000\000\000\000\000\000o\182\000\000\"\242\000\000\222 \000\000B\176\000\000\\f\000\000qP\000\000p\148\000\000\"\242\000\000\222\236\000\000qr\000\000\"\242\000\000\223\184\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000c\216\000\000\000\000\000\000\000\000\000\000Q\220\000\000qZ\000\000\000\000\000\000\"\242\000\000Z\144\000\000\000\000\000\000\000\000\000\000\159:\000\000\000\000\000\000qp\000\000\000\000\000\000O\188\000\000T.\000\000d\136\000\000\000\000\000\000\000\000\000\000d\162\000\000\000\000\000\000f\170\000\000\000\000\000\000\000\000\000\000g|\000\000\000\000\000\000\000\000\000\0015\164\000\000B\176\000\0012`\000\000\000\000\000\000i\150\000\000\000\000\000\000\000\000\000\000\nr\000\000\"\242\000\001\r4\000\001/\b\000\001H\244\000\000\000\000\000\001\030\232\000\000j\222\000\001!\000\000\000p\246\000\000\"\242\000\000\011n\000\000v\028\000\001!\198\000\000Q\208\000\000\\\128\000\000\"\242\000\001\t\212\000\000\000\000\000\000\000\000\000\001*\016\000\000Q\208\000\000\\\128\000\000\000\000\000\000bj\000\000q\146\000\000Q\208\000\000\\\128\000\000\000\000\000\000bj\000\000q\148\000\000Q\208\000\000\\\128\000\000\000\000\000\001P<\000\000e\022\000\000e\022\000\000\000\000\000\000p\254\000\001!\000\000\000q\016\000\000\"\242\000\000\012j\000\000q\014\000\001!\000\000\000q \000\000\"\242\000\000\rf\000\000q\"\000\000\"\242\000\000\014b\000\000\000\000\000\000_\220\000\000\"\242\000\000\015^\000\000\000\000\000\000\000\000\000\000f(\000\000_&\000\001Jz\000\000\160\012\000\000\"\242\000\00140\000\000\000\000\000\000a\128\000\000\"\242\000\0014\172\000\000\000\000\000\000B\176\000\000\\f\000\000q\168\000\000\000\000\000\000\000\000\000\000th\000\000\135|\000\000\"\242\000\001\"8\000\000\000\000\000\000[h\000\000\000\000\000\000_f\000\000\000\000\000\000\\X\000\000\000\000\000\000_f\000\000R\158\000\000[h\000\000_f\000\000\000\000\000\000\000\000\000\000_&\000\000R\000\000\000P\b\000\001Jz\000\000\133\128\000\000\"\242\000\001\r\192\000\000\000\000\000\000\000\000\000\000R\136\000\000`\\\000\001\030\232\000\000X\208\000\000B\176\000\001\nP\000\000q(\000\000\"\242\000\000\224\132\000\000\000\000\000\001\012N\000\000\000\000\000\000\000\000\000\000R\000\000\000q\132\000\001\030\232\000\000b\134\000\000B\176\000\0015\024\000\000\000\000\000\000\000\000\000\000B\176\000\0012\220\000\001Jz\000\000\160\152\000\000S\\\000\000q\016\000\001!\000\000\000q6\000\000Y\\\000\000Y\\\000\000\000\000\000\000\000\000\000\000\000\000\000\000S\158\000\000\134(\000\000e\b\000\000V\224\000\000\000\000\000\000\135\220\000\000e\b\000\000\000\000\000\000q\202\000\000\170\186\000\000e\b\000\000\000\000\000\000q\200\000\000\196T\000\000e\b\000\000\000\000\000\000\214\210\000\000e\b\000\000\000\000\000\001\005R\000\000e\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000X\232\000\000\\\230\000\000\"\242\000\001\014<\000\000+\188\000\000qT\000\000\"\242\000\001\014\200\000\000\000\000\000\000_\\\000\000\000\000\000\000Y|\000\000q\168\000\000b\174\000\000_Z\000\000\000\000\000\000\000\000\000\000q\216\000\000a\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000h\"\000\000f\130\000\000\000\000\000\000q\234\000\000\000\000\000\000d.\000\000\016Z\000\000[\196\000\000P*\000\000\000\000\000\000Y|\000\000\000\000\000\000\000\000\000\000q\182\000\000q@\000\001(\252\000\000\000\000\000\000Y|\000\000q\186\000\000qD\000\001S\164\000\000a0\000\000U\212\000\000\000\000\000\000qZ\000\001(\252\000\000\000\000\000\000\000\000\000\000Y|\000\000q\192\000\000qJ\000\001S\164\000\000\000\000\000\000Y \000\000\000\000\000\000qn\000\000j\230\000\000\000\000\000\000\000\000\000\000\1318\000\001!\000\000\000[|\000\000\000\000\000\000r\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000Y \000\000\000\000\000\0003 \000\000[\196\000\000\000\000\000\000q\220\000\000qf\000\001!\000\000\000\000\000\000\000\000\000\000\000Y|\000\000q\224\000\000qt\000\001G\154\000\000\000\000\000\000Y|\000\000q\240\000\000q\128\000\001G\154\000\000\000\000\000\000k\148\000\000\000\000\000\000\017P\000\0003 \000\001!\000\000\000q\166\000\001!\000\000\000\000\000\000\000\000\000\000\001!\000\000\000\000\000\000\000\000\000\000\000fh\000\000[\196\000\000\000\000\000\000Y|\000\000q\252\000\000q\142\000\001G\154\000\000\000\000\000\000Y|\000\000r\b\000\000q\150\000\001G\154\000\000\000\000\000\000k\148\000\000q\178\000\000k\004\000\000\000\000\000\000\000\000\000\000\162D\000\001!\000\000\000rX\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000k\148\000\000\000\000\000\001!\000\000\000\000\000\000\000\000\000\000\0004\020\000\0005\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000rV\000\000\000\000\000\000eh\000\0006\b\000\000\000\000\000\001!\000\000\000q\212\000\001(\252\000\000\000\000\000\000\000\000\000\001(\252\000\000\000\000\000\000\000\000\000\000\139\206\000\000[\196\000\000\000\000\000\000Y|\000\000r:\000\000q\196\000\001S\164\000\000\000\000\000\000Y|\000\000rD\000\000q\216\000\001S\164\000\000\000\000\000\000Y \000\000\000\000\000\001!\000\000\000\000\000\000\000\000\000\000\000\018F\000\000\019B\000\000\000\000\000\000\000\000\000\000\020>\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000h\150\000\000\000\000\000\000\000\000\000\000]*\000\000\021:\000\000\000\000\000\000\000\000\000\000r\130\000\000\000\000\000\000h\190\000\000\000\000\000\000\000\000\000\000Y \000\000\000\000\000\000\000\000\000\000\000\000\000\000`\142\000\000Y|\000\000\000\000\000\000q\198\000\000Y|\000\000\000\000\000\000\000\000\000\000`\142\000\000\000\000\000\000rV\000\000P\224\000\001\015f\000\000P\224\000\000yz\000\000\000\000\000\000\000\000\000\000r\006\000\000yz\000\000\000\000\000\000i,\000\0006\250\000\000`\142\000\000P*\000\000rZ\000\000q\232\000\001!\000\000\000\\`\000\000\000\000\000\000\000\000\000\000V6\000\000f\006\000\000rr\000\000q\252\000\001!\000\000\000^N\000\000\000\000\000\000rv\000\000Z \000\000B\176\000\001$\242\000\000r$\000\000B\176\000\0015\164\000\000\000\000\000\000\000\000\000\000\142\200\000\000\142\200\000\000\022,\000\001/\b\000\001H\244\000\001\030\232\000\000m\204\000\001!\000\000\000r0\000\000B\176\000\0007\244\000\000y\148\000\001\"\214\000\000Q\208\000\000i\140\000\000B\176\000\001\nP\000\000\000\000\000\000\000\000\000\001*\146\000\000Q\208\000\000i\140\000\000\000\000\000\000bj\000\000r\188\000\000Q\208\000\000i\140\000\000\000\000\000\000bj\000\000r\190\000\000Q\208\000\000i\140\000\000\000\000\000\001PL\000\000e\022\000\000r,\000\001!\000\000\000r>\000\000B\176\000\0008\238\000\000r0\000\001!\000\000\000rB\000\000B\176\000\0009\232\000\000rD\000\000B\176\000\000:\226\000\000\000\000\000\000i*\000\000B\176\000\000;\220\000\000\000\000\000\001Jz\000\001K\238\000\000\1410\000\000\142\200\000\000\022,\000\000\139b\000\000\000\000\000\000\000\000\000\000\000\000\000\000r\160\000\001#d\000\000rN\000\000\142\200\000\000e,\000\000\000\000\000\000\000\000\000\000\000\000\000\000\142\200\000\000\000\000\000\001+\020\000\000rP\000\000\142\200\000\000\000\000\000\000bj\000\000r\218\000\000rT\000\000\142\200\000\000\000\000\000\000bj\000\000r\224\000\000r^\000\000\142\200\000\000\000\000\000\000U\160\000\000r\178\000\000\000\000\000\000\000\000\000\001!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000~0\000\000^2\000\000\000\000\000\001/\b\000\001H\244\000\001\030\232\000\000\000\000\000\001Jz\000\001T`\000\000\1410\000\000\142\200\000\000U\160\000\000\000\000\000\001!\000\000\000\000\000\000\000\000\000\000\000^&\000\000j\232\000\000r\190\000\000rR\000\001S\164\000\000\000\000\000\000R\192\000\001G\154\000\000e\022\000\000rh\000\001!\000\000\000\\\128\000\000\000\000\000\000\000\000\000\000\\\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023\"\000\000\024\030\000\000~0\000\000\000\000\000\000^&\000\000\000\000\000\000\000\000\000\000\000\000\000\000rB\000\001G\228\000\000a\134\000\000^\026\000\000\025\026\000\000\000\000\000\000\000\000\000\000s\018\000\000\022,\000\000T\192\000\001\030\232\000\000T\192\000\000rN\000\001\030\232\000\000T\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026\022\000\000iR\000\000\000\000\000\000\000\000\000\000^H\000\000\000\000\000\000\000\000\000\000zX\000\000\000\000\000\000j\166\000\000\000\000\000\000\000\000\000\000r\146\000\000zX\000\000\000\000\000\000d\232\000\000\000\000\000\000\000\000\000\000zX\000\000k\016\000\000\000\000\000\000\000\000\000\000\022,\000\000j\238\000\000\000\000\000\000\000\000\000\001I\248\000\000f(\000\000\000\000\000\000\000\000\000\000\1410\000\0006\250\000\0006\250\000\000aj\000\000\000\000\000\000\000\000\000\000\000\000\000\000r\232\000\001#\242\000\000r\154\000\0006\250\000\000\177\022\000\000\000\000\000\000\000\000\000\000\000\000\000\0006\250\000\000\000\000\000\001+\150\000\000r\162\000\0006\250\000\000\000\000\000\000bj\000\000s0\000\000r\174\000\0006\250\000\000\000\000\000\000bj\000\000s>\000\000r\196\000\0006\250\000\000\000\000\000\000T\240\000\000s\024\000\000\000\000\000\000\000\000\000\001!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\1482\000\000`\142\000\000\000\000\000\001I\248\000\001Qj\000\000\1410\000\0006\250\000\000T\240\000\000\000\000\000\001!\000\000\000\000\000\000\000\000\000\000\000^&\000\000j\240\000\000s\026\000\000r\164\000\001G\154\000\000\000\000\000\000S\176\000\001R\134\000\000e\022\000\000r\190\000\001!\000\000\000i\140\000\000\000\000\000\000i\140\000\000\000\000\000\000\000\000\000\000\000\000\000\000<\214\000\000=\208\000\000\144\240\000\000\000\000\000\000^&\000\000\000\000\000\000\000\000\000\000\000\000\000\000r\162\000\001\030\232\000\000OX\000\000e\216\000\000>\202\000\000\000\000\000\000\000\000\000\000sh\000\0006\250\000\000\000\000\000\000\000\000\000\000?\196\000\000sd\000\000\000\000\000\000\142\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000^>\000\000dn\000\001,\024\000\000P\224\000\000\000\000\000\000bj\000\000sl\000\000P\224\000\000\000\000\000\000h\"\000\000sn\000\000\\0\000\001$\128\000\000P\224\000\000\000\000\000\001,\154\000\000P\224\000\000\000\000\000\000bj\000\000st\000\000P\224\000\000\000\000\000\000bj\000\000s|\000\000P\224\000\000\000\000\000\000\000\000\000\000bj\000\000s\134\000\000P\224\000\000\000\000\000\000\000\000\000\000g\156\000\000Y|\000\000\000\000\000\000r\196\000\000Y|\000\000\000\000\000\000\000\000\000\000g\156\000\000\000\000\000\000\"\242\000\000\000\000\000\001Jz\000\000\161$\000\000\027\018\000\000\225 \000\000\000\000\000\001\015\216\000\000\225\214\000\000\000\000\000\001\016T\000\000B\176\000\001E\146\000\000\"\242\000\001\016\224\000\000\226\140\000\000\000\000\000\001\017\\\000\000\227B\000\000\000\000\000\001\017\232\000\000\227\248\000\000\000\000\000\001\018d\000\000\228\174\000\000\000\000\000\001\018\240\000\000\229d\000\000\000\000\000\001\019l\000\000\230\026\000\000\000\000\000\001\019\248\000\000\230\208\000\000\000\000\000\001\020t\000\000\231\134\000\000\000\000\000\001\021\000\000\000\232<\000\000\000\000\000\001\021|\000\000\232\242\000\000\000\000\000\001\022\b\000\000\233\168\000\000\000\000\000\001\022\132\000\000\234^\000\000\000\000\000\001\023\016\000\000\235\020\000\000\000\000\000\001\023\140\000\000\235\202\000\000\000\000\000\001\024\024\000\000\236\128\000\000\000\000\000\001\024\148\000\000\161\192\000\000\000\000\000\000\2376\000\000\000\000\000\001\025 \000\001\025\156\000\000\237\236\000\000\000\000\000\001\026(\000\000\238\162\000\000\000\000\000\001\026\164\000\000\239X\000\000\000\000\000\001\0270\000\000\240\014\000\000\000\000\000\001\027\172\000\000\000\000\000\000\"\242\000\000\000\000\000\000_\248\000\000_&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\162\146\000\000\"\242\000\0016 \000\000\134Z\000\000\"\242\000\001\0288\000\000dP\000\000\"\242\000\0016\140\000\000\1354\000\000\"\242\000\001\028\180\000\000B\176\000\000\\f\000\000s\132\000\000\136\014\000\000\"\242\000\001\029@\000\000\136\232\000\000\"\242\000\001\029\188\000\000f6\000\000\000\000\000\000\\\204\000\000th\000\000\000\000\000\000\193\248\000\000\1444\000\000\000\000\000\000i8\000\000\000\000\000\000_f\000\000X\166\000\000\000\000\000\000\000\000\000\000\000\000\000\000s\140\000\000\000\000\000\000X\182\000\000i*\000\000\145\204\000\000]x\000\000\000\000\000\000\000\000\000\000\000\000\000\000f6\000\000]\208\000\000Y\242\000\000V\184\000\000V\166\000\000\000\000\000\000s\152\000\000\000\000\000\000\000\000\000\000s\018\000\000th\000\000Y\166\000\000th\000\001)\028\000\000_f\000\000f\\\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000f6\000\000m\186\000\000s\192\000\000f6\000\000\000\000\000\000r\224\000\000s\202\000\000f6\000\000\000\000\000\000\000\000\000\000m\186\000\000\000\000\000\000ZD\000\000\000\000\000\000k\164\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\028\014\000\000(\216\000\000k\168\000\000\136\128\000\000aB\000\000l\170\000\000uR\000\000uR\000\000S\158\000\000u\132\000\000\000\000\000\000r\240\000\000uR\000\000S\158\000\000x\248\000\000\000\000\000\000y\214\000\000\000\000\000\000z\180\000\000\000\000\000\000\000\000\000\000\127\240\000\000uR\000\000S\158\000\000\127\240\000\000r\242\000\000uR\000\000S\158\000\000\127\240\000\000\000\000\000\000\127\240\000\000\000\000\000\000\000\000\000\000\127\240\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000s\024\000\000k\170\000\000Xj\000\000s\160\000\000l\170\000\000uR\000\000\000\000\000\000Qb\000\000\000\000\000\000d\214\000\000e\182\000\000U\176\000\000a0\000\000\029\n\000\000\000\000\000\000\000\000\000\001/\b\000\001H\244\000\001\030\232\000\000\000\000\000\000th\000\000\030\006\000\000S\\\000\000s\b\000\001!\000\000\000s.\000\000Y\\\000\000\000\000\000\000S\158\000\000\000\000\000\000e\150\000\000Y|\000\000`\142\000\000\000\000\000\000g\156\000\000\000\000\000\000\031\002\000\000f6\000\000\000\000\000\000f6\000\000m\186\000\000\000\000\000\000_&\000\000\000\000\000\000\000\000\000\000w<\000\001\030\232\000\000w<\000\000r\246\000\001\030\232\000\000w<\000\000\000\000\000\000\000\000\000\000\000\000\000\000_&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\"\242\000\000\000\000\000\000\000\000\000\000_&\000\000\000\000\000\000s\184\000\000\000\000\000\000]\168\000\000\000\000\000\000y.\000\000^\252\000\000\000\000\000\000s\196\000\000\000\000\000\000\031\254\000\0016\220\000\000_f\000\000V\228\000\000S\\\000\000s\024\000\001!\000\000\000sD\000\000\\z\000\000\\z\000\000\000\000\000\000\000\000\000\000\000\000\000\000Q\190\000\000\000\000\000\000f\002\000\000Y|\000\000s\156\000\000b\174\000\000i\208\000\000k\148\000\000\000\000\000\000\000\000\000\000\000\000\000\000X\192\000\000Y|\000\000\000\000\000\000s\028\000\000Y|\000\000\000\000\000\000\000\000\000\000X\192\000\000\000\000\000\000s\172\000\000h<\000\000s>\000\000yz\000\000\000\000\000\000\130\172\000\000Y|\000\000\000\000\000\000s*\000\000Y|\000\000\000\000\000\000\000\000\000\000\130\172\000\000\000\000\000\000\000\000\000\000Q$\000\0016\220\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000f\170\000\000\022,\000\000Wd\000\000\000\000\000\000k\140\000\000_f\000\000\130>\000\000\000\000\000\000\000\000\000\000k\140\000\000\130\240\000\000t\020\000\000k\140\000\000\000\000\000\000s4\000\000t,\000\000k\140\000\000\000\000\000\000\000\000\000\000\130\240\000\000\000\000\000\000\000\000\000\000\1282\000\000(\216\000\000k\186\000\000\161\206\000\000c\208\000\000l\170\000\000q\180\000\000\000\000\000\000\000\000\000\000st\000\000l\016\000\000Xj\000\000t\000\000\000l\170\000\000q\180\000\000\000\000\000\000Qb\000\000\022,\000\000XT\000\000e\226\000\000a\004\000\000P4\000\000_f\000\000\\\132\000\000\000\000\000\000\000\000\000\000V\146\000\000sn\000\001!\000\000\000\000\000\000\000_f\000\000_\132\000\000S\\\000\000s|\000\001!\000\000\000s\162\000\000\\z\000\000\000\000\000\000Q\190\000\000\000\000\000\000g`\000\000Y|\000\000X\192\000\000\000\000\000\000\130\172\000\000\000\000\000\000i|\000\000\022,\000\000et\000\000\000\000\000\000k\140\000\000\130\240\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001D\224\000\000\000\000\000\000\240\224\000\000\000\000\000\000s\166\000\000B\176\000\001\nP\000\000t,\000\000\000\000\000\000t.\000\000\000\000\000\000y.\000\000l~\000\000S\\\000\000s\148\000\001!\000\000\000s\188\000\000Y\\\000\000\000\000\000\000R\174\000\000\000\000\000\000_\\\000\000t\020\000\000h<\000\000s\158\000\000zX\000\000\000\000\000\000e\202\000\000Y|\000\000\000\000\000\000s\142\000\000Y|\000\000\000\000\000\000\000\000\000\000e\202\000\000\000\000\000\000\000\000\000\000a\234\000\000\141\250\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000j\254\000\000\000\000\000\000i\206\000\000\000\000\000\000k\186\000\000y.\000\000i\006\000\000\000\000\000\000\000\000\000\000k\186\000\000{4\000\000tx\000\000k\186\000\000\000\000\000\000s\162\000\000t\140\000\000k\186\000\000\000\000\000\000\000\000\000\000{4\000\000\000\000\000\000\000\000\000\000\132f\000\000(\216\000\000l(\000\000\136\128\000\000\158(\000\000l\170\000\000r\188\000\000\000\000\000\000s\208\000\000l\152\000\000Xj\000\000tb\000\000l\170\000\000r\188\000\000\000\000\000\000hZ\000\000a0\000\000b\170\000\000\000\000\000\000V\146\000\000s\202\000\001(\252\000\000\000\000\000\000y.\000\000_\180\000\000S\\\000\000s\204\000\001!\000\000\000s\248\000\000Y\\\000\000\000\000\000\000R\174\000\000\000\000\000\000e\150\000\000e\202\000\000\000\000\000\000l\012\000\000\000\000\000\000m\154\000\000\000\000\000\000k\186\000\000{4\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000k\"\000\000\000\000\000\000\000\000\000\000a(\000\000\000\000\000\000k\186\000\000\241\240\000\000r\156\000\000\000\000\000\000[\012\000\000\000\000\000\000l\030\000\000sz\000\000\000\000\000\000t\134\000\000\000\000\000\000l\180\000\001S\224\000\000l\188\000\000\000\000\000\000]\208\000\000t\000\000\000a,\000\000\149\128\000\000l\172\000\000\000\000\000\000\000\000\000\000Q\220\000\000t\134\000\000\000\000\000\000\"\242\000\000gP\000\000\000\000\000\000\000\000\000\000\163.\000\000\000\000\000\000t\136\000\000\000\000\000\000O\188\000\000T.\000\000k>\000\000\000\000\000\000\000\000\000\000g\226\000\000\000\000\000\000k@\000\000\000\000\000\000\000\000\000\000k\240\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000rP\000\000\000\000\000\000\241l\000\000+\188\000\000t\006\000\000\"\242\000\000\2428\000\0017j\000\000\000\000\000\000a\170\000\000B\176\000\000\163\222\000\000i\220\000\000\"\242\000\0017\214\000\000\000\000\000\000b\132\000\000B\176\000\000\164\170\000\000B\176\000\000\\f\000\000t\138\000\000c^\000\000B\176\000\000\165v\000\000d8\000\000B\176\000\000\166B\000\000\000\000\000\0015\024\000\000B\176\000\0015\024\000\001Jz\000\000y8\000\000\243\004\000\000\000\000\000\000\000\000\000\001-\028\000\000X0\000\000^\154\000\000\000\000\000\000bj\000\000t\146\000\000X0\000\000^\154\000\000\000\000\000\000bj\000\000t\148\000\000X0\000\000^\154\000\000\000\000\000\000\000\000\000\000\243\208\000\000\000\000\000\000m\b\000\000\000\000\000\000\000\000\000\000s.\000\001L\250\000\000\000\000\000\001Jz\000\000t\012\000\000t`\000\000\000\000\000\000\000\000\000\001L\250\000\000\000\000\000\000\"\242\000\0018R\000\000\000\000\000\000\000\000\000\000jX\000\000\"\242\000\0018\190\000\000\000\000\000\000\000\000\000\000B\176\000\000\\f\000\000t\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\"\242\000\000\244\156\000\0019:\000\000\000\000\000\000B\176\000\000\\f\000\000t\156\000\000\000\000\000\000\000\000\000\000\000\000\000\000\167\014\000\000+\188\000\000t\028\000\000B\176\000\000\167\218\000\0015\024\000\000B\176\000\0015\164\000\001I\248\000\000t\230\000\001\nP\000\000X0\000\000l\180\000\000B\176\000\000\168\166\000\000\000\000\000\000\000\000\000\001-\158\000\000X0\000\000l\180\000\000\000\000\000\000bj\000\000t\168\000\000X0\000\000l\180\000\000\000\000\000\000bj\000\000t\174\000\000X0\000\000l\180\000\000\000\000\000\001\030\232\000\000X\208\000\000t4\000\000B\176\000\000\169r\000\000\000\000\000\000\170>\000\000\000\000\000\000\000\000\000\000l\212\000\000\177\244\000\000\000\000\000\000t\192\000\000\000\000\000\000\000\000\000\000z\022\000\001.\016\000\000tB\000\000\"\242\000\001.\140\000\000\171\028\000\000\000\000\000\000 \250\000\001/\b\000\000T\142\000\000j|\000\000m^\000\000W\208\000\000\000\000\000\000m\152\000\000m^\000\000\000\000\000\000t\218\000\000s\170\000\000m^\000\000\000\000\000\000t\228\000\000u\186\000\000m^\000\000\000\000\000\000w\026\000\000m^\000\000\000\000\000\000w\248\000\000m^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\176\000\000_H\000\000[\146\000\000\000\000\000\000l\188\000\000t\236\000\000\000\000\000\000t\246\000\000\"\242\000\000\000\000\000\000\000\000\000\000t\234\000\000Qb\000\000\022,\000\000`\028\000\000\"\242\000\000\000\000\000\000f6\000\000u\012\000\000\"\242\000\000\000\000\000\000ZD\000\000R\138\000\001/\b\000\000T\142\000\000\000\000\000\000t\238\000\000Qb\000\000\022,\000\000c\"\000\000\"\242\000\000\000\000\000\000!\246\000\000\"\242\000\000\000\000\000\000\"\242\000\000\000\000\000\000#\238\000\000\"\242\000\000\000\000\000\000$\234\000\000\"\242\000\000\000\000\000\000@\188\000\000\000\000\000\000\000\000\000\000g\004\000\000a,\000\000\130,\000\000_f\000\000h\230\000\000\000\000\000\000\000\000\000\000\000\000\000\000m\214\000\000\000\000\000\000\000\000\000\000n\002\000\000\000\000\000\000\000\000\000\000n\024\000\000\000\000\000\000\000\000\000\000nb\000\000\000\000\000\000\000\000\000\000\133J\000\000%\230\000\000Sp\000\000&\226\000\000'\222\000\0019\166\000\000\000\000\000\000B\176\000\000\171\232\000\000\000\000\000\000\000\000\000\000\000\000\000\000T~\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000u\014\000\000\000\000\000\000b\220\000\000u\016\000\000\000\000\000\000\000\000\000\000\172\180\000\001$\242\000\000[h\000\000[h\000\000q\206\000\000\000\000\000\000u\018\000\000\000\000\000\000ZL\000\000\000\000\000\000nj\000\000\000\000\000\000\000\000\000\000\000\000\000\000u\028\000\000t\234\000\001\030\232\000\000Sn\000\001G\228\000\000hf\000\000\000\000\000\000\000\000\000\000c\198\000\000B\176\000\001$\242\000\000u\030\000\000\000\000\000\000nj\000\000\000\000\000\000k\"\000\000\000\000\000\000u\030\000\000\000\000\000\000g\164\000\000d\238\000\000\000\000\000\000u&\000\000\000\000\000\000mx\000\000\000\000\000\000\000\000\000\000Q\220\000\000u(\000\000\000\000\000\000\"\242\000\000g\188\000\000\000\000\000\000\000\000\000\000\173P\000\000\000\000\000\000u.\000\000\000\000\000\000O\188\000\000T.\000\000nJ\000\000\000\000\000\000\000\000\000\000oV\000\000\000\000\000\000nl\000\000\000\000\000\000\000\000\000\000n\150\000\000\000\000\000\000\000\000\000\000\132\174\000\000\000\000\000\000u\006\000\000\000\000\000\001F\212\000\000\152\014\000\000\000\000\000\000uD\000\000u\028\000\000B\176\000\001C\190\000\000B\176\000\001;\222\000\000\000\000\000\000n\174\000\000\000\000\000\000\000\000\000\000l\212\000\000uT\000\000\000\000\000\000\000\000\000\001I\248\000\000eP\000\000u \000\000\000\000\000\000\000\000\000\001F\212\000\000\000\000\000\000\"\242\000\001:\"\000\000\000\000\000\000\000\000\000\000PT\000\001\030\232\000\000X\208\000\000t\216\000\000B\176\000\001/\b\000\000ud\000\000B\176\000\000\000\000\000\000\000\000\000\000uF\000\000Qb\000\000\022,\000\000l\170\000\000B\176\000\000\000\000\000\000f6\000\000uh\000\000B\176\000\000\000\000\000\000j \000\001/\b\000\000uJ\000\000Qb\000\000\022,\000\000m\026\000\000B\176\000\000\000\000\000\000A\182\000\000B\176\000\000\000\000\000\000B\176\000\000\000\000\000\000C\170\000\000B\176\000\000\000\000\000\000D\164\000\000B\176\000\000\000\000\000\000E\158\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000PT\000\000\000\000\000\000\000\000\000\000k,\000\000\"\242\000\001:\142\000\000\000\000\000\000\000\000\000\000B\176\000\000\\f\000\000ud\000\000\000\000\000\000\000\000\000\000\000\000\000\000F\152\000\000T`\000\000^`\000\000a,\000\000j\174\000\000u(\000\000\000\000\000\000ur\000\000\000\000\000\000n\182\000\000\000\000\000\000\000\000\000\000Q\220\000\000ur\000\000\000\000\000\000\"\242\000\000ih\000\000\000\000\000\000\000\000\000\000\173\172\000\000\000\000\000\000ux\000\000\000\000\000\000O\188\000\000T.\000\000nL\000\000\000\000\000\000\000\000\000\000o\142\000\000\000\000\000\000o\024\000\000\000\000\000\000\000\000\000\000o@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000u\146\000\000\000\000\000\000\245h\000\001/z\000\000\000\000\000\000T.\000\000n\166\000\000\000\000\000\000\000\000\000\000\152|\000\000PT\000\000\000\000\000\000i\200\000\000\000\000\000\000\000\000\000\000t\228\000\000\000\000\000\000\137\148\000\000u\218\000\000\000\000\000\000PT\000\000\000\000\000\000nz\000\000\000\000\000\000\000\000\000\000t\250\000\000\000\000\000\000P2\000\000t\252\000\000\000\000\000\000u\132\000\000\000\000\000\000n\242\000\000\000\000\000\000\173\174\000\000\000\000\000\000u\200\000\000\000\000\000\000u\148\000\000\000\000\000\000\141D\000\000v\020\000\000\000\000\000\000PT\000\000\000\000\000\000n\148\000\000\000\000\000\000u\224\000\000\000\000\000\000m\\\000\000\000\000\000\000\000\000\000\000P\192\000\000\000\000\000\001\029\220\000\000\000\000\000\000\171\192\000\001Pt\000\001\029\220\000\000\000\000\000\001R\172\000\001\029\220\000\000\000\000\000\001\029\220\000\000\000\000\000\001\029\220\000\000\000\000\000\000j\020\000\001\029\220\000\000u\230\000\000u\228\000\000t\236\000\001\029\220\000\000\000\000\000\001\029\220\000\000\000\000\000\000u\234\000\001\029\220\000\000\000\000\000\000u\232\000\001\029\220\000\000\000\000\000\001\029\220\000\000\000\000\000\001\029\220\000\000\000\000\000\000\000\000\000\000\000\000\000\001P\212\000\000W\198\000\001P\252\000\001S\n\000\000j\020\000\000\000\000\000\000\000\000\000\000h\204\000\000V\224\000\000\000\000\000\000`8\000\000\000\000\000\000h\204\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001P\212\000\000\000\000\000\000\148\168\000\000j\020\000\000j\020\000\000P*\000\000\000\000\000\000t\236\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000t\236\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\136\128\000\000b\028\000\000l\170\000\000uR\000\000\000\000\000\000u`\000\000m\208\000\000Xj\000\000u\232\000\000l\170\000\000uR\000\000\000\000\000\000u\252\000\000\000\000\000\000k\156\000\000\000\000\000\000v\224\000\000\000\000\000\000v\002\000\000\000\000\000\000v\004\000\000u\232\000\000B\176\000\001C\250\000\000B\176\000\001A\030\000\000\000\000\000\001%\178\000\000\000\000\000\000]H\000\000\000\000\000\000^8\000\000\000\000\000\000\000\000\000\000^\156\000\000\000\000\000\000y.\000\000fb\000\000\000\000\000\000v\030\000\000\000\000\000\000m\166\000\000\000\000\000\000\131\208\000\000\000\000\000\000v \000\000\000\000\000\000n\196\000\000\000\000\000\000\000\000\000\000U\002\000\000u\242\000\000\000\000\000\000u\196\000\000U\242\000\001Qj\000\000\000\000\000\001Qj\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\152\244\000\000PT\000\000\000\000\000\000n\152\000\000\000\000\000\000oB\000\000\000\000\000\000\000\000\000\000\146\012\000\000\150\b\000\000vb\000\000\000\000\000\000PT\000\000\000\000\000\000n\164\000\000\000\000\000\000z\244\000\000B\176\000\000ch\000\000h\188\000\000\000\000\000\000v,\000\000\000\000\000\000p\n\000\000\000\000\000\000\000\000\000\000p&\000\000\000\000\000\000\000\000\000\000p.\000\000\000\000\000\000\000\000\000\000p6\000\000\000\000\000\000\000\000\000\001I\248\000\000v\158\000\000v:\000\000\000\000\000\000l\212\000\000\000\000\000\000v<\000\000\000\000\000\001Jz\000\000\174\128\000\000_&\000\000\000\000\000\000\000\000\000\000u\178\000\000\000\000\000\000\000\000\000\000\127\150\000\000u\180\000\000\000\000\000\000\000\000\000\001!\000\000\000\000\000\000\000u\184\000\000\000\000\000\000B\176\000\000\000\000\000\0015\164\000\000\000\000\000\001\030\232\000\000fl\000\000\000\000\000\000\000\000\000\000{\212\000\000R\000\000\000P\b\000\001I\248\000\001\006.\000\000(\216\000\000m\252\000\000g\202\000\000V\000\000\000l\170\000\000w\190\000\000w\190\000\000T\142\000\000Q\030\000\000\000\000\000\000u\144\000\000w\190\000\000T\142\000\000R\014\000\000\000\000\000\000R\254\000\000\000\000\000\000S\238\000\000\000\000\000\000\000\000\000\000T\222\000\000w\190\000\000T\142\000\000T\222\000\000u\146\000\000w\190\000\000T\142\000\000T\222\000\000\000\000\000\000T\222\000\000\000\000\000\000\000\000\000\000T\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000u\180\000\000n@\000\000Xj\000\000v@\000\000l\170\000\000w\190\000\000\000\000\000\001Iv\000\001LP\000\000\150\212\000\000v\140\000\000\000\000\000\000PT\000\000\000\000\000\000oh\000\000\000\000\000\001Iv\000\001LP\000\000\153H\000\000PT\000\000\000\000\000\000o\156\000\000\000\000\000\000a\004\000\000\1616\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\\\206\000\000\000\000\000\000m\"\000\000U\176\000\000a\004\000\000G\146\000\000\000\000\000\000Y\176\000\000v\\\000\000v,\000\000B\176\000\001E\146\000\000B\176\000\001B\170\000\000\000\000\000\000H\140\000\000B\176\000\0012`\000\001/\b\000\001I\248\000\001\006\186\000\000a,\000\000I\134\000\000R\000\000\000P\b\000\001I\248\000\001\005\162\000\000B\176\000\001:\202\000\000R\136\000\000_d\000\000\000\000\000\001/\230\000\000\000\000\000\000R\000\000\000v0\000\001\030\232\000\000l\132\000\000B\176\000\0015\024\000\000B\176\000\001CR\000\001I\248\000\001\007F\000\000S\\\000\000u\184\000\001!\000\000\000u\230\000\000\\z\000\000\000\000\000\000X\232\000\000jt\000\000B\176\000\0012\220\000\000+\188\000\000u\238\000\000B\176\000\0015\024\000\000\000\000\000\000f\002\000\000vB\000\000n\166\000\001\030Z\000\000P\224\000\000o\000\000\0006\250\000\000vz\000\000\000\000\000\0006\250\000\000\000\000\000\000\000\000\000\000\000\000\000\0010\132\000\000P\224\000\000\000\000\000\000bj\000\000v\132\000\000P\224\000\000\000\000\000\000h\"\000\000v\134\000\000o\132\000\001&P\000\000P\224\000\000\000\000\000\0011\006\000\000P\224\000\000\000\000\000\000bj\000\000v\146\000\000P\224\000\000\000\000\000\000bj\000\000v\154\000\000P\224\000\000\000\000\000\000\000\000\000\000bj\000\000v\160\000\000P\224\000\000\000\000\000\000\000\000\000\000X\170\000\000Y|\000\000\000\000\000\000u\230\000\000Y|\000\000\000\000\000\000\000\000\000\000X\170\000\000\000\000\000\000B\176\000\000\000\000\000\001I\248\000\001\007\210\000\000J\128\000\000\246\004\000\000\000\000\000\001;6\000\000\246\186\000\000\000\000\000\001;r\000\000B\176\000\001F8\000\000B\176\000\001;\222\000\000\247p\000\000\000\000\000\001<\026\000\000\248&\000\000\000\000\000\001<\134\000\000\248\220\000\000\000\000\000\001<\194\000\000\249\146\000\000\000\000\000\001\018\224\000\000\250H\000\000\000\000\000\001=.\000\000\250\254\000\000\000\000\000\001=j\000\000\251\180\000\000\000\000\000\001=\214\000\000\252j\000\000\000\000\000\001>\018\000\000\253 \000\000\000\000\000\001>~\000\000\253\214\000\000\000\000\000\001\021\248\000\000\254\140\000\000\000\000\000\001>\186\000\000\255B\000\000\000\000\000\001?&\000\000\255\248\000\000\000\000\000\001?b\000\001\000\174\000\000\000\000\000\001?\206\000\001\001d\000\000\000\000\000\001@\n\000\000\139\002\000\000\000\000\000\001\002\026\000\000\000\000\000\001@v\000\001@\178\000\001\002\208\000\000\000\000\000\001A\030\000\001\003\134\000\000\000\000\000\001AZ\000\001\004<\000\000\000\000\000\001A\198\000\001\004\242\000\000\000\000\000\001B\002\000\000\000\000\000\000\000\000\000\000v\174\000\000\000\000\000\000B\176\000\000\000\000\000\000v\192\000\000\000\000\000\000\000\000\000\000\000\000\000\001\b^\000\000\"\242\000\001Bn\000\000n\214\000\000B\176\000\001B\170\000\000m4\000\000\"\242\000\001C\022\000\000o\180\000\000B\176\000\001CR\000\000B\176\000\000\\f\000\000v\186\000\000p\146\000\000B\176\000\001C\190\000\000qp\000\000B\176\000\001C\250\000\000f6\000\000\000\000\000\000f6\000\000[z\000\000v\230\000\000f6\000\000\000\000\000\000v\002\000\000v\248\000\000f6\000\000\000\000\000\000\000\000\000\000[z\000\000\000\000\000\000\000\000\000\000Kz\000\000(\216\000\000n\174\000\000g\202\000\000jt\000\000l\170\000\000w\190\000\000\000\000\000\000v>\000\000o\186\000\000Xj\000\000v\198\000\000l\170\000\000w\190\000\000\000\000\000\000m\152\000\000U\176\000\000a\004\000\000Lt\000\000\000\000\000\001/\b\000\000a,\000\000Mn\000\000S\\\000\000v.\000\001!\000\000\000vZ\000\000\\z\000\000\000\000\000\000g`\000\000X\170\000\000\000\000\000\000Nh\000\000f6\000\000\000\000\000\000f6\000\000[z\000\000\000\000\000\000{\212\000\000\000\000\000\000\000\000\000\000{\212\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\176\000\000\000\000\000\000\000\000\000\000\000\000\000\000|\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000_0\000\000|\142\000\000\000\000\000\000kn\000\000|\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"), (16, "\nm\nm\000\254\nm\nm\016\162\nm\001\n\nm\001>\001\014\nm\nm\nm\001n\nm4\202\nm\nm\nm\nm\nm\nm\nm\017j\nm\nm\nm\nm\nm\nm$n$r\001\022\nm\nm\001\242\001\246\000\014\nm\nU\nm\nm\nm\001\026\nm\nm4\206\nm\001\250\001\254\002\0024\2104\214\nm\nm\001z\001\186\nm\003\242\022\250\004b\004\190\nm\016R\031\"\016j\016z\016\158\016\234\016\238%J%R\nm\nm\nm\nm\nm\nm\nm\021\158\nm\nm\nm\nm\nm\021\210\021\246\016\242\016\246\nm4\218\022\022\nm\nm\nm\nm\nm\nm\nm<\226\nm\nm\nm \214\nm%\222\nm\nm\nm\nm\nm\nm\nm\016\250\nm\nm\nm\nm\022\"\016\254\022&\006\217\nm\nm\nm\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\004^\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\005^\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\014>\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\nm\nm\000\254\nm\nm\016\162\nm\001\n\nm\001>\001\014\nm\nm\nm\001n\nm4\202\nm\nm\nm\nm\nm\nm\nm\017j\nm\nm\nm\nm\nm\nm$n$r\001\022\nm\nm\001\242\001\246\000\014\nm\nU\nm\nm\nm\001\026\nm\nm4\206\nm\001\250\001\254\002\0024\2104\214\nm\nm\001z\001\186\nm\003\242\022\250\004b\004\190\nm\016R\031\"\016j\016z\016\158\016\234\016\238%J%R\nm\nm\nm\nm\nm\nm\nm\021\158\nm\nm\nm\nm\nm\021\210\021\246\016\242\016\246\nm4\218\022\022\nm\nm\nm\nm\nm\nm\nm5>\nm\nm\nm \214\nm%\222\nm\nm\nm\nm\nm\nm\nm\016\250\nm\nm\nm\nm\022\"\016\254\022&\006\217\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\017j\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\017n\nm\nm\nm\nm\nm\nm\nm\n=\nm\nm\nm\nm\nm\nm\nm\nm\nm\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\018\014\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\018J\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\019\242\011\t\011\t\011\t\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\005:\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\022\130\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\024\206\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\025>\025v\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\025\134\004\213\004\213\004\213\004\213\025\150\025\186\025\198\025\162\025\210\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\025\222\025\234\004\213\004\213\004\213\004\213\004\213\004\213\004\213\025\246\026\026\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\025J\025\174\026\002\026\014\026&\004\213\004\213\004\213\004\213\0262\026>\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\026\194\026z\004\213\026\202\004\213\004\213\004\213\004\213\026V\004\213\004\213\004\213\004\213\004\213\004\213\026b\026n\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\030B\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\025>\025v\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\025\134\0065\0065\0065\0065\025\150\025\186\025\198\025\162\025\210\0065\0065\0065\0065\0065\0065\0065\0065\0065\025\222\025\234\0065\0065\0065\0065\0065\0065\0065\025\246\026\026\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\025J\025\174\026\002\026\014\026&\0065\0065\0065\0065\0262\026>\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\026z\0065\0065\0065\0065\0065\0065\026V\0065\0065\0065\0065\0065\0065\026b\026n\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\025>\025v\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\025\134\006-\006-\006-\006-\025\150\025\186\025\198\025\162\025\210\006-\006-\006-\006-\006-\006-\006-\006-\006-\025\222\025\234\006-\006-\006-\006-\006-\006-\006-\025\246\026\026\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\025J\025\174\026\002\026\014\026&\006-\006-\006-\006-\0262\026>\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\026z\006-\006-\006-\006-\006-\006-\026V\006-\006-\006-\006-\006-\006-\026b\026n\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\025>\025v\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\025\134\006)\006)\006)\006)\025\150\025\186\025\198\025\162\025\210\006)\006)\006)\006)\006)\006)\006)\006)\006)\025\222\025\234\006)\006)\006)\006)\006)\006)\006)\025\246\026\026\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\025J\025\174\026\002\026\014\026&\006)\006)\006)\006)\0262\026>\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\026z\006)\006)\006)\006)\006)\006)\026V\006)\006)\006)\006)\006)\006)\026b\026n\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\025>\025v\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\025\134\006!\006!\006!\006!\025\150\025\186\025\198\025\162\025\210\006!\006!\006!\006!\006!\006!\006!\006!\006!\025\222\025\234\006!\006!\006!\006!\006!\006!\006!\025\246\026\026\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\025J\025\174\026\002\026\014\026&\006!\006!\006!\006!\0262\026>\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\026z\006!\006!\006!\006!\006!\006!\026V\006!\006!\006!\006!\006!\006!\026b\026n\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\025>\025v\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\025\134\0061\0061\0061\0061\025\150\025\186\025\198\025\162\025\210\0061\0061\0061\0061\0061\0061\0061\0061\0061\025\222\025\234\0061\0061\0061\0061\0061\0061\0061\025\246\026\026\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\025J\025\174\026\002\026\014\026&\0061\0061\0061\0061\0262\026>\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\026z\0061\0061\0061\0061\0061\0061\026V\0061\0061\0061\0061\0061\0061\026b\026n\nm\nm\nm\nm\nm!*\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\017j\nm\nm\nm\nm\nm\nm!R!~\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\022\250\nm\nm\nm\nm\031\"\nm\nm\nm\nm\nm\nm!\146\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm!\214\nm \214\nm\"\246\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm#\n\nm\nm\nm\nm\nm!*\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\017j\nm\nm\nm\nm\nm\nm!R!~\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\022\250\nm\nm\nm\nm\031\"\nm\nm\nm\nm\nm\nm!\146\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\"*\nm \214\nm\"\246\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm#\n\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm#b\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nq\nq\nq\nq\nq!*\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq!R!~\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\022\250\nq\nq\nq\nq\031\"\nq\nq\nq\nq\nq\nq!\146\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq \214\nq\"\246\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\031\"\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017 \214\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\nm\nm\nm\nm\nm!*\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\017j\nm\nm\nm\nm\nm\nm!R!~\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\022\250\nm\nm\nm\nm\031\"\nm\nm\nm\nm\nm\nm!\146\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm \214\nm\"\246\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\016\162\nm\001\030\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\017j\nm\nm\nm\nm\nm\nm$n$r\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm$z\001\"$\130\nm\nm\nm\nm\nm\nm\022\250\004b\nm\nm\nm\031\"\nm\nm$~\nm\nm%J%R\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\015\002\nm\nm\nm\nm\nm\015\006\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm \214\nm%\222\nm\nm\nm\nm\nm\nm%Z\nm\nm\nm\nm\nm\nm\nm\nm\006\217\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm&~\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nq\nq\nq\nq\nq\016\162\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq$n$r\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\022\250\nq\nq\nq\nq\031\"\nq\nq\nq\nq\nq%J%R\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq \214\nq%\222\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nm\nm\nm\nm\nm\016\162\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\017j\nm\nm\nm\nm\nm\nm$n$r\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\022\250\nm\nm\nm\nm\031\"\nm\nm\nm\nm\nm%J%R\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm \214\nm%\222\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\t\017\t\017\t\017\t\017\t\017\t\017\t\017\001\030\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017$z\001\"\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\004b\t\017\t\017\t\017\031\"\t\017\t\017$~\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\015\002\t\017\t\017\t\017\t\017\t\017\015\006\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017 \214\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017%Z\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177)\150)\162\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177)\174\016\177\016\177\016\177\016\177)\190)\202)\214)\226)\238\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177)\250*\006\016\177\016\177\016\177\016\177\016\177\016\177\016\177*\018*\030\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177***6*B*N*Z\016\177\016\177\016\177\016\177*f*r\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177*\138\016\177\016\177\016\177\016\177\016\177\016\177*\150\016\177\016\177\016\177\016\177\016\177\016\177*\162*\174\017\025\017\025\000\n\017\025\017\025\017\025\017\025\001\n,.\003\230\001\014\017\025\017\025\017\025\004j\017\025\001\018\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\001\022\017\025\017\025\001\242\001\246\000\014\017\025,\222\017\025\017\025\017\025\001\026\017\025\017\025,\234\017\025\001\250\001\254\023\002\030>-\002\017\025\017\025\001z\001\186\017\025\003\242\022\250\004b\004\190\017\025\016R\017\025\016j\016z\016\158\031*\016\238\017\025\017\025\017\025\017\025\017\025\017\025\017\025-\018\017\025\031\170\017\025\017\025\017\025\017\025\017\025\031\202\031\254\016\242\016\246-\026-2 \182\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025-:\016\250\017\025\017\025\017\025\017\025)\130\016\254)\138\017\025\017\025\017\025\017\025\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\005^\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\014>\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t+F\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\031\166\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181)\150)\162\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181)\174\016\181\016\181\016\181\016\181)\190)\202)\214)\226)\238\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181)\250*\006\016\181\016\181\016\181\016\181\016\181\016\181\016\181*\018*\030\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181***6*B*N*Z\016\181\016\181\016\181\016\181*f*r\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181*\138\016\181\016\181\016\181\016\181\016\181\016\181*\150\016\181\016\181\016\181\016\181\016\181\016\181*\162*\174\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005+F\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\031\166\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\004^\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\005\181\018\249\018\249\018\249\005\181\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm5\194\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nq\nq\000\254\nq\nq\nq\nq\001\n\nq\001>\001\014\nq\nq\nq\001n\nq\001\018\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\001\022\nq\nq\001\242\001\246\000\014\nq\nU\nq\nq\nq\001\026\nq\nq4\206\nq\001\250\001\254\002\002\004Z4\214\nq\nq\001z\001\186\nq\003\242\nq\004b\004\190\nq\016R\003\222\016j\016z\016\158\016\234\016\238\nq\nq\nq\nq\nq\nq\nq\nq\nq\021\158\nq\nq\nq\nq\nq\021\210\021\246\016\242\016\246\nq4\218\022\022\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\005\222\nq\nq\nq\nq\nq\nq\nq\nq\nq\016\250\nq\nq\nq\nq\022\"\016\254\022&\nq\nq\nq\nq\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\025>\025v\nm\nm\nm\nm\nm5\214\nm\nm\nm\nm\nm\025\134\nm\nm\nm\nm\025\150\025\186\025\198\025\162\025\210\nm\nm\nm\nm\nm\nm\nm\nm\nm\025\222\025\234\nm\nm\nm\nm\nm\nm\nm\025\246\026\026\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\025J\025\174\026\002\026\014\026&\nm\nm\nm\nm\0262\026>\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\026z\nm\nm\nm\nm\nm\nm\026V\nm\nm\nm\nm\nm\nm\026b\026n\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\025>\025v\nm\nm\nm\nm\nm5\226\nm\nm\nm\nm\nm\025\134\nm\nm\nm\nm\025\150\025\186\025\198\025\162\025\210\nm\nm\nm\nm\nm\nm\nm\nm\nm\025\222\025\234\nm\nm\nm\nm\nm\nm\nm\025\246\026\026\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\025J\025\174\026\002\026\014\026&\nm\nm\nm\nm\0262\026>\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\026z\nm\nm\nm\nm\nm\nm\026V\nm\nm\nm\nm\nm\nm\026b\026n\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m6N\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\005\185\018\249\018\249\018\249\005\185\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\t\017\t\017\000\254\t\017\t\017\t\017\t\017\001\n\t\017\001>\001\014\t\017\t\017\t\017\001n\t\017\001\018\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\001\022\t\017\t\017\001\242\001\246\t\017\t\017\t\017\t\017\t\017\t\017\001\026\t\017\t\017\t\017\t\017\001\250\001\254\002\002\004Z\t\017\t\017\t\017\001z\001\186\t\017\003\242\t\017\004b\004\190\t\017\016R\031\"\016j\016z\016\158\016\234\016\238\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\021\158\t\017\t\017\t\017\t\017\t\017\021\210\021\246\016\242\016\246\t\017\t\017\022\022\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017 \214\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\016\250\t\017\t\017\t\017\t\017\022\"\016\254\022&\t\017\t\017\t\017\t\017\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\002\238\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\tq\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\005\026\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\003\222\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\005\222\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\003\166\003\002\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\003\182\t\017\t\017\t\017\t\017\t\017\t\017\003\194\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\003\190\005\138\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\002\014\005\142\005\146\t\017\003\222\005\150\t\017\005\154\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\005\222\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\015\"\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\016*\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\018\158\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\018\178\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\019V\011\t\011\t\011\t\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\n\222\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\023\022\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\023~\023\174\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\023\186\004\213\004\213\004\213\004\213\023\194\023\230\023\242\023\206\023\254\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\024\n\024\022\004\213\004\213\004\213\004\213\004\213\004\213\004\213\024\"\024F\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\023\138\023\218\024.\024:\024R\004\213\004\213\004\213\004\213\024^\024j\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\004\213\015\226\024\166\004\213\015\234\004\213\004\213\004\213\004\213\024\130\004\213\004\213\004\213\004\213\004\213\004\213\024\142\024\154\nm\nm\nm\nm!\218\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm!\242\nm\nm\nm\nm\nm\nm!\246\"\n\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\011^\nm\nm\nm\nm\003\222\nm\nm\nm\nm\nm\nm\"\030\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\005\222\nm\".\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\"B\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\"\202\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nq\nq\nq\nq!\218\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq!\246\"\n\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\011^\nq\nq\nq\nq\003\222\nq\nq\nq\nq\nq\nq\"\030\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\005\222\nq\".\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nm\nm\nm\nm!\218\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm!\242\nm\nm\nm\nm\nm\nm!\246\"\n\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\011^\nm\nm\nm\nm\003\222\nm\nm\nm\nm\nm\nm\"\030\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\005\222\nm\".\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm$\022\nm\001\030\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm!\242\nm\nm\nm\nm\nm\nm$n$r\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm$v\001V$\130\nm\nm\nm\nm\nm\nm\011^\002\014\nm\nm\nm\003\222\nm\nm'B\nm\nm'R'b\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\015\002\nm\nm\nm\nm\nm\015\006\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\005\222\nm'\238\nm\nm\nm\nm\nm\nm'j\nm\nm\nm\nm\nm\nm\nm\nm\006\217\nm\nm\nm\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\023~\023\174\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\023\186\0065\0065\0065\0065\023\194\023\230\023\242\023\206\023\254\0065\0065\0065\0065\0065\0065\0065\0065\0065\024\n\024\022\0065\0065\0065\0065\0065\0065\0065\024\"\024F\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\023\138\023\218\024.\024:\024R\0065\0065\0065\0065\024^\024j\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\0065\024\166\0065\0065\0065\0065\0065\0065\024\130\0065\0065\0065\0065\0065\0065\024\142\024\154\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\023~\023\174\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\023\186\006-\006-\006-\006-\023\194\023\230\023\242\023\206\023\254\006-\006-\006-\006-\006-\006-\006-\006-\006-\024\n\024\022\006-\006-\006-\006-\006-\006-\006-\024\"\024F\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\023\138\023\218\024.\024:\024R\006-\006-\006-\006-\024^\024j\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\006-\024\166\006-\006-\006-\006-\006-\006-\024\130\006-\006-\006-\006-\006-\006-\024\142\024\154\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\023~\023\174\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\023\186\006)\006)\006)\006)\023\194\023\230\023\242\023\206\023\254\006)\006)\006)\006)\006)\006)\006)\006)\006)\024\n\024\022\006)\006)\006)\006)\006)\006)\006)\024\"\024F\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\023\138\023\218\024.\024:\024R\006)\006)\006)\006)\024^\024j\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\006)\024\166\006)\006)\006)\006)\006)\006)\024\130\006)\006)\006)\006)\006)\006)\024\142\024\154\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\023~\023\174\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\023\186\006!\006!\006!\006!\023\194\023\230\023\242\023\206\023\254\006!\006!\006!\006!\006!\006!\006!\006!\006!\024\n\024\022\006!\006!\006!\006!\006!\006!\006!\024\"\024F\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\023\138\023\218\024.\024:\024R\006!\006!\006!\006!\024^\024j\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\024\166\006!\006!\006!\006!\006!\006!\024\130\006!\006!\006!\006!\006!\006!\024\142\024\154\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\023~\023\174\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\023\186\0061\0061\0061\0061\023\194\023\230\023\242\023\206\023\254\0061\0061\0061\0061\0061\0061\0061\0061\0061\024\n\024\022\0061\0061\0061\0061\0061\0061\0061\024\"\024F\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\023\138\023\218\024.\024:\024R\0061\0061\0061\0061\024^\024j\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\0061\024\166\0061\0061\0061\0061\0061\0061\024\130\0061\0061\0061\0061\0061\0061\024\142\024\154\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm(z\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nq\nq\nq\nq$\022\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq$n$r\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\011^\nq\nq\nq\nq\003\222\nq\nq\nq\nq\nq'R'b\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\005\222\nq'\238\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nm\nm\nm\nm$\022\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm!\242\nm\nm\nm\nm\nm\nm$n$r\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\011^\nm\nm\nm\nm\003\222\nm\nm\nm\nm\nm'R'b\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\005\222\nm'\238\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\t\017\t\017\t\017\t\017\t\017\t\017\001\030\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017$v\001V\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\002\014\t\017\t\017\t\017\003\222\t\017\t\017'B\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\015\002\t\017\t\017\t\017\t\017\t\017\015\006\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\005\222\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017'j\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\000\254\t\017\t\017\t\017\t\017\001\n\t\017\001>\001\014\t\017\t\017\t\017\001n\t\017\001\018\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\001\022\t\017\t\017\001\242\001\246\t\017\t\017\t\017\t\017\t\017\t\017\001\026\t\017\t\017\t\017\t\017\001\250\001\254\002\002\004Z\t\017\t\017\t\017\001z\001\186\t\017\003\242\t\017\004b\004\190\t\017\016R\003\222\016j\016z\016\158\016\234\016\238\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\021\158\t\017\t\017\t\017\t\017\t\017\021\210\021\246\016\242\016\246\t\017\t\017\022\022\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\005\222\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\016\250\t\017\t\017\t\017\t\017\022\"\016\254\022&\t\017\t\017\t\017\t\017\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm8\154\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nq\000\242\nq\nq\nq\nq\001\030\nq\004\030\001F\nq\nq\nq\004>\nq\001J\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\001\150\nq\nq\001\242\001\246\000\014\nq\nU\nq\nq\nq\001\154\nq\nq4\206\nq\001\250\001\254\004\170\015\0308:\nq\nq\001z\003\238\nq\003\242\nq\002\014\003\254\nq\015&\003\222\015>\004N\000\250\015J\004r\nq\nq\nq\nq\nq\nq\nq\nq\nq\0166\nq\nq\nq\nq\nq\017\014\021\026\004v\004z\nq4\218\021.\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\nq\005\222\nq\nq\nq\nq\nq\nq\nq\nq\nq\004~\nq\nq\nq\nq\021\130\015N\021\134\nq\nq\nq\nq\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\023~\023\174\nm\nm\nm\nm\nm8\174\nm\nm\nm\nm\nm\023\186\nm\nm\nm\nm\023\194\023\230\023\242\023\206\023\254\nm\nm\nm\nm\nm\nm\nm\nm\nm\024\n\024\022\nm\nm\nm\nm\nm\nm\nm\024\"\024F\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\023\138\023\218\024.\024:\024R\nm\nm\nm\nm\024^\024j\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\024\166\nm\nm\nm\nm\nm\nm\024\130\nm\nm\nm\nm\nm\nm\024\142\024\154\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\023~\023\174\nm\nm\nm\nm\nm8\186\nm\nm\nm\nm\nm\023\186\nm\nm\nm\nm\023\194\023\230\023\242\023\206\023\254\nm\nm\nm\nm\nm\nm\nm\nm\nm\024\n\024\022\nm\nm\nm\nm\nm\nm\nm\024\"\024F\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\023\138\023\218\024.\024:\024R\nm\nm\nm\nm\024^\024j\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\nm\024\166\nm\nm\nm\nm\nm\nm\024\130\nm\nm\nm\nm\nm\nm\024\142\024\154\t\017\000\242\t\017\t\017\t\017\t\017\001\030\t\017\004\030\001F\t\017\t\017\t\017\004>\t\017\001J\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\001\150\t\017\t\017\001\242\001\246\t\017\t\017\t\017\t\017\t\017\t\017\001\154\t\017\t\017\t\017\t\017\001\250\001\254\004\170\015\030\t\017\t\017\t\017\001z\003\238\t\017\003\242\t\017\002\014\003\254\t\017\015&\003\222\015>\004N\000\250\015J\004r\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\0166\t\017\t\017\t\017\t\017\t\017\017\014\021\026\004v\004z\t\017\t\017\021.\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\005\222\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\004~\t\017\t\017\t\017\t\017\021\130\015N\021\134\t\017\t\017\t\017\t\017\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m9\018\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\n\238\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229/j\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\016\229\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249?\006\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\018\249\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\015\022\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\005&\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\017\005\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177@\150@\162\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177@\174\016\177\016\177\016\177\016\177@\190@\202@\214@\226@\238\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177@\250A\006\016\177\016\177\016\177\016\177\016\177\016\177\016\177A\018A\030\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177A*A6ABANAZ\016\177\016\177\016\177\016\177AfAr\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177\016\177A\138\016\177\016\177\016\177\016\177\016\177\016\177A\150\016\177\016\177\016\177\016\177\016\177\016\177A\162A\174\017\025=\174\017\025\017\025\017\025\017\025\001\030Bv>j\001F\017\025\017\025\017\025>\142\017\025\001J\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\001\150\017\025\017\025\001\242\001\246\000\014\017\025/R\017\025\017\025\017\025\001\154\017\025\017\025B\174\017\025\001\250\001\254>\226?\002B\194\017\025\017\025\001z\003\238\017\025\003\242\011^\002\014\003\254\017\025\015&\017\025\015>\004N\000\250?\018\004r\017\025\017\025\017\025\017\025\017\025\017\025\017\025B\198\017\025?\"\017\025\017\025\017\025\017\025\017\025?:?N\004v\004zB\2065\158?\142\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025\017\025B\230\004~\017\025\017\025\017\025\017\025@\130\015N@\138\017\025\017\025\017\025\017\025\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\n\238\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233/j\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\016\233\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\015\022\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\005&\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\017\t\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181@\150@\162\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181@\174\016\181\016\181\016\181\016\181@\190@\202@\214@\226@\238\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181@\250A\006\016\181\016\181\016\181\016\181\016\181\016\181\016\181A\018A\030\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181A*A6ABANAZ\016\181\016\181\016\181\016\181AfAr\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181\016\181A\138\016\181\016\181\016\181\016\181\016\181\016\181A\150\016\181\016\181\016\181\016\181\016\181\016\181A\162A\174\r\189\n\189\n\189\001*\n\189\n\189\r\189\n\205\012\133\r\189\r\189\012\133\012\133\016\230\t\225\r\189\r\189\r\189\001\205\r\189\r\189\r\189\001\205\r\189\r\189\tB\r\189\r\189\015\226\r\189\005\166\015\234\r\189\r\189\r\189\r\189\r\189\r\189\r\189\002\254\003\002\t\018\nA\r\189\nA\001.\t^\r\189\r\189\r\189\004\162\r\189\n\238\r\189\r\189\r\189\r\189\r\189\r\189\011\178\r\189\003\254\003B\r\189\r\189\r\189\004N\000\250\006\241\r\189\003R\n\189\r\189\r\189\r\189\r\189\r\189\011\182/j\003\222\012\133\r\189\r\189\003b\006\241\n\189\015\254\r\189\r\189\005\030\001v\015\226\r\189\n\189\015\234\r\189\004R\r\189\r\189\003&7F\r\1897R\r\1897b7r7\134\r\189\r\189\r\189\019\017\r\189\018\218\r\189\nA\r\189\r\189\r\189\005\222\r\189\012\233\nM\r\189\r\189\r\189\nA\012\233\nA\012\137\012\233\012\233\012\137\012\137\000\238\019\017\012\233\012\233\012\233\019\017\012\233\012\233\012\233\nA\012\233\012\233\007\214\012\233\012\2338\218\012\233\000\250\b\209\012\233\012\233\012\233\012\233\012\233\012\233\012\233\001^\n%\005F\001\130\012\233\003\222\005>\nM\012\233\012\233\012\233\004\162\012\233\n\238\012\233\012\233\012\233\012\233\012\233\012\233\n%\012\233\003\254\003*\012\233\012\233\012\233\004N\000\250\b\194\012\233\003V\b\202\012\233\012\233\012\233\012\233\012\233\000q/j\000m\012\137\012\233\012\233\005\222\016\186\n%\t=\012\233\012\233\022\134\001\182\0046\012\233\003Z\004\018\012\233\0036\012\233\012\233\n=2&\012\23322\012\2332B2R2f\012\233\012\233\012\233\t=\012\233\b\210\012\233\t=\012\233\012\233\012\2338*\012\233\r\185#\238\012\233\012\233\012\233\t\029\r\185\b\222.\166\r\185\r\185\012I\012I\006\r\004\238\r\185\r\185\r\185\n\141\r\185\r\185\r\185\n\229\r\185\r\185\006&\r\185\r\185\005\246\r\185\b\234\003\222\r\185\r\185\r\185\r\185\r\185\r\185\r\185\003\018\000q\006\r\000m\r\185\n\141\001.\003\222\r\185\r\185\r\185\004\162\r\185\b\242\r\185\r\185\r\185\r\185\r\185\r\185\003*\r\185\003\254#\246\r\185\r\185\r\185\004N\000\250\n\002\r\185\005\222\n\n\r\185\r\185\r\185\r\185\r\185\t\029\004\242\004\246\012I\r\185\r\185\003\002\rJ\005\222\tE\r\185\r\185\023\026\001v\n=\r\185\019\250\001\182\r\185\015~\r\185\r\185=\214\029\194\r\185\029\206\r\185\029\222\029\238\030\002\r\185\r\185\r\185\tE\r\185\n\018\r\185\tE\r\185\r\185\r\185\n=\r\185\014-\006\r\r\185\r\185\r\185\t%\014-\n\030\004\002\014-\014-\020\"\000\014\004\206\005.\014-\014-\014-\n\149\015r\014-\014-\016\198\014-\014-\n\221\014-\014-\b\209\014-\n*\003\222\014-\015\182\014-\014-\014-\014-\014-\004\n\004\242\015\130\n\221\014-\n\149\005>\003\222\015\186\014-\014-\015\194\014-\n2\014-\014-\014-\014-\014-\014-\005\158\014-\003\254\bF\014-\014-\016N\004N\000\250\011\242\014-\005\222\r\026\014-\014-\014-\014-\014-\t%\b=\017\138\000\014\014-\014-\nU\rJ\005\222\tA\014-\014-\024\210\001\182\003v\014-\n\221\004\210\014-5\154\014-\014-=\214\027\194\021\150\027\206\014-\027\222\027\238\028\002\014-\014-\014-\tA\014-\r\"\014-\tA\014-\014-\014-\n=\014-\rY\030r\014-\014-\014-\t!\rY\r.\020\222\rY\rY\018\178\005\162\007\0145\158\rY\rY\rY\n\173\015r\rY\rY\019V\rY\rY\003\174\rY\rY\019Z\rY\r:\003\222\rY\015\182\rY\rY\rY\rY\rY\003\178\n\221\b=\031\150\rY\n\173\005>\003\222\015\186\rY\rY\015\194\rY\rB\rY\rY\rY\rY\rY\rY\003>\rY\003\254&N\rY\rY\016N\004N\000\250 V\rY\005\222 f\rY\rY\rY\rY\rY\t!\006\226\n\250\001v\rY\rY\007\129\rJ\005\222\t9\rY\rY\024\2106R\007\129\rY\018\218\003\218\rY\024\250\rY\rY=\214\027\194\021\150\027\206\rY\027\222\027\238\028\002\rY\rY\rY\t9\rY r\rY\t9\rY\rY\rY\n=\rY\012\229$\166\rY\rY\rY\t\025\012\229 \130\t\181\012\229\012\229\t\181\t\181\n=\0182\012\229\012\229\012\229\n\173\012\229\012\229\012\229\003*\012\229\012\2296\234\012\229\012\229\018\178\012\229 \146\003\222\012\229\012\229\012\229\012\229\012\229\012\229\012\229\019V\004\242\024\254\0186\012\229\n\173\001.\003\222\012\229\012\229\012\229\004\162\012\229 \158\012\229\012\229\012\229\012\229\012\229\012\229\005\237\012\229\003\254(N\012\229\012\229\012\229\004N\000\2504\222\012\229\005\2224\238\012\229\012\229\012\229\012\229\012\229\t\025\n\205\0046\t\181\012\229\012\2296z\rJ\005\222\n\222\012\229\012\2299\022\001v\017~\012\229\006\246\n=\012\229\b\145\012\229\012\229=\2149>\012\2299J\012\2299Z9j9~\012\229\012\229\012\229\006U\012\2294\250\012\229\006U\012\229\012\229\012\229\017\130\012\229\014\021\016\134\012\229\012\229\012\229\006q\014\0215\n\021\018\014\021\014\021\019>\nA\005\021\n\133\014\021\014\021\014\021\n\133\005\n\015\174\025\018\005\237\014\021\014\021\t\249\014\021\014\021\016\133\014\0215\026\003\222\014\021\025\026\014\021\014\021\014\021\014\021\014\021\019B\nA\n\205\015\226\014\021\0059\015\234\003\222\025\030\014\021\014\021\014\021\014\0215&\014\021\014\021\014\021\014\021\014\021\014\021\b\145\014\021\014\021\006U\014\021\014\021\025*\014\021\014\021\003f\014\021\005\222\020\030\014\021\014\021\014\021\014\021\014\021\006q\n\133\011\029\t\141\014\021\014\021\0112\006U\005\222\006\133\014\021\014\021&\194\000\029\003j\014\021\ne\005\021\014\021\011!\014\021\014\021>\018\001.\026\134\n\133\014\021\000\189\007I\n\133\014\021\014\021\014\021\006\133\014\021'\226\014\021\006\133\014\021\014\021\014\021\000\029\014\021\rA\005\021\014\021\014\021\014\021\004V\rA\005J\000\189\rA\rA\019\146\000\189\005\182\014\174\rA\rA\rA\ne\015r\016F\021\142\n\222\rA\rA\0012\rA\rA\011\029\rA\017y\003\222\rA\015\182\rA\rA\rA\rA\rA\019\150\t\141=\206\011\029\rA\006\166\004.\018\210\015\186\rA\rA\015\194\rA\018\218\rA\rA\rA\rA\rA\rA\011!\rA\003\254\003\014\rA\rA\016N\004N\000\250\007I\rA\005\222\017y\rA\rA\rA\rA\rA\000\189\017\174$:%\210\rA\rA\007\133\r\134\b\209\ti\rA\rA+\162\026\230\007\133\rA\018\218\001\030\rA\004J\rA\rA\012\014\005~\021\150\017y\rA\003\214\014J\000\189\rA\rA\rA\017y\rA\017y\rA\b\157\rA\rA\rA\000]\rA\000\254\014b\rA\rA\rA\001\n\n\246\001>\001\014\017y\n\250\001v\001n\n=\001\018\001\166\001\170\nu\015\218\016&\nu\nu\000]\002\006\012\153\000]\000]\012\153\012\153\022\226\005V\001\178\001\206\001\210\001\214\001\218\001\222\001\226\t\233\004b\006\198\n=\001\026\003\222\005\134\002\n\022\230\004\174\004\178\002\002\004Z\004\230\012\018\012&\001z\001\186\004\182\004\186\nu\004b\004\190\007\210\016R\003\222\016j\016z\016\158\016\234\016\238\n=\019\210\011\022\011\026\011\030\011\"\011&\006\210\b\157\021\158\012\133\011*\011.\005\222\017F\021\210\021\246\016\242\016\246\012u\nu\022\022\012u\012u\b\006\000]\b\005\012\153\nu\019\214\nu\004R\017J\005\222\012\133\r\198\nu\014b\012\133\0116;\246\011\194\nu\016\250\nu\005\166\011:\nu\0236\016\254\022&\000\254\r\222\011B\011F\003\130\001\n\006\225\001>\001\0149\190\b\149\007\134\001n\007R\001\018\001\166\001\170\nu\019\246\021~\nu\nu\000]\001\174\007M\000]\000]\005^\016\202\017\182\006\162\001\178\001\206\001\210\001\214\001\218\001\222\001\2264\002\005>\012u\n=\001\026\003\222\003\162\001\230\n\222\004\174\004\178\002\002\004Z\007u\005v\014>\001z\001\186\004\182\004\186\nu\004b\004\190\012\n\016R\003\222\016j\016z\016\158\016\234\016\238\019\250\001\182\011\022\011\026\011\030\011\"\011&\b\213\011\198\021\158\007u\011*\011.\005\222\018\018\021\210\021\246\016\242\016\246\t\185\nu\022\022\t\185\t\185\b\149\000]\b\005\020B\nu\020N\nu\020b\003\014\005\222\001.\t\"\nu\014b\007M\01167\194\006\241\nu\016\250\bM\n\165\011:\nu\0236\016\254\022&\000\254\t:\011B\011F\006n\001\n\tB\001>\001\014\031\218\b5\006=\001n\nA\001\018\001\166\001\170\bM\bM\n\165\bM\bM\006M\002\006\0212\006M\006M\n\250\001v\028^\027\214\001\178\001\206\001\210\001\214\001\218\001\222\001\226\021\226\007u\t\185\nA\001\026\0286\bM\002\n\n\222\004\174\004\178\002\002\004Z\006\017\003\222\003\002\001z\001\186\004\182\004\186\bM\004b\004\190\bM\016R\003\222\016j\016z\016\158\016\234\016\238\0216\001v\011\022\011\026\011\030\011\"\011&\t\t\n\213\021\158\006\017\011*\011.\005\250\006=\021\210\021\246\016\242\016\246\001\030\bM\022\022\005\222 B\b5\006M\005: \222\bM!\150\n\197\t\t\bM\005\222\t\t\t\t\bM\005\170\004b\0116\023\006@b\003\222\016\250\be!&\011:\bM\0236\016\254\022&\000\254.F\011B\011F\018\218\001\n\001.\001>\001\014\005\198\003\002\t\145\001n\014j\001\018\001\166\001\170\be\be\005\214\be\be\022\030\001\174\019%\n\213\027\218\021\154\t\2453\230\005\222\001\178\001\206\001\210\001\214\001\218\001\222\001\226\003\206\006\017\n\2132\154\001\026\017\198+F\001\230\011\221\004\174\004\178\002\002\004Z\001b\t\t\020\166\001z\001\186\004\182\004\186\be\004b\004\190\031\166\016R\003\222\016j\016z\016\158\016\234\016\238\nA\005\158\011\022\011\026\011\030\011\"\011&\b\189\026\230\021\158,\018\011*\011.+\154\003J\021\210\021\246\016\242\016\246\007\214\be\022\022\t\145\002\014\006\162\b\209\006\214\tY\be,\022\011\210\b\189\be\005\222\b\189\b\189\be\003\222\003\222\0116>\230\029\214\n=\016\250\005U\005U\011:\be\0236\016\254\022&\000\254\014f\011B\011F,\"\001\n\011\221\001>\001\014\028*\007\234\011z\001n\n\149\001\018\001\166\001\170\005U\005U\n=\005U\005U\b\017\005\162\007\014\005\222\005\222\005}$Z\011~\b\017\001\178\001\206\001\210\001\214\001\218\001\222\001\226\014\162\001~\014\154\005\218\001\026\015\226\003\006\005\"\015\234\004\174\004\178\002\002\004Z\006\026\b\189\014b\001z\001\186\004\182\004\186\005U\004b\004\190\001\134\016R\003\222\016j\016z\016\158\016\234\016\238\007\186\012\014\011\022\011\026\011\030\011\"\011&\t\225\b\157\021\158\t\233\011*\011.\n\149\001\138\021\210\021\246\016\242\016\246\007\214\005U\022\022\005}\005}\028Z\b\209\b\005\n\149\005U\031z\028B\bF\005U\005\222\001\142\n\189\n]\029\218\003\222\0116\005U\017*\003\014\016\250\b\005\b\005\011:\005U\0236\016\254\022&\000\254\011z\011B\011F\011\134\001\n\nM\001>\001\014\n\189\006R\006a\001n\n=\001\018\001\166\001\170\b\005\b\005\011~\b\005\b\005\011\138\012\018\012&\011\202\005\2225J!.\n]\n]\001\178\001\206\001\210\001\214\001\218\001\222\001\226\006\249\n]\b\157\n=\001\026\n]\027\030\022\138\n]\004\174\004\178\002\002\004Z\nM\003\222\b\017\001z\001\186\004\182\004\186\b\005\004b\004\190\b\017\016R\003\222\016j\016z\016\158\016\234\016\238\027\022!6\011\022\011\026\011\030\011\"\011&\b\217\004R\021\158\019\t\011*\011.\n]\006a\021\210\021\246\016\242\016\246\014\130\b\005\022\022\005\222\n\189\027\158\007\182\b\005\b&\b\005\031\138\004\018\n\189\b\005\005\222\019\t\014\146\n]\016~\019\t\0116\b\005BF\006~\016\250\b\t\b\t\011:\b\005\0236\016\254\022&\000\254\014b\011B\011F\b\130\001\n\019\017\001>\001\014)\014\019\017.\006\001n\n=\001\018\001\166\001\170\b\t\b\t\t\t\b\t\b\t\t\t\t\t\b\189\011\202\n\141\b\189\b\189\n]\n]\001\178\001\206\001\210\001\214\001\218\001\222\001\226\n=\n]\006\134\020j\001\026\n]\0276\023\030\n]\004\174\004\178\002\002\004Z\015\018\n\141\016\218\001z\001\186\004\182\004\186\b\t\004b\004\190\003\133\016R\003\222\016j\016z\016\158\016\234\016\238\020n#\246\011\022\011\026\011\030\011\"\011&$.\015\022\021\158\001\030\011*\011.\n]\001\213\021\210\021\246\016\242\016\246\028\006\b\t\022\022\t\t\030~\026\162\005&\b\t\b\189\b\t<\030\001\030\028\030\b\t\005\222\n=\031\166\n]\006\150#\146\0116\b\t\026\246\001\213\016\250\b\r\b\r\011:\b\t\0236\016\254\022&\000\254\024\242\011B\011F\014j\001\n\027\006\001>\001\014\n=+:\n=\001n\003\133\001\018\001\166\001\170\b\r\b\r\016\022\b\r\b\r \190\006\178\014j\011\202-\202\b1+\198\n]\n]\001\178\001\206\001\210\001\214\001\218\001\222\001\226\026\138\n]\026\154 \198\001\026\n]\027F\024\214\n]\004\174\004\178\002\002\004Z\b1\028\"\015\022\001z\001\186\004\182\004\186\b\r\004b\004\190\016\146\016R\003\222\016j\016z\016\158\016\234\016\238\018\"\005&\011\022\011\026\011\030\011\"\011&\t\181+F\021\158\002\246\011*\011.\n]\ty\021\210\021\246\016\242\016\246\006\202\b\r\022\022\028\182\001\018\n\229\031\166\b\r\018&\b\r<&\016\166\t\181\b\r\005\222\t\181\t\181\n]&\254&\170\0116\b\r\b1\ty\016\250\017>+V\011:\b\r\0236\016\254\022&\000\254\021*\011B\011F;\166\001\n\017B\001>\001\014\011\217\017\201'\002\001n\019\t\001\018\001\166\001\170\019\t-\206\n\181\t=\n\229\016\150\t=\t=\011\202\016\238\n\229<2\n]\n]\001\178\001\206\001\210\001\214\001\218\001\222\001\226+\150\n]\018\218\007\n\001\026\n]\016\2429\026\n]\004\174\004\178\002\002\004Z\011z\t\181\b1\001z\001\186\004\182\004\186\005:\004b\004\190\003\222\016R\003\222\016j\016z\016\158\016\234\016\238\011~\016\250\011\022\011\026\011\030\011\"\011&-\214\026\230\021\158+F\011*\011.\n]$N\021\210\021\246\016\242\016\246\005.\011\217\022\022\020\142\t=\007\250\005.\016\158\031\166\000\006'\006\000\n\005\222\b5\005\222\000!\001\n\002\234\003\230\001\014\0116\017\178\nM\004j\016\250\001\018\n:\011:\011!\0236\016\254\022&\021\242=R\011B\011F\016\153\016\153CJ\011f \222\022\150\001\022\000! \226\001\242\001\246\000\014\003\206\005*5F\028\n<6\001\026\n=\028\014\005B\014b\001\250\001\254\023\002\030>\030J\002\254\017\197\001z\001\186\nM\003\242\022\250\004b\004\190 \242\016R\031\"\016j\016z\016\158\031*\016\238\012\157\026\230\nA\012\157\012\157 \246\003B\031b\019%\031\170\001\030\017\022\003\210\003J\003R\031\202\031\254\016\242\016\246 . R \182\002\014\007\022\012\157\016\153\003\222\003b\012\157\011\210Cg\011!\000\133 \214*\202\004\018\000\133\000\133\000\133\000\133\000\133-\230 \218\016\250\000\133\000\133\000\133\000\133)\130\016\254)\138\000\133\000\133\000\1335N\017\154\000\133\018\238-\182\007\030\020\230\016\157\016\157\000\133\000\133\005\222\000\133\000\133\000\133\029j\000\133\029\130\012\157\000\133\000\133\000\1335z\000\1334z\000\133\000\133\000\133\000\133\000\133\000\133\020\234\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\006M\000\133\007I\020\178$\026\031\018\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\016\157\001J\000\222\006M\000\133\021\218\006M\006M\018\218\002\222\020\182\000\133\tE\000\133\000\133\tE\tE\007z\000\133\000\133\000\133\000\133\011v\003\209\n\222\n\229\000\133\000\133\000\133\003\209\003\209\n\229\015r\016F\021\142\011\130\003\209\003\209\028\206\003\209\003\209\018J\003\209\022\006\003\222\003F\015\182\003\209\003\209\003\209\003\209\003\209\019\242\003\222;\030\004r1\202\026\230\006\026\014\002\015\186\003\209\003\209\015\194\007I\001\030\028\210\005R\019\014\017y\003\209\003\209\031\210\004v\003\254\006M\n=\003\209\016N\004N\000\250\b\157\018\218\005\222\tE\003\209\003\209\003\209\003\209\003\209\003J\007\133\005\222\017y\003\209\003\209\017y\017y\005.\004~\n\237\026\230#\198\001\205,>\003\209\n:\001\030\003\209\001\2346b\003\209\005V\007\017\021\150\007\133\003\209\007\017\007\133\002\014\003\209\003\209\003\209\003\222\003\209\n\237\005&\001\205\003\209\003\209\003\209\001\205\r\t\019f\017y\003\209\003\209\003\209\r\t\r\t\003\190\r\t\r\t\r\t\015\002\r\t\r\t\017Z\r\t\r\t\015\006\r\t\017\154\012I\007\017\r\t\r\t\r\t\r\t\r\t\r\t\007\174\005\222\003\150\b\157\017y\031B\023*\031N\r\t\r\t\r\t\r\t\017y\003\206\017y\027\1860\146\017y\r\t\r\t\012I\027V\r\t\006\153\007\017\r\t\r\t\r\t\r\t\n\222\007\206\017y\007\017\r\t\r\t\r\t\r\t\r\t\007\133\007\129\027\190\017y\r\t\r\t\017y\017y\007\133\n\237\020\"\022\214\007\017\007\017;\174\r\t2\182\n\237\r\t\003\210\003J\r\t\020\"\003\222\r\t\007\129\r\t\018\218\007\129\002\014\r\t\r\t\r\t\003\222\r\t\011\198\011\210\015\022\r\t\r\t\r\t\006\153\r\017\n=\017y\r\t\r\t\r\t\r\017\r\017\012\137\r\017\r\017\r\017\005&\r\017\r\017\020>\r\017\r\017\019.\r\017\005\222\007\230\n=\r\017\r\017\r\017\r\017\r\017\r\017\027\250\005\222\003\150\012\137\017y\007\"\024\226\012\137\r\017\r\017\r\017\r\017\017y\003\206\017y\005U\0192\028\138\r\017\r\017\tA\n=\r\017\tA\tA\r\017\r\017\r\017\r\017\n=\007\246\017y \238\r\017\r\017\r\017\r\017\r\017\007\129\005U \014\017y\r\017\r\017\017y\017y\007\129\005^\020\"\006\201\005j\b\018\t\246\r\0172\210\021V\r\017\003\210\003J\r\017\028\218\003\222\r\0175\182\r\017\003\006\027&\002\014\r\017\r\017\r\017\003\222\r\017\014>\011\210\006\201\r\017\r\017\r\017\018\218\r\025\027\254\017y\r\017\r\017\r\017\r\025\r\025\028\222\r\025\r\025\r\025\tA\r\025\r\025\t\238\r\025\r\025<\234\r\025\005\222\028\142\n=\r\025\r\025\r\025\r\025\r\025\r\025\b\026\005\222\005~\023b\017y\n:\001.\b\005\r\025\r\025\r\025\r\025\017y\005U\017y6\254\026\234\014N\r\025\r\025\t9\029\186\r\025\t9\t9\r\025\r\025\r\025\r\025\n%\n\230\017y\n\222\r\025\r\025\r\025\r\025\r\025\b:\011e\003*\017y\r\025\r\025\017y\017y\029\190\006\185\n%\015\022\018\162\014v/&\r\0252\234\027\014\r\025\b\178\027>\r\025\b^\003\222\r\025\019j\r\025\019v\005&\019\138\r\025\r\025\r\025\006\185\r\0255N\n%\006\185\r\025\r\025\r\025\003\018\r\001\027N\017y\r\025\r\025\r\025\r\001\r\001\001\030\r\001\r\001\r\001\t9\r\001\r\001\015\022\r\001\r\001\n=\r\001\005\222\b\182\b\142\r\001\r\001\r\001\r\001\r\001\r\001\029\250\022\146\005~\005&\017y\n:\003\222\b\186\r\001\r\001\r\001\r\001\017y\028\170\017y\006\030\017\205\n=\r\001\r\001\001\030\018\218\r\001!&\017\154\r\001\r\001\r\001\r\001\028\006\b\158\017y\003*\r\001\r\001\r\001\r\001\r\001*\246\t\185+\n\030\006\r\001\r\001\br\005\222\006\185\023&'*#\178\028~7.\b\166\r\0012\246\003*\r\001\011\134\003\206\r\001\n%\0146\r\001\t\185\r\001\014j\t\185\t\185\r\001\r\001\r\001\001\n\r\001'.\001\014\011\138\r\001\r\001\r\001\n%\b\150\029\254\001Q\r\001\r\001\r\001\000\018\000\022\000\026\000\030\000\"\015\022\000&\000*\000.\0002\0006\028\142\000:\000>\000B\014\209\003\210\003J\000F\n%\001Q\001Q\005&\001Q\001Q\000J\002\014\028\"\028\230 ^\003\222\000N\029\018\011\210\015r\014\209\014\209\030\206\000R\000V\000Z\000^\000b\000f\022V\000j\000n\023J\015\182\t\185\"\238\000r\000v \222\001\213\005:\012y->\004\190\012y\012y\001Q\015\186\016z\016\158\015\194\024\222\016\246\000z\005\222\000~\000\130\n%,\238'2\006E\003\254\000\134\000\138\000\142\016N\004N\000\250\000\146\000\150\000\154\000\158\t\001\000\162\000\166\000\170\n%\001Q\b\214\n%/b\000\174\000\178\000\182\006E\001Q\019%\000\186\006E\000\190\000\194(\166 \222\001Q$>\ty.\"\000\198\n%\000\202\t>\021\150\n%\001Q\001Q\000\206\000\210\000\214\002\018\002\022\002\026\002\030\002\"\012y\002&\002*\002.\0022\0026\n\222\002:\002>\002B\nM\n%\003\222\002F\015r\016F\021\142\019\130\001\161\028^\002J\014b\001\161<>\026\230\n=\002N\019%\015\182\b\213\003\018\"R\tJ\002R\002V\002Z\002^\002b\002f\b\226\002j\002n\015\186\nu\019\134\015\194\002r\002v\b5\028\254\002\025\005\222\022\182\n=\002\025\nM\003\254\"Z\"n\030\014\016N\004N\000\250\002z\nA\002~\002\130\nu\017\197\006\2090j\nu\002\134\002\138\002\142\n\190 \242\011=\002\146\002\150\002\154\002\158\t*\002\162\002\166\002\170\011^\030\018\031\166 \246\n\022\002\174\002\178\002\182\011\246\006\209\021\150\002\186\"\130\002\190\002\194\011=\011=\004\018\011=\011=\n=\002\198\nu\002\202\022\182\012\n\004\193\006\209+:\002\206\002\210\002\214\004\193\004\193\n=\015r\016F\021\142=\163\004\193\004\193\006\209\004\193\004\193\029\n\004\193\"\186\028\142\n=\015\182\004\193\004\193\004\193\004\193\004\193\003\0022:\019\194\0296\007}\018\218\nu\n=\015\186\004\193\004\193\015\194.\190 \222\nu\003\018\020\014/\182\004\193\004\193\nu\b\178\003\254\030\026\b^\004\193\016N\004N\000\250\019\198\006\209\005&\007}\004\193\004\193\004\193\004\193\004\193\n\"\006=\nN\011\029\004\193\004\193\011=\011\154\t\186\018J\011=\005U\005U\030\030\011=\004\193\011=7Z\004\1935\250\011=\004\193\011\170\019%\021\150\006=\004\193\b\182\006=\006=\004\193\004\193\004\193\012\233\004\193\028\142\005U6\002\004\193\004\193\004\193\003\222\b\186\001\030\t\190\004\193\004\193\004\193\006\241\028\142\012\233\012\233\028\006\012\233\012\233\012\233\015\022\012\233\012\233\006\241\012\233\012\233\003\006\012\2332j\b\158\003\222\012\233\012\233\012\233\012\233\012\233\012\233\005&\007}\tB\002\246\t\210\028N2>\005\222\012\233\012\233\012\233\017\006\020Z\011\029\b\166\014j\006\241\020\018\012\233\012\233\n=\b\174\004\190\020\"\006=\012\233\012\233\016z\016\1586\242\n%1>\005\222\012\233\012\233\012\233\012\233\012\233\n\134\020^\b\005\012\233\012\233\012\2337*\006\241\005U\006\241\011\222\n%\014N)b\n\186#\1346\246\006\241\012\233\006\241\012\233 \2387^\r\226\012\233\028\"\012\233\n\157\003\166\003\002\012\233\012\233\012\233\006\193\012\233#\170\006\241\n%\012\233\012\233\012\233\nM\000]#\138\003\182\012\233\012\233\012\233\011j\001\030\017\026\003\194\001F\003\018\017\"\n\157\014b\006\193\001J\001\166\001\170\006\193<\238#\174\011n!\018\000]\021:\r\234\000]\000]\b\181\026\230\003\190\005\138\n\254\001\206\001\210\011\002\021>\001\222\001\226\006\201\002\014\005\142\005\146\nM\003\222\005\150\017.\005\154\011\n\021B\011\142\001v\b\181+R\020~\014\030\b\181\004\182\011\018\018J\002\014\n=\014\206\0176\003\222\018\026&\242\018*\018:\004r\019\242\n=\011\022\011\026\011\030\011\"\011&9R\b1\011\029\005&\011*\011.\005\222\006\241\029B\006\185\004v\004z\n=\018b\004\018\n\157\b\181&\246\000]\028b\007\"\006\193\007&\0306\021F\028\154\005\222+F\r\1985\250\003J\006\241\0116\006\185\006\241\006\241\004~\006\185$\018\011::\186\011>\018f\004\189\031\166\r\222\011B\011F\030:\004\189\004\189\012u\015r\016F\021\142\b\181\004\189\004\189\011\226\004\189\004\189\022\182\004\189%>(\206\001\030\015\182\004\189\004\189\004\189\004\189\004\189\006\241\n\198\b\181\012u9\226+z\006\209\012u\015\186\004\189\004\189\015\194\b1\011\029\000\250\018\218+V\020\130\004\189\004\189\028\142:\190\003\254\020\":\134\004\189\016N\004N\000\250\006\241\001.\006\241/\206\004\189\004\189\004\189\004\189\004\189\014j\006\241$\178\006\241\004\189\004\1899V\006\185;r\011N\"&\028\242\006\209\011V2\194\004\1892\218\001\030\004\189\027v\006\241\004\189\nU\011\166\021\150\006\133\004\189:\194\006\133\006\133\004\189\004\189\004\189\003\209\004\1898z.2\017\166\004\189\004\189\004\189\003\222:\198\005:;v\004\189\004\189\004\189\017y'\018\003\209\003\209\nu\021\190\022.\023B8*\003\209\003\209B\134\003\209\003\209\017\154\003\209\005V:\170\003\222\0226\003\209\003\209\003\209\003\209\003\2095\158'\022\011\1903\174;\1383\190\bb\005\222\022:\003\209\003\209\023J'J&::\178\003\018\017y(:\003\209\003\209\nu:\186\004\190\007\210\006\133\003\209\0312\016z\016\158':\003\018\015\022\005\222\003\209\003\209\003\209\003\209\003\2091\190\011\254'N\003\209\003\209\003\209?\150\005~\nv\017y\005&4\226\001\030\nu2^2r'>\017y\003\209\017y3\214\nu!\162&J\031>?\158\003\209(J1\194\nu\003\209\003\209\003\209\022\182\003\209\nu\017y\"\142\003\209\003\209\003\209\b\194\003\1772v\b\202\003\209\003\209\003\209\003\177\003\177\006\209\015r\016F\021\1429\"\003\177\003\177\014j\003\177\003\177\015\017\003\177CV\012\006\003\002\015\182\003\177\003\177\003\177\003\177\003\1778\230,\0268\246\002\246\003\0180\170\015\017\030^\015\186\003\177\003\177\015\194\005j\015\017\b\210;\226\006\185\015\017\003\177\003\177\003\214\014J\003\254\006\2092b\003\177\022\018\004N\000\250\b\2221\210\t\1902~\003\177\003\177\003\177\003\177\003\177\"\"\014\242\006\185\015\022\003\177\003\177\006\185\012\026,\030\002\014,6,\202\n\238\003\222\b\234\003\177\"&\003\018\003\177/\030\005&\003\1772\130\022\1982\190Cc\003\177\022\226\005V\002\246\003\177\003\177\003\177\rY\003\177\005^\b\242\004b\003\177\003\177\003\177\003\222\n=\t\018\022\230\003\177\003\177\003\177\012\"\017-\rY\rY\005\222\021\190\rY\rY.\206\rY\rY\022\182\rY\rY/>\rY;\230\012\153\026\230\0226\rY\rY\rY\rY\rY\000\2251\n1\214\006\209\003\214\014J0\186\005\222\022:\rY\rY\023J\003\018\006\185\017-2\030\012\153\029*\rY\rY\012\153\003\145\004\190\014\242\003\145\rY\0312\016z\016\1581\146\nM\012.\017-\rY\rY\rY\rY\rY8^\028^2\"\rY\rY\rY1\254\014\246\t\250\006\2092\006\022\226\005V\nA1\234\017-\0126\012B\rY1&\rY\004b\n=3j\031>\003\222\rY\003\145\022\230\017-\rY\rY\rY\r\189\rY\007.?^\nM\rY\rY\rY\003\145\003\145\n%>\210\rY\rY\rY3n\000\250\r\189\r\189\001\030\r\189\r\189\r\1898\142\r\189\r\189\012f\r\189\r\189\n%\r\189\005\222\003\145\014b\r\189\r\189\r\189\r\189\r\189\r\189\001\03042\018\218\001F\012\130\n\2227>\003\145\r\189\r\189\r\189\017\006\004\018\012\142\003\145\n%1\214\b\153\r\189\r\1891\214\003\145\004\190\012y\014j\r\189\r\189\016z\016\158\n%B\1787B4\162\r\189\r\189\r\189\r\189\r\189A\254\006aB\018\r\189\r\189\r\1894\230\012\154\nu\012y\n%\nu\nu\012y\012\1706\026<N\012\214\r\189\003\018\r\189\004F\012\254\n\222\r\189\006a\r\189\r&\006a\006a\r\189\r\189\r\189\012\229\r\189\bb\n%6&\r\189\r\189\r\189\005j\015\0226\030\004z\r\189\r\189\r\18962\nu\012\229\012\229\007\210\012\229\012\229\012\229\011\249\012\229\012\229\005&\012\229\012\229\b\153\012\229;\1946*\003\222\012\229\012\229\012\229\012\229\012\229\012\2297~9v\003\01866\r24\242\r^\nu\012\229\012\229\012\229\017\0066>=\198\005:\nu6\2067\146\012\229\012\229\r\150\011\249\004\190\nu\006a\012\229\012\229\016z\016\158\nu<R\015\017\005\222\012\229\012\229\012\229\012\229\012\2297\158\011\2496B\012\229\012\229\012\2296\2107\1509\202>V\015\017$\1467\226+\230:\n\r\20696\015\017\012\229\005j\012\229\015\017\011\249<f\012\229\014\026\012\229:f7\162<\174\012\229\012\229\012\229\r\t\012\229<\218\011\2497\230\012\229\012\229\012\2299:\007>7\1309z\012\229\012\229\012\229<j\r\t\r\t\r\t\r\t\r\t\r\t\r\t\r\t\r\t\r\t?\190\r\t\r\t\r\t\r\tB~9\138\r\t\r\t\r\t\r\t\r\t\r\t\r\t:2\014&\014r\n\141\003\214\014J\014\158\r\t\r\t\r\t\r\t\r\t9\150<\182\014\202\014\2229\206\r\t\r\t\r\t9\142\r\t\r\t\022\194\014\250\r\t\r\t\r\t\r\t\n\141\001\0308*\r\t\r\t\r\t\r\t\r\t\r\t<\186\028\0069\154\r\t\r\t\r\t8*\022\1988*#\246?\202\022\226\005V7\1388*A\242\029^\r\t\r\t\014\254\001\030\004b>\138\r\t\r\t\003\222\r\t\015.\022\230\028\006\r\t\r\t\r\t\r\017\r\t\015:?\214\014j\r\t\r\t\r\t9\130\003\018:6\015F\r\t\r\t\r\t>\166\r\017\r\017\r\017\r\017\r\017\r\017\r\017\r\017\r\017\r\017@\014\r\017\r\017\r\017\r\017\005\222\014j\r\017\r\017\r\017\r\017\r\017\r\017\r\017\015\138\016\"<\254\n\141\003\214\014J\016Z\r\017\r\017\r\017\r\017\r\017\028\"\016fB\154\016v=\n\r\017\r\017\r\017=\022\r\017\r\017\022\194=\"\r\017\r\017\r\017\r\017\n\141=\002\016\174\r\017\r\017\r\017\r\017\r\017\r\017\016\1788*\028\"\r\017\r\017\r\017=\014\014\246\016\206#\246=\026\022\226\005V\016\210=&B\n\029z\r\017\r\017\016\226\017\030\004b\017&\r\017\r\017\003\222\r\0178*\022\230\0172\r\017\r\017\r\017\r\025\r\017\017V\017\162\018\250\r\017\r\017\r\017\019\"\019r\019\170\019\182\r\017\r\017\r\017\020\002\r\025\r\025\r\025\r\025\r\025\r\025\r\025\r\025\r\025\r\025\0202\r\025\r\025\r\025\r\025\005\222\020J\r\025\r\025\r\025\r\025\r\025\r\025\r\025\020\154\020\194\020\202\020\210\003\214\022\186\020\214\r\025\r\025\r\025\r\025\r\025\020\250\021\002\021\"\021b\021r\r\025\r\025\r\025\021\146\r\025\r\025\014\242\021\254\r\025\r\025\r\025\r\025\022F\022R\016n\r\025\r\025\r\025\r\025\r\025\r\025\022\158\022\202\022\206\r\025\r\025\r\025\022\242\023\n\023\014\0232\023F\022\190\003J\023Z\024\194B\"\029\146\r\025\r\025\024\234\025\006\002\014\025\022\r\025\r\025\003\222\r\025\026\174\011\210\027\018\r\025\r\025\r\025\r\001\r\025\027\026\0272\027r\r\025\r\025\r\025\027\134\027\202\027\234\029\142\r\025\r\025\r\025\029\202\r\001\r\001\r\001\r\001\r\001\r\001\r\001\r\001\r\001\r\001\029\234\r\001\r\001\r\001\r\001\005\222\030f\r\001\r\001\r\001\r\001\r\001\r\001\r\001\n\002\030\166\030\186\n\n\030\218\030\2266\182\r\001\r\001\r\001\r\001\r\001\030\238\030\246\031\002\031Z\031\230\r\001\r\001\r\001 \006\r\001\r\001 6 >\r\001\r\001\r\001\r\001 v \134\b1\r\001\r\001\r\001\r\001\r\001\r\001 \206 \234 \254\r\001\r\001\r\001\n\018!\030!F!J!Z!^!r!\134!\138B.\029\158\r\001\r\001+F\003\222\n\030!\158\r\001\r\001!\190\r\001!\230!\234!\254\r\001\r\001\r\001\r\185\r\001\"\002\031\166\"\018\r\001\r\001\r\001\"\022\"6\"b\n*\r\001\r\001\r\001\"f\"v\r\185\r\185\"z\r\185\r\185\r\185\"\138\r\185\r\185\005\222\r\185\r\185\"\162\r\185\"\230\"\254\n2\r\185\r\185\r\185\r\185\r\185\r\185\n:#*#.\b1\003\214\022\186#>+V\r\185\r\185\r\185\017\006#B#\162#\210#\234$\006$\"\r\185\r\185$&\011\242\004\1901\218\r\026\r\185\r\185\016z\016\158$B$F$V$f\r\185\r\185\r\185\r\185\r\185$\154$\218$\238\r\185\r\185\r\185%\006%\014%\026%\"%.\022\190\003J%r%z%\158%\174%\178\r\185%\194\r\185\002\014%\198%\214\r\185\003\222\r\185\r\"\011\210&>\r\185\r\185\r\185\014\021\r\185&B&Z&\158\r\185\r\185\r\185\003\222\r.&\186&\206\r\185\r\185\r\185'\030'\130\014\021\014\021'\1383v3~3\134'\174\014\021\014\021'\190\014\021\014\021'\194\014\021\005\222\r:'\2103\142\014\021\014\021\014\021\014\021\014\021'\214'\230(>(B\003\214\022\186(Z\005\2223\146\014\021\014\021\014\021(\154(\182\rB(\202(\250)\n\014\021\014\021).\rJ\014\021\nA)>\014\0213\154\014\021\014\021)R)n+\022+n\014\021\014\021\014\021\014\021\014\021+\170+\182+\234\014\021\014\021\014\021+\246+\250\nu,Z,\146\022\190\003J,\198,\210-\"-*-\134\014\021-\194\014\021\002\014-\222-\2503\170\003\222\014\021.\002\011\210.*\014\021\014\021\014\021\014-\014\021\bb.R.j\014\021\014\021\014\021\0171.r.\138.\234\014\021\014\021\014\021.\246\nu\014-\014-\007\210\021\190\014-\014-.\250\014-\014-/:\014-\014-/F\014-\005\222\000\225/\130\0226\014-\014-\014-\014-\014-/\154/\1620\0140\0260\"5\002\0171\nu\022:\014-\014-\023J06\001\n0>\nu0V0^\014-\014-0v0\214\004\190\nu\0171\014-\0312\016z\016\158\nu0\2260\2301\"\014-\014-\014-\014-\014-1.1R1j\014-\014-\014-1r\01711\2462\0182.2N2\1622\2303:3N3\1383\202\014-\031f\014-\01713\2424\n\031>4Z\014-\007.4n\004b\014-\014-\014-\003\222\014-4\134\031\1664\174\014-\014-\014-:\206\003\2214\194:\214\014-\014-\014-\003\221\003\2214\254\015r\016F\021\142\015\002\003\221\003\2215\014\003\221\003\221\015\006\003\2215V5^9&\015\182\003\221\003\221\003\221\003\221\003\221\003\206\005\2225n5\1385\1706\1426\1546\190\015\186\003\221\003\221\015\1946\2226\226:\2227\n7\"76\003\221\003\2217N V\003\2547n f\003\221\016N\004N\000\250:\2347\178;v7\198\003\221\003\221\003\221\003\221\003\2217\202\t\0297\2428\006\003\221\003\221\003\210\003J868B8R8n8\1309\002:\246\003\221\002\0149.\003\2219F\003\222\003\2219f\011\210\021\150\t\029\003\221 r\t\029\t\029\003\221\003\221\003\221\rA\003\2219\178:\2549\238\003\221\003\221\003\221\003\222 \130;\0309\250\003\221\003\221\003\221:\022:\"\rA\rA\nu\021\190\022.\023B:*\rA\rA\005\222\rA\rA:B\rA:J \146\003\222\0226\rA\rA\rA\rA\rA:V:n:\150:\162:\226:\238\bb\005\222\022:\rA\rA\023J;\190;\202 \158;\218;\242;\250\rA\rA\nu,F\004\190\007\210\t\029\rA\0312\016z\016\158;\254<F<^\005\222\rA\rA\rA\rA\rA<v<\202<\246\rA\rA\rA=6=F,F=c=s5\018=\135\nu=\234>\">R\030r\rA>^\rA\nu>z>\234\031>>\238\rA?V?~\nu\rA\rA\rA?\134\rA\nu?\166?\186\rA\rA\rA?\210\003\217?\250@\n\rA\rA\rA\003\217\003\217@.\015r\016F\021\142@>\003\217\003\217@R\003\217\003\217\015\r\003\217@nA\199;\234\015\182\003\217\003\217\003\217\003\217\003\217\003\206A\215B\030BJ\015\226BV\015\r\030\198\015\186\003\217\003\217\015\194BZ\015\rB\150B\162B\214\015\r\003\217\003\217B\222\000\000\003\254\000\000\000\000\003\217\016N\004N\000\250\000\000\000\000\000\000\000\000\003\217\003\217\003\217\003\217\003\217\000\000\006U\000\000\000\000\003\217\003\217\003\210\003J\nu\000\000\000\000\000\000\000\000\000\000\000\000\003\217\002\014\000\000\003\217\000\000\003\222\003\217\000\000\011\210\021\150\006U\003\217\000\000\006U\006U\003\217\003\217\003\217\004\189\003\217\bb\000\000\000\000\003\217\003\217\003\217\000\000\000\000\000\000\000\000\003\217\003\217\003\217\000\000\nu\004\189\004\189\007\210\021\190\022.\023B\000\000\004\189\004\189\005\222\004\189\004\189\000\000\004\189\000\000\000\000\003\222\0226\004\189\004\189\004\189\004\189\004\1894\222\000\000\000\0004\238\000\0005\030\000\000\nu\022:\004\189\004\189\023J\000\000\000\000\000\000\nu\000\000\000\000\004\189\004\189\000\000\000\000\004\190\nu\006U\004\189\0312\016z\016\158\nu\000\000\000\000\005\222\004\189\004\189\004\189\004\189\004\189\000\000\000\000\000\000\004\189\004\189\004\1894\250\000\000\nu\000\000\000\000\000\000\000\000-z\000\000\000\000\000\000\000\000\004\189\000\000\003\2225\n\000\000\000\000\031>\000\000\004\189\000\000\000\000\000\000\004\189\004\189\004\189\003\177\004\189\bb\000\000\000\000\004\189\004\189\004\189\000\000\000\000\000\0005\026\004\189\004\189\004\189\000\000\nu\003\177\003\177\007\210\021\190\022.\023B\000\000\003\177\003\177\005\222\003\177\003\177\000\000\003\177\000\000\000\0005&\0226\003\177\003\177\003\177\003\177\003\177=\214\000\000\000\000\000\000\000\0005*\000\000\nu\022:\003\177\003\177\023J\000\000\000\000\000\000\nu\000\000\000\000\003\177\003\177\000\000\000\000\004\190\nu\000\000\003\177\024\198\016z\016\158\nu\000\000\000\000\000\000\003\177\003\177\003\177\003\177\003\177\000\000\t%\000\000\003\177\003\177\003\177\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\177\000\000\000\000\000\000\000\000\000\000\029f\t%\003\177\000\000\t%\t%\003\177\003\177\003\177\003\221\003\177\014B\000\000\000\000\003\177\003\177\003\177\000\000\000\000\000\000\000\000\003\177\003\177\003\177\000\000\000\000\003\221\003\221\000\000\021\190\022.\023B\000\000\003\221\003\221\000\000\003\221\003\221\000\000\003\221\000\000\000\000\003\222\0226\003\221\003\221\003\221\003\221\003\221\003\002\000\000\000\000\000\000\000\000\000\000\014F\005V\022:\003\221\003\221\023J\000\000\000\000\000\000\000\000\004b\000\000\003\221\003\221\003\222\000\000\004\190\022\230\t%\003\221\0312\016z\016\158\000\000\000\000\000\000\005\222\003\221\003\221\003\221\003\221\003\221\000\000\t!\000\000\003\221\003\221\003\221\005\198\"\",F\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\014\000\000\003\221$\166\003\222\005\222\000\000\"&\031>\t!\003\221\000\000\t!\t!\003\221\003\221\003\221\004\193\003\221\000\000\000\000\000\000\003\221\003\221\003\221\000\000\000\000\000\000\000\000\003\221\003\221\003\221\000\000\000\000\004\193\004\193\000\000\021\190\022.\023B\000\000\004\193\004\193\005\222\004\193\004\193\015\r\004\193\000\000\000\000\003\222\0226\004\193\004\193\004\193\004\193\004\193\003\002\000\000\000\000\000\000\015\226\000\000\015\r$\250\022:\004\193\004\193\023J\000\000\015\r\000\000\000\000\000\000\015\r\004\193\004\193\000\000\000\000\004\190\000\000\t!\004\193\0312\016z\016\158\000\000\000\000\000\000\005\222\004\193\004\193\004\193\004\193\004\193\000\000\t\025\000\000\004\193\004\193\004\193\005\198!\150,F\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004b\000\000\004\193\000\000\003\222\000\000\000\000!&\031>\t\025\004\193\000\000\t\025\t\025\004\193\004\193\004\193\003\217\004\193\000\000\000\000\000\000\004\193\004\193\004\193\000\000\000\000\000\000\000\000\004\193\004\193\004\193\000\000\000\000\003\217\003\217\000\000\021\190\022.\023B\000\000\003\217\003\217\005\222\003\217\003\217\000\000\003\217\000\000\006i\003\222\0226\003\217\003\217\003\217\003\217\003\217\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022:\003\217\003\217\023J\000\000\000\000\000\000\000\000\006i\000\000\003\217\003\217\006i\000\000\004\190\000\000\t\025\003\217\0312\016z\016\158\000\000\000\000\000\000\005\222\003\217\003\217\003\217\003\217\003\217\000\000\000\000\000\000\003\217\003\217\003\217\003\166\t\006,F\000\000\b\202\000\000\003\170\000\000\000\000\000\000\000\000\000\000\003\217\003\222\000\000\000\000\003\182\000\000\031>\000\000\003\217\000\000\000\000\003\194\003\217\003\217\003\217\000\000\003\217\000\000=\174\000\000\003\217\003\217\003\217\001\030=\190>j\001F\003\217\003\217\003\217>\142\000\000\001J\t\n\005\138\000\000\000\000\000\000>\170\000\000\005\222\000\000\000\000\002\014\005\142\005\146\000\000\000\000\t\014\001\150\007\210\000\000\001\242\001\246\000\014\000\000\n\210\000\000\000\0000\210\001\154\000\000\000\000>\206\000\000\001\250\001\254>\226?\002?\014\000\000\b\234\001z\003\238\005\194\003\242\011^\002\014\003\254\000\000\015&\003\222\015>\004N\000\250?\018\004r\000\000\000\000\000\000\000\000\000\000\000\000\b\242?\026\000\000?\"\000\000\017y\000\000\t\018\000\000?:?N\004v\004z?v4\218?\142\000\000\000\000=\174?\175\000\000\000\000\000\000\001\030=\190>j\001F\005\222\000\000\017y>\142\000\000\001J\017y\000\000\000\000?\178\004~>\170\000\000\011\234\000\000@\130\015N@\138\000\000\000\000\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\014\000\000\n\210\000\000\000\000\000\000\001\154\000\000\000\000>\206\000\000\001\250\001\254>\226?\002?\014\017y\000\000\001z\003\238\000\000\003\242\011^\002\014\003\254\000\000\015&\003\222\015>\004N\000\250?\018\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\026\000\000?\"\000\000\000\000\003\150\000\000\000\000?:?N\004v\004z?v4\218?\142\017y\000\000\017yC;\000\000\000\000\011\146\001\n\000\000\000\189\001\014\005\222\000\000\000\189\005\182\000\000\001\018\001\166\001\170\017y?\178\004~\011\150\000\000\000\000\001\174@\130\015N@\138\000\000\000\000\000\000\000\000\n\254\001\206\001\210\011\002\011\174\001\222\001\226\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\186\000\000\011\n\017^\017N\001\182\000\189\000\000\000\000\000\000\000\000\004\182\011\018\000\000\004b\000\000\000\000\017b\003\222\017v\000\000\017\146\017\202\016\238\000\000\000\000\011\022\011\026\011\030\011\"\011&\000\189\000\189\000\000\000\000\011*\011.\000\000\000\000\000\000\ti\016\242\016\246\000\000\017\210\000\000\000\189\000\189\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\222\000\000\000\000\000\189\000\000\000\000\01166\218\000\000\000\000\016\250\000\000\001\177\011:\000\000\011>\017\214%\246\011\146\001\n\011B\011F\001\014\000\000\000\000\000\000\000\000\000\000\001\018\001\166\001\170\000\000\000\000\000\000\011\150\000\000\001\177\002\006\000\000\000\000\001\177\000\000\000\000$n$r\n\254\001\206\001\210\011\002\011\174\001\222\001\226\nE\nE\000\000\000\000\000\000\000\000\nE\017R\000\000\011\n\017^\017N\001\182%\254\000\000\000\000\nE\000\000\004\182\011\018\022\250\004b\000\000\nE\017b\003\222\017v\000\000\017\146\017\202\016\238&\014&\022\011\022\011\026\011\030\011\"\011&\000\000\000\000\000\000\nE\011*\011.\000\000\nE\nE\000\000\016\242\016\246\000\000\017\210\000\000\nE\nE\nE\nE\nE\000\000\nE\nE\000\000\nE\nE\005\222\nE&&\nE\000\000\nE\0116\020\206\nA\000\000\016\250\000\000\nE\011:\n=\011>\017\214\000\000\006\221\000\000\011B\011F\nE\000\000\000\000\nE\nE\000\000\000\000\000\000\nE\000\000\005\202\nE\nE\nE\001\230\000\000\nE\nE\nE\nE\000\000\nE\nE\nE\nE\nE\nE\nE\nE\nE\000\000\nE\nE\nE\nE\nE\nE\nE\000\000\000\000\n=\000\000\000\000\000\000\000\000\000\000\000\000\nE\nE\000\000\000\000\nE\nE\nE\nE\nE\nE\000\000\000\000\nE\000\000\005b\002\n\005\202\nE\nE\nE\nE\000\000\015\198\000\000\nE\nE\000\000\nE\004\022\nE\nE\000\000\nE\nE\nE\nE\nE\nE\nE\nE\nE\nE\000\000\000\000\000\000\000\000\n\210\000\000\nE\000\000\000\000\006q\000\000\n\226\nE\nE\nE\nE\000\000\n\242\nE\000\000\000\000\000\000\000\000\000\000\011^\000\000\000\000\000\000\023N\003\222\nE\000\000\000\000\006q\004\022\000\000\006q\006q\000\000\000\000\nE\000\000-\234\000\000\n\213\nE\nE\nE\n\213\n\213/\022\n\213\n\213\000\000-\242.\022\n\213\b\161\n\213\000\000\012E\000\000\000\000\000\000\000\000\000\000\012\181\000\000\005\222\012\181\012\181\000\000\005\250\000\000\003\222\n\213\000\000.\030\n\213\n\213\b\161\b\161/R\b\161\b\161\000\000\n\213\000\000\000\000/^\000\000\n\213\n\213\n\213\n\213/z\000\000\000\000\n\213\n\213\000\000\n\213\011^\n\213\n\213\006q\n\213\n\213\n\213\n\213\n\213\n\213\n\213\005\222\000\000\000\000\000\000\000\000\000\000\000\000/\138\b\161\n\213\000\000\b\161\000\000\000\000,\130\n\213\n\213\n\213\n\213/\146/\170\n\213\nE\000\000\000\000\012\181\nE\nE\000\000\nE\nE\000\000\nE\n\213\nE\000\000\nE\b\161\n\213\b\161\000\000\n\213/\178\n\213\000\000\nA\000\000\b\161\n\213\n\213\n\213\b\161\b\161\nE\000\000\000\000\nE\nE\000\000\b\161\000\000\000\000\000\000\000\000\nE\000\000\014\190\000\000\000\000\nE\nE\nE\nE\000\000\000\000\000\000\nE\nE\000\000\nE\000\000\nE\nE\000\000\nE\nE\nE\nE\nE\nE\nE\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\nE\000\000\000\000\000\000\000\000\000\000\nE\nE\nE\nE\nA\nM\nE\000\000\000\000\000\000\nM\nM\nM\nM\nM\000\000\005\202\nM\nE\nM\nM\000\000\000\000\000\000\nM\000\000\nM\000\000\nE\000\000\004\214\nA\000\000\nE\nE\nE\nM\nA\000\000\nM\nM\nM\000\000\nM\000\000\000\000\nM\nM\000\000\000\000\000\000\000\000\nM\nM\nM\nM\nM\000\000\000\000\nM\nM\nM\nM\000\000\nM\nM\nM\nM\nM\nM\nM\nM\nM\nM\nM\nM\nM\nM\nM\nM\nM\000\000\000\000\nM\000\000\000\000\014b\000\000\000\000\nM\nM\nM\nM\nM\000\000\nM\nM\nM\nM\nM\b\133\000\000\nM\004\018\004\018\000\000\000\000\nM\nM\b\181\004\018\004\022\b\181\b\181\nM\000\000\000\000\nM\nM\n=\007\t\000\000\nM\nM\nM\000\000\nA\015\022\nI\nM\nM\nM\nI\nI\014b\nI\nI\000\000\nI\000\000\nI\b\133\nI\000\000\005&\000\000\000\000\000\000\000\000\000\000\b\181\015\202\000\000\000\000\000\000\000\000\000\000\n\237\n\237\nI\n\237\n\237\nI\nI\006E\000\000\000\000\006E\006E\000\000\nI\000\000\b\133\000\000\000\000\nI\nI\nI\nI\000\000\b\133\b\181\nI\nI\000\000\nI\000\000\nI\nI\b\181\nI\nI\nI\nI\nI\nI\nI\000\000\006i\b\133\000\000\006i\006i\000\000\000\000\003\222\nI\000\000\b\181\000\000\006\233\000\000\nI\nI\nI\nI\000\000\000\242\nI\000\000\000\000\0162\001\030\000\000\004\030\001F\000\000\n\237\000\000\004>\nI\001J\000\000\000\000\006\233\006\233\006E\006\233\006\233\003\222\nI\n\237\n\237\nA\005\222\nI\nI\nI\001\150\n\237\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000!\174\000\000.~\001\250\001\254\004\170\015\030\000\000\000\000\006i\001z\003\238\000\000\003\242\006\233\002\014\003\254\005\222\015&\003\222\015>\004N\000\250\015J\004r<V\000\000\000\000\000\000\000\000\000\000\000\000\003\206\000\000\0166\000\000.\230\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000\006\233\021.\nI\000\000\000\000\000\000\nI\nI\006\233\nI\nI=2\nI\005\222\nI\000\000\nI\000\000\015\226\000\000\000\000\015\234\000\000\004~\000\000\023R\000\000\006\233\021\130\015N\021\134\003\210\003J\nI\000\000\000\000\nI\nI\000\000\000\000\000\000\002\014\000\000\000\000\nI\003\222\000\000\000\000\011\210\nI\nI\nI\nI\000\000\000\000\012\181\nI\nI\000\000\nI\000\000\nI\nI1\002\nI\nI\nI\nI\nI\nI\nI\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\181\nI\000\000\000\000\012\181\005\222\000\000\nI\nI\nI\nI\000\000\nA\nI\000\254\000\000,\222\000\000\000\000\001\n\000\000\001>\001\0141:\000\000\nI\001n\000\000\001\0181J\000\000\000\000\000\000\000\000\000\000\nI\022\250\nA\000\000\004J\nI\nI\nI\006\241\000\000\001\022\006\241\006\241\001\242\001\246\000\000\000\000\000\000\000\0001Z\000\000\001\026\000\000\000\000\000\000\000\000\001\250\001\254\002\002\004Z\000\0001b1z\001z\001\186\tB\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\006\241\000\000\000\000\000\000\000\0001\130\001\177\000\000\021\158\000\000\000\000%\246\000\000\000\000\021\210\021\246\016\242\016\246\000\000\000\000\022\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\241\001\177\006\241\005\222\017\249\001\177\000\000\000\000$n$r\006\241\000\000\006\241\016\250\000\000\nA\000\000\nU\022\"\016\254\022&\017\249\017\249\000\000\021\190\022.\023B\000\000\017\249\006\2415\154\017\249\017\249\000\000\017\249\000\000\000\000\022\250\0226\017\249\017\249\017\249\017\249\017\249\000\000\001\238\000\000\001\n&\014&\022\000\000\000\000\022:\017\249\017\249\023J\000\000\000\000\000\000\000\000\000\000\000\000\017\249\017\249\000\000<*\004\190\000\0005\158\000\000\0312\016z\016\158\000\000\000\000\000\000\000\000\017\249\017\249\017\249\017\249\017\249\000\000&&\000\000\000\000\017\249\017\249\nu\000\000\000\000\031f\000\000\000\000\000\000\005U\005U\000\000\000\000\006\221\017\249\004b\031\186\000\000\000\000\003\222\031>\000\000\031\166\000\000\000\000\000\000\nu\r\t\017\249\nu\nu\000\000\000\000\005U\005U\017\249\005U\005U\000\000\000\000\015\002\000\000\017\249\017\249\r\t\r\t\015\006\r\t\r\t\r\t\000\000\r\t\000\000\011\246\r\t\r\t\000\000\r\t\005\222\000\000\003\022\r\t\r\t\r\t\r\t\r\t\r\t\nu\000\000\000\000\012\n\000\000\000\000\000\000\005U\r\t\r\t\r\t\r\t\000\000\000\000\000\000\000\000\000\000\000\000\r\t\r\t\000\000\000\000\r\t\000\000\000\000\000\000\r\t\r\t\r\t Z\000\000\nu\000\000\r\t\r\t\r\t\r\t\r\t\005U\nu\000\000\000\000\r\t\r\t\b\t\000\000\005U\nu\000\000\000\000\005U\ta\ta\nu*\234\000\000\r\t\000\000\005U\000\000\000\000\000\000\r\t\000\000\000\000\005U\000\000\000\000\000\000\r\017\r\t\000\000\000\000\000\000\000\000\ta\ta\r\t\ta\ta\000\000\000\000\000\000\000\000\r\t\r\t\r\017\r\017\000\000\r\017\r\017\r\017\000\000\r\017\000\000\000\000\r\017\r\017\000\000\r\017\000\000\000\000\000\000\r\017\r\017\r\017\r\017\r\017\r\017\000\000\031j\000\000\001\n\000\000\000\000\000\000\ta\r\017\r\017\r\017\r\017\000\000\000\000\000\000\000\000\000\000\000\000\r\017\r\017\000\000\031\162\r\017\000\000\000\000\000\000\r\017\r\017\r\017\000\000\000\000\000\000\000\000\r\017\r\017\r\017\r\017\r\017\ta\000\000\000\000\000\000\r\017\r\017\nu\000\000\ta\031f\r\198\000\000\ta\019-\019-\000\000+\002\000\000\r\017\004b\ta\000\000\000\000\003\222\r\017\000\000\031\166\ta\000\000\000\000\nu\r\025\r\017\nu\nu\000\000\000\000\019-\019-\r\017\019-\019-\000\000\000\000\015\002\000\000\r\017\r\017\r\025\r\025\015\006\r\025\r\025\r\025\000\000\r\025\000\000\011\246\r\025\r\025\000\000\r\025\005\222\000\000\000\000\r\025\r\025\r\025\r\025\r\025\r\025\nu\000\000\000\000\012\n\000\000\000\000\000\000\019-\r\025\r\025\r\025\r\025\000\000\000\000\000\000\000\000\000\000\006\241\r\025\r\025\000\000\000\000\r\025\000\000\000\000\000\000\r\025\r\025\r\025 j\000\000\nu\000\000\r\025\r\025\r\025\r\025\r\025\019-\nu\000\000\006\241\r\025\r\025\006\241\006\241\019-\nu\r\198\000\000\019-\000\000\006\241\nu+\026\000\000\r\025\000\000\019-\000\000\000\000\000\000\r\025\000\000\000\000\019-\000\000\000\000\011\226\r\001\r\025\000\000\000\000\000\000\000\000\000\000\000\000\r\025\000\000\000\000\000\000\000\000\006\241\000\000\r\025\r\025\r\001\r\001\000\000\r\001\r\001\r\001\000\000\r\001\000\000\000\000\r\001\r\001\000\000\r\001\000\000\000\000\000\000\r\001\r\001\r\001\r\001\r\001\r\001\000\000\000\000\006\241\000\000\006\241\000\000\000\000\000\000\r\001\r\001\r\001\r\001\006\241\000\000\006\241\000\000\000\000\000\000\r\001\r\001\000\000\000\000\r\001\000\000\000\000\000\000\r\001\r\001\r\001\000\000\000\000\006\241\000\000\r\001\r\001\r\001\r\001\r\001\000\000\024n\000\000\000\242\r\001\r\001\000\000\015\210\001\0309\246\004\030\001F\000\000\015\214\000\000\004>+&\001J\r\001\000\000\000\000\000\000\000\000\000\000\r\001\000\000\004\166\000\000\004\1507\2508\002\021\022\r\001\000\000\001\150\000\000\000\000\001\242\001\246\r\001\000\000\000\0008\n\000\000\000\000\001\154\r\001\r\001\001\230\000\000\001\250\001\254\004\170\015\030\000\000\000\0008\014\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\0008\022\000\0009\254\000\000\000\000\000\000\000\000\0166\000\000\000\000\024r\000\000\000\000\017\014\021\026\004v\004z\000\000\nM\021.\nM\000\000\nM\nM\nM\nM\nM\nM\nM\000\000\nM\005\222\nM\000\000\nM\000\0008\226\000\000\nM\000\000\nM\004~\000\000\004J\000\000\016n\021\130\015N\021\134\nM\000\000\nM\nM\nM\nM\nM\000\000\000\000\000\000\000\000\nM\000\000\nM\000\000\000\000\nM\nM\nM\nM\nM\nM\000\000\nM\nM\nM\nM\000\000\nM\nM\nM\nM\nM\nM\nM\nM\nM\nM\nM\nM\000\000\000\000\000\000\000\000\000\000\000\000\000\000\nM\000\000\nM\000\000\000\000\000\000\nM\nM\nM\nM\nM\nM\nM\nM\nM\000\000\000\000\000\000\000\000\000\000\004\018Av\004\018\000\242\nM\000\000\nM\000\000\001\030\000\000\004\030\001F\000\000\000\000\nM\004>\nM\001J\nA\nM\nM\nM\nM\nM\000\000\000\000\017\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\002\n\007\017\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\007\017\007\017\000\000\007\017\007\017\000\000\000\000\000\000\0166\000\000\000\000Az\004\r\000\000\017\014\021\026\004v\004z\004\r\004\r\021.\000\000\000\000\000\000\000\000\004\r\004\r\012Z\004\r\004\r\002\025\004\r\005\222\000\000\000\000#\026\004\r\004\r\004\r\004\r\004\r\007\017\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\004\r\004\r\000\000\000\000\002\025\000\000\000\000\000\000\002\025\004\r\004\r#\"#6\000\000\000\000\000\000\004\r\000\000\000\000\000\000\000\000\000\000\007\017\000\000\023\138\004\r\004\r\004\r\004\r\000\000\007\017\000\000\011=\004\r\004\r\000\000\000\000\000\000\007\017\000\000\022\250\000\000\000\000\000\000\004\r\000\000\000\000\004\r\007\017\007\017\004\r\000\000#J\011=\011=\004\r\011=\011=\000\000\004\r\004\r\004\r\000\000\004\r\003\249\000\000\000\000\004\r\004\r\004\r\003\249\003\249\000\000\000\000\004\r\004\r\004\r\003\249\003\249\000\000\003\249\003\249\000\000\003\249\000\000\000\000#R\000\000\003\249\003\249\003\249\003\249\003\249\000\000\000\000\000\000\000\000\000\000\003\166\003\002\000\000\000\000\003\249\003\249\003\170\000\000\000\000\000\000\011=\000\000\000\000\003\249\003\249\000\000\003\182\000\000\000\000\000\000\003\249\000\000\000\000\003\194\011=\011=\000\000\011=\023\138\003\249\003\249\003\249\003\249\000\000\000\000\000\000\000\000\003\249\003\249\011=\000\000\000\000\018\178\011=\000\000\003\190\005\138\011=\003\249\011=\000\000\003\249\000\000\011=\003\249\002\014\005\142\005\146\000\000\003\249\005\150\000\000\005\154\003\249\003\249\003\249\n\229\003\249\003\245\000\000:R\003\249\003\249\003\249\003\245\003\245\000\000\000\000\003\249\003\249\003\249\003\245\003\245\000\000\003\245\003\245\005\194\003\245\000\000\004\1507\2508\002\003\245\003\245\003\245\003\245\003\245\000\000\000\000\000\000\000\000\000\000\000\0008\n\000\000\000\000\003\245\003\245\000\000\000\000\n\229\n\229\000\000\000\000\000\000\003\245\003\2458\014\000\000\000\000\n\229\000\000\003\245\000\000\n\229\000\000\000\000\n\229\000\000\000\000\023\138\003\245\003\245\003\245\003\2458\022\000\000:Z\000\000\003\245\003\245\000\000\000\000\000\000\000\000\n\229\000\000\000\000\000\000\000\000\003\245\n\229\000\000\003\245\000\000\000\000\003\245\000\000\000\000\000\000\012E\003\245\000\000\n\229\000\000\003\245\003\245\003\245\011\214\003\245\004-8\226\n\229\003\245\003\245\003\245\023~\023\174\005.\000\000\003\245\003\245\003\245\004-\004-\000\000\004-\004-\012E\004-\000\000\000\000\000\000\000\000\004-\004-\004-\023\206\004-\000\000\005*\000\000\000\000\000\000\000\000\000\000\000\000\0142\004-\004-\000\000\000\000\000\000\022\234\000\000\000\000\000\000\004-\004-\000\000\022\250\000\000\000\000\000\000\004-\031\"\000\000\000\000\000\000\000\000\000\000\000\000\023\138\023\218\004-\004-\004-\000\0000&\000\000\000\000\004-\004-\000\000\000\000\000\000\000\000\000\000\000\000\000\0000.0F\004-\000\000\000\000\004-\000\000\000\000\004-\000\000\000\000\000\000\000\000\004- \214\000\000\000\000\004-\004-\004-\001\030\004-\00410N\000\000\004-\004-\004-\0041\0041\000\000\000\000\004-\004-\004-\0041\0041\000\000\0041\0041\000\000\0041\000\000\000\000\000\000\000\000\0041\0041\0041\0041\0041\000\000\000\000\000\000\000\000\000\000\003\154\003\002\000\000\000\000\0041\0041\003\170\000\000$z\001\"\000\000\000\000\000\000\0041\0041\000\000\012R\000\000\004b\000\000\0041\000\000\003\222\012n\000\000$~\000\000\000\000\023\138\0041\0041\0041\0041\000\000\000\000\000\000\000\000\0041\0041\000\000\000\000\000\000\000\000\015\002\000\000\012Z\011\154\000\000\0041\015\006\000\000\0041\000\000\000\000\0041\004b\012v\012\134\000\000\0041\012\146\005\222\012\158\0041\0041\0041\000\000\0041\003\241\000\000%Z\0041\0041\0041\003\241\003\241\000\000\000\000\0041\0041\0041\003\241\003\241\000\000\003\241\003\241\012\162\003\241\000\000\004\1507\2508\002\003\241\003\241\003\241\003\241\003\241\006\241\000\000\000\000\000\000\000\000\000\0008\n\000\000\000\000\003\241\003\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\241\003\2418\014\000\000\000\000\000\000\006\241\003\241\000\000\006\241\006\241\000\000\000\000\000\000\000\000\023\138\003\241\003\241\003\241\003\2418\022\000\0008&\000\000\003\241\003\241\000\000\000\000\000\000\015\026\000\000\001\n\000\000\002\250\000\000\003\241\000\000\000\000\003\241\000\000\000\000\003\241\000\000\000\000\000\000\000\000\003\241\006\241\000\000\n=\003\241\003\241\003\241\000\000\003\241\004\0018\226\000\000\003\241\003\241\003\241\023~\023\174\000\000\000\000\003\241\003\241\003\241\004\001\004\001\000\000\004\001\004\001\000\000\004\001\031f\006\241\000\000\006\241\004\001\004\001\004\001\023\206\004\001\b\005\004b\006\241\000\000\006\241\003\222\000\000\000\000\031\166\004\001\004\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\001\004\001\000\000\006\241\000\000\000\000\000\000\004\001\015\002\000\000\000\000\000\000\000\000\000\000\015\006\023\138\023\218\004\001\004\001\004\001\000\000(\006\000\000\000\000\004\001\004\001\005\222\000\000\000\000\000\000\004\022\000\000\000\000\000\000\000\000\004\001\000\000\000\000\004\001\000\000\001\177\004\001\000\000\000\000\001\177\000\000\004\001$n$r\000\000\004\001\004\001\004\001\005b\004\001\003\253\000\000\000\000\004\001\004\001\004\001\023~\023\174\000\000\000\000\004\001\004\001\004\001\003\253\003\253\000\000\003\253\003\253\012E\003\253\000\000\011^\000\000\000\000\003\253\003\253\003\253\023\206\003\253\000\000\n\210\000\000(\014(\022\000\000\000\000\000\000\n\226\003\253\003\253\000\000\000\000\000\000\n\242\000\000\000\000\000\000\003\253\003\253\000\000\011^\000\000\000\000\000\000\003\253\003\222\000\000\000\000\000\000\000\000\000\000\000\000\023\138\023\218\003\253\003\253\003\253(&-\234\000\000\000\000\003\253\003\253\000\000\000\000\000\000\015\026\000\000\001\030\000\000-\242.\022\003\253\000\000\000\000\003\253\000\000\000\000\003\253\000\000\000\000\000\000\000\000\003\253\005\222\000\000\nA\003\253\003\253\003\253\000\000\003\253\004\025.\030\014\185\003\253\003\253\003\253\023~\023\174\000\000\000\000\003\253\003\253\003\253\004\025\004\025\000\000\004\025\004\025\000\000\004\025\001\234\004\1507\2508\002\023\194\023\230\023\242\023\206\023\254\000\000\002\014\000\000\000\000\000\000\003\2228\n\000\000\005&\024\n\024\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\"\024F8\014\000\000\000\000\000\000\006\241\004\025\015\002\006\241\006\241\000\000\000\000\000\000\015\006\023\138\023\218\024.\024:\024R8\022\000\000\014\185\000\000\024^\024j\005\222\000\000\000\000\000\000\000\000\000\000\000\000\005n\000\000\004\025\000\000\000\000\004\025\000\000\000\000\004\025\000\000\000\000\000\000\000\000\004\025\006\241\000\000\000\000\004\025\004\025\004\025\000\000\004\025\004\t8\226\000\000\004\025\024\130\004\025\023~\023\174\000\000\000\000\004\025\024\142\024\154\004\t\004\t\000\000\004\t\004\t\000\000\004\t\000\000\006\241\000\000\006\241\004\t\004\t\004\t\023\206\004\t\b\005\000\000\006\241\000\000\006\241\000\000\000\000\000\000\000\000\004\t\004\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\t\004\t\000\000\006\241\000\000\000\000\017}\004\t\000\000\017}\017}\000\000\bM\bM\000\000\023\138\023\218\004\t\004\t\004\t\000\000\000\000\000\000\000\000\004\t\004\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\t\000\000\000\000\004\t\bM\000\000\004\t\000\000\000\000\000\000\000\000\004\t\017}\000\000\000\000\004\t\004\t\004\t\bM\004\t\004\005\bM\000\000\004\t\004\t\004\t\023~\023\174\000\000\000\000\004\t\004\t\004\t\004\005\004\005\000\000\004\005\004\005\000\000\004\005\000\000\t\182\000\000\017}\004\005\004\005\004\005\023\206\004\005\bM\000\000\017}\000\000\017}\000\000\n\222\000\000\bM\004\005\004\005\000\000\bM\000\000\000\000\000\000\bM\000\000\004\005\004\005\000\000\017}\000\000\000\000\000\000\004\005\000\000\bM\000\000\000\000\000\000\000\000\000\000\023\138\023\218\004\005\004\005\004\005\000\000\000\000\000\000\000\000\004\005\004\005\000\000\000\000\000\000\000\000(\006\000\000\000\000\000\000\000\000\004\005\000\000\000\000\004\005\000\000\000\000\004\005\000\000\000\000\000\000\000\000\004\005\000\000\000\000\001\177\004\005\004\005\004\005\001\177\004\005\0045$n$r\004\005\004\005\004\005\023~\023\174\000\000\000\000\004\005\004\005\004\005\0045\0045\000\000\0045\0045\000\000\0045\000\000\000\000\000\000%\254\023\194\023\230\023\242\023\206\0045\017}\011^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\n\024\022\000\000(\014(\022\000\000\000\000\000\000\000\000\0045\0045\000\000\000\000\000\000\000\000\017}\0045\000\000\017}\017}\000\000\b\129\b\129\000\000\023\138\023\218\024.\024:\0045\000\000\000\000\000\000\000\000\0045\0045\000\000\000\000\000\000(&\000\000\000\000\000\000\000\000\000\000\0045\000\000\000\000\0045\015\022\000\000\0045\000\000\000\000\000\000\006\221\0045\017}\000\000\000\000\0045\0045\0045\b\129\0045\003\237\005&\000\000\0045\0045\0045\023~\023\174\000\000\000\000\0045\0045\0045\003\237\003\237\000\000\003\237\003\237\000\000\003\237\000\000;n\000\000\017}\003\237\003\237\003\237\023\206\003\237\b\129\000\000\017}\000\000\017}\000\000\000\000\000\000\b\129\003\237\003\237\000\000\b\129\000\000\000\000\000\000\b\129\000\000\003\237\003\237\000\000\017}\000\000\000\000\000\000\003\237\000\000\b\129\000\000\000\000\be\be\000\000\023\138\023\218\003\237\003\237\003\237\000\000\000\000\000\000\000\000\003\237\003\237\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\237\000\000\000\000\003\237\015\022\000\000\003\237\000\000\000\000\000\000\000\000\003\237\000\000\000\000\000\000\003\237\003\237\003\237\be\003\237\003\233\005&<\198\003\237\003\237\003\237\023~\023\174\000\000\000\000\003\237\003\237\003\237\003\233\003\233\000\000\003\233\003\233\000\000\003\233\000\000\004\1507\2508\002\023\194\023\230\023\242\023\206\003\233\be\000\000\000\000\000\000\000\000\000\0008\n\000\000\be\024\n\024\022\000\000\be\000\000\000\000\000\000\be\000\000\003\233\003\2338\014\000\000\000\000\000\000\000\000\003\233\000\000\be\000\000\000\000\000\000\000\000\000\000\023\138\023\218\024.\024:\003\2338\022\000\000<\206\000\000\003\233\003\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\233\000\000\000\000\003\233\000\000\000\000\003\233\000\000\000\000\000\000\000\000\003\233\000\000\000\000\000\000\003\233\003\233\003\233\000\000\003\233\004\0178\226>v\003\233\003\233\003\233\023~\023\174\000\000\000\000\003\233\003\233\003\233\004\017\004\017\000\000\004\017\004\017\000\000\004\017\000\000\004\1507\2508\002\023\194\023\230\023\242\023\206\004\017\000\000\000\000\000\000\000\000\000\000\000\0008\n\000\000\000\000\024\n\024\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\"\004\0178\014\000\000\000\000\000\000\000]\004\017\000\000\000]\000]\000\000\000\000\000\000\000\000\023\138\023\218\024.\024:\004\0178\022\000\000>~\000\000\004\017\004\017\000\000\000\000\000\000\005\n\015\174\025\018\000\000\000\000\000\000\004\017\000\000\000\000\004\017\000\000\000\000\004\017\000\000\025\026\000\000\000\000\004\017\003\222\000\000\000\000\004\017\004\017\004\017\000\000\004\017\003\2298\226\025\030\004\017\004\017\004\017\023~\023\1746\158\000\000\004\017\004\017\004\017\003\229\003\229\000\000\003\229\003\229\000\000\003\229\025*\000\000\000\000\000]\023\194\023\230\023\242\023\206\003\229\000\000\000\000\005\222\000\000\t\"\000\000\000\000\000\000\000\000\024\n\024\022\000\000\005\n\015\174\025\018\000\000\b\174\000\000\024\"\003\229\000\000\t:\000\000\000\000\000\000\003\229\025\026\026\134\000\000\000\000\000\000\000\000\000\000\023\138\023\218\024.\024:\003\229\000\000\000\000\025\030\000\000\003\229\003\229\000\000\000\000\025&\005\n\015\174\025\018\000\000\000\000\000\000\003\229\000\000\000\000\003\229\000\000\025*\003\229\000\000\025\026\000\000\000\000\003\229\000\000\000\000\000\000\003\229\003\229\003\229\000\000\003\229\004=\000\000\025\030\003\229\003\229\003\229\023~\023\1747\190\000\000\003\229\003\229\003\229\004=\004=\000\000\004=\004=\000\000\004=\025*\026\134\000\000\000\000\023\194\023\230\023\242\023\206\004=\004\1507\2508\002\000\000\000\000\000\000\000\000\000\000\000\000\024\n\024\022\000\000\000\000\000\0008\n\000\000\000\000\000\000\024\"\004=\000\000\000\000\000\000\000\000\000\000\004=\000\000\026\1348\014\000\000\000\000\000\000\000\000\023\138\023\218\024.\024:\004=\000\000\000\000\000\000\000\000\004=\004=\000\000\000\0008\022\000\0009\214\000\000\000\000\000\000\000\000\004=\000\000\000\000\004=\000\000\000\000\004=\004\1507\2508\002\000\000\004=\000\000\000\000\000\000\004=\004=\004=\000\000\004=\00498\n\000\000\004=\004=\004=\023~\023\174\000\0008\226\004=\004=\004=\0049\00498\014\0049\0049\000\000\0049\000\000\000\000\000\000\000\000\023\194\023\230\023\242\023\206\0049\004\1507\2508\002\000\0008\022\000\000<\162\000\000\000\000\024\n\024\022\000\000\000\000\000\0008\n\000\000\000\000\000\000\024\"\0049\000\000\000\000\000\000\000\000\000\000\0049\000\000\000\0008\014\000\000\000\000\000\000\000\000\023\138\023\218\024.\024:\0049\000\000\000\0008\226\000\000\0049\0049\000\000\000\0008\022\000\000>\154\000\000\000\000\000\000\000\000\0049\000\000\000\000\0049\000\000\000\000\0049\000\000\000\000\000\000\000\000\0049\000\000\000\000\000\000\0049\0049\0049\000\000\0049\004\021\000\000\000\000\0049\0049\0049\023~\023\174\000\0008\226\0049\0049\0049\004\021\004\021\000\000\004\021\004\021\000\000\004\021\000\000\000\000\000\000\000\000\023\194\023\230\023\242\023\206\004\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\n\024\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\"\004\021\000\000\000\000\000\000\000\000\000\000\004\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023\138\023\218\024.\024:\004\021\000\000\000\000\000\000\000\000\004\021\004\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\021\000\000\000\000\004\021\000\000\000\000\004\021\000\000\000\000\000\000\000\000\004\021\000\000\000\000\000\000\004\021\004\021\004\021\000\000\004\021\004\029\000\000\000\000\004\021\004\021\004\021\023~\023\174\000\000\000\000\004\021\004\021\004\021\004\029\004\029\000\000\004\029\004\029\000\000\004\029\000\000\000\000\000\000\000\000\023\194\023\230\023\242\023\206\023\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\n\024\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\"\024F\000\000\000\000\000\000\000\000\000\000\004\029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023\138\023\218\024.\024:\024R\000\000\000\000\000\000\000\000\024^\024j\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\029\000\000\000\000\004\029\000\000\000\000\004\029\000\000\000\000\000\000\000\000\004\029\000\000\000\000\000\000\004\029\004\029\004\029\000\000\004\029\004!\000\000\000\000\004\029\024\130\004\029\023~\023\174\000\000\000\000\004\029\024\142\024\154\004!\004!\000\000\004!\004!\000\000\004!\000\000\000\000\000\000\000\000\023\194\023\230\023\242\023\206\004!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\n\024\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\"\024F\000\000\000\000\000\000\000\000\000\000\004!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023\138\023\218\024.\024:\024R\000\000\000\000\000\000\000\000\024^\024j\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004!\000\000\000\000\004!\000\000\000\000\004!\000\000\000\000\000\000\000\000\004!\000\000\000\000\000\000\004!\004!\004!\000\000\004!\004%\000\000\000\000\004!\004!\004!\023~\023\174\000\000\000\000\004!\024\142\024\154\004%\004%\000\000\004%\004%\000\000\004%\000\000\000\000\000\000\000\000\023\194\023\230\023\242\023\206\004%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\n\024\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\"\024F\000\000\000\000\000\000\000\000\000\000\004%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023\138\023\218\024.\024:\024R\000\000\000\000\000\000\000\000\024^\024j\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004%\000\000\000\000\004%\000\000\000\000\004%\000\000\000\000\000\000\000\000\004%\000\000\000\000\000\000\004%\004%\004%\000\000\004%\004)\000\000\000\000\004%\004%\004%\023~\023\174\000\000\000\000\004%\024\142\024\154\004)\004)\000\000\004)\004)\000\000\023\186\000\000\000\000\000\000\000\000\023\194\023\230\023\242\023\206\023\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\n\024\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\"\024F\000\000\000\000\000\000\000\000\000\000\004)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023\138\023\218\024.\024:\024R\000\000\000\000\000\000\000\000\024^\024j\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004)\000\000\000\000\004)\000\000\000\000\004)\000\000\000\000\000\000\000\000\004)\000\000\000\000\000\000\004)\004)\024\166\000\000\004)\004\197\000\000\000\000\004)\024\130\004)\023~\023\174\000\000\000\000\004)\024\142\024\154\004\197\004\197\000\000\004\197\004\197\000\000\023\186\000\000\017y\000\000\000\000\023\194\023\230\023\242\023\206\023\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\n\024\022\000\000\000\000\000\000\000\000\000\000\017y\000\000\024\"\024F\017y\000\000\000\000\000\000\000\000\004\197\000\0001\018\000\000\000\000\000\000\000\000\000\000\023\138\023\218\024.\024:\024R\026B\000\000\000\254\000\000\024^\024j\000\000\001\n\000\000\001>\001\014\000\000\000\000\000\000\001n\004\197\001\018\000\000\004\197\017y\000\000\004\197\000\000\000\000\000\000\t\197\004\197\000\000\000\000\000\000\004\197\004\197\024\166\001\022\004\197\000\000\001\242\001\246\004\197\024\130\004\197\000\000\000\000\000\000\001\026\004\197\024\142\024\154\003\150\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\017y\003\242\017y\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\000\000\000\000\000\000\000\000\017y\000\000\000\000\021\158\000\000\000\000\026F\000\000\000\000\021\210\021\246\016\242\016\246\000\000\nM\022\022\nM\000\000\000\000\nM\nM\nM\nM\nM\nM\000\000\nM\005\222\nM\nM\nM\000\000\000\000\000\000\000\000\nM\000\000\016\250\000\000\027\226\019z\029\226\022\"\016\254\022&\nM\000\000\nM\nM\nM\nM\nM\000\000\000\000\000\000\000\000\nM\000\000\nM\000\000\000\000\nM\nM\nM\nM\nM\nM\000\000\nM\nM\nM\nM\000\000\nM\nM\nM\nM\nM\nM\nM\nM\nM\nM\nM\nM\000\000\000\000\000\000\000\000\000\000\000\000\000\000\nM\000\000\nM\000\000\000\000\000\000\nM\nM\nM\nM\nM\nM\nM\000\000\nM\000\000\000\000\000\000\000\000\000\000\004\018\004\018\004\018\000\000\nM\nM\nM\018\233\000\000\000\000\000\000\000\000\000\000\000\000\nM\nM\nM\000\000\000\000\nM\nM\nM\nM\nM\018\233\018\233\000\000\021\190\022.\023B\000\000\018\233\000\000\000\000\018\233\018\233\000\000\018\233\000\000\000\000\000\000\0226\018\233\018\233\018\233\018\233\018\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022:\018\233\018\233\023J\000\000\000\000\000\000\000\000\000\000\000\000\018\233\018\233\000\000\000\000\004\190\000\000\000\000\000\000\0312\016z\016\158\000\000\018\005\000\000\000\000\018\233\018\233\018\233\018\233\018\233\000\000\000\000\000\000\000\000\018\233\018\233\000\000\000\000\000\000\018\005\018\005\000\000\021\190\022.\023B\000\000\018\005\000\000\018\233\018\005\018\005\000\000\018\005\000\000\031>\000\000\0226\018\005\018\005\018\005\018\005\018\005\018\233\000\000\000\000\000\000\000\000\000\000\000\000\018\233\022:\018\005\018\005\023J\000\000\000\000\018\233\018\233\000\000\000\000\018\005\018\005\000\000\000\000\004\190\000\000\000\000\000\000\0312\016z\016\158\000\000\018\229\000\000\000\000\018\005\018\005\018\005\018\005\018\005\000\000\000\000\000\000\000\000\018\005\018\005\000\000\000\000\001\030\018\229\018\229>\178\021\190\022.\023B\000\000\018\229>\182\018\005\018\229\018\229\000\000\018\229\000\000\031>\003u\0226\018\229\018\229\018\229\018\229\018\229\018\005\000\000\000\000\000\000\000\000\000\000\000\000\018\005\022:\018\229\018\229\023J\000\000\000\000\018\005\018\005\000\000\000\000\018\229\018\229\n\250\001v\004\190\000\000\000\000\000\000\0312\016z\016\158\000\000\000\000\000\000\000\000\018\229\018\229\018\229\018\229\018\229*v>\186\000\254\000\000\018\229\018\229\000\000\001\n\000\000\001>\001\014\000\000\000\000\000\000\001n\000\000\001\018\000\000\018\229\000\000>\190\000\000\000\000\000\000\031>\000\000\000\000\003u\000\000\000\000\000\000\006\241\018\229\001\022\006\241\006\241\001\242\001\246\000\000\018\229\000\000\000\000\006\241\000\000\001\026\000\000\018\229\018\229\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\tB\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\006\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000*z\000\000\000\000\021\210\021\246\016\242\016\246\006\233\000\000\022\022\006\233\006\233\000\000\000\000\000\000\000\000\000\000\000\000\006\241\000\000\006\241\005\222\017\217\000\000\000\000\000\000\000\000\000\000\006\241\000\000\006\241\016\250\000\000\000\000\"\154\000\000\022\"\016\254\022&\017\217\017\217\000\000\021\190\022.\023B\000\000\017\217\006\241\006\233\017\217\017\217\006\233\017\217\000\000\000\000\000\000\0226\017\217\017\217\017\217\017\217\017\217\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022:\017\217\017\217\023J\000\000\000\000\000\000\006\233\000\000\006\233\017\217\017\217\000\000\000\000\004\190\000\000\000\000\006\233*\222\016z\016\158\000\000\000\000\000\000\000\000\017\217\017\217\017\217\017\217\017\217\000\000\000\000\nM\000\000\017\217\017\217\006\233\nM\000\000\nM\nM\000\000\000\000\000\000\nM\000\000\nM\000\000\017\217\000\000\000\000\000\000\000\000\000\000*\242\000\000\000\0002F\000\000\000\000\000\000\000\000\017\217\nM\000\000\000\000\nM\nM\000\000\017\217\000\000\000\000\000\000\000\000\nM\000\000\017\217\017\217\000\000\nM\nM\nM\nM\000\000\000\000\000\000\nM\nM\000\000\nM\000\000\nM\nM\000\000\nM\nM\nM\nM\nM\nM\nM\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\nM\000\000\000\000\000\000\000\000\000\000\nM\nM\nM\nM\000\000\000\000\nM\000\000\n\149\000\000\000\000\n\149\n\149\004\173\004\018\000\000\000\000\000\000\nM\023~\023\174\000\000\000\000\000\000\000\000\000\000\004\173\004\173\nM\004\173\004\173\000\000\023\186\nM\nM\nM\000\000\023\194\023\230\023\242\023\206\023\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\149\000\000\024\n\024\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\"\024F\000\000\000\000\000\000\000\000\000\000\004\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023\138\023\218\024.\024:\024R\n\149\000\000\000\000\000\000\024^\024j\000\000\000\000\n\149\000\000\n\149\000\000\000\000\000\000\000\000\004\173\bF\000\000\004\173\000\000\000\000\004\173\n\149\000\000\000\000\000\000\004\173\n\149\000\000\000\000\004\173\004\173\024\166\000\000\004\173\004\177\000\000\000\000\004\173\024\130\004\173\023~\023\174\000\000\000\000\004\173\024\142\024\154\004\177\004\177\000\000\004\177\004\177\000\000\023\186\000\000\000\000\000\000\000\000\023\194\023\230\023\242\023\206\023\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\n\024\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\"\024F\000\000\000\000\000\000\000\000\000\000\004\177\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023\138\023\218\024.\024:\024R\000\000\000\000\000\000\000\000\024^\024j\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\177\000\000\000\000\004\177\000\000\000\000\004\177\000\000\000\000\000\000\000\000\004\177\000\000\000\000\000\000\004\177\004\177\024\166\000\000\004\177\004\181\000\000\000\000\004\177\024\130\004\177\023~\023\174\000\000\000\000\004\177\024\142\024\154\004\181\004\181\000\000\004\181\004\181\000\000\023\186\000\000\000\000\000\000\000\000\023\194\023\230\023\242\023\206\023\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\n\024\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\"\024F\000\000\000\000\000\000\000\000\000\000\004\181\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023\138\023\218\024.\024:\024R\000\000\000\000\000\000\000\000\024^\024j\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\181\000\000\000\000\004\181\000\000\000\000\004\181\000\000\000\000\000\000\000\000\004\181\000\000\000\000\000\000\004\181\004\181\024\166\000\000\004\181\004\169\000\000\000\000\004\181\024\130\004\181\023~\023\174\000\000\000\000\004\181\024\142\024\154\004\169\004\169\000\000\004\169\004\169\000\000\023\186\000\000\000\000\000\000\000\000\023\194\023\230\023\242\023\206\023\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\n\024\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\"\024F\000\000\000\000\000\000\000\000\000\000\004\169\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023\138\023\218\024.\024:\024R\000\000\000\000\000\000\000\000\024^\024j\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\169\000\000\000\000\004\169\000\000\000\000\004\169\000\000\000\000\000\000\000\000\004\169\000\000\000\000\000\000\004\169\004\169\024\166\000\000\004\169\003\185\000\000\000\000\004\169\024\130\004\169\023~\023\174\000\000\000\000\004\169\024\142\024\154\003\185\003\185\000\000\003\185\003\185\000\000\023\186\000\000\000\000\000\000\000\000\023\194\023\230\023\242\023\206\023\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\n\024\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\"\024F\000\000\000\000\000\000\000\000\000\000\003\185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023\138\023\218\024.\024:\024R\000\000\000\000\000\000\000\000\024^\024j\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\185\000\000\000\000\003\185\000\000\000\000\003\185\000\000\000\000\000\000\000\000\003\185\000\000\000\000\000\000\003\185\003\185\024\166\000\000\003\185\003\189\000\000\000\000\003\185\024\130\003\185\023~\023\174\000\000\000\000\003\185\024\142\024\154\003\189\003\189\000\000\003\189\003\189\000\000\023\186\000\000\000\000\000\000\000\000\023\194\023\230\023\242\023\206\023\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\n\024\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\"\024F\000\000\000\000\000\000\000\000\000\000\003\189\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023\138\023\218\024.\024:\024R\000\000\000\000\000\000\000\000\024^\024j\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\189\000\000\000\000\003\189\000\000\000\000\003\189\000\000\000\000\000\000\000\000\003\189\000\000\000\000\000\000\003\189\003\189\024\166\000\000\003\189\0035\000\000\000\000\003\189\024\130\003\189\023~\023\174\000\000\000\000\003\189\024\142\024\154\0035\0035\000\000\0035\0035\000\000\023\186\000\000\000\000\000\000\000\000\023\194\023\230\023\242\023\206\023\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\n\024\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\"\024F\000\000\000\000\000\000\000\000\000\000\0035\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023\138\023\218\024.\024:\024R\000\000\000\000\000\000\000\000\024^\024j\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0035\000\000\000\000\0035\000\000\000\000\0035\000\000\000\000\000\000\000\000\0035\000\000\000\000\000\000\0035\0035\024\166\000\000\0035\007\225\000\000\000\000\0035\024\130\0035\023~\023\174\000\000\000\000\0035\024\142\024\154\007\225\007\225\000\000\007\225\007\225\000\000\023\186\000\000\000\000\000\000\000\000\023\194\023\230\023\242\023\206\023\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\n\024\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\"\024F\000\000\000\000\000\000\000\000\000\000\007\225\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023\138\023\218\024.\024:\024R\000\000\000\000\000\000\000\000\024^\024j\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\225\000\000\000\000\007\225\000\000\000\000\007\225\000\000\000\000\000\000\000\000\007\225\000\000\000\000\000\000\007\225\007\225\024\166\000\000\007\225\003\193\000\000\000\000\007\225\024\130\007\225\003\193\003\193\000\000\000\000\007\225\024\142\024\154\003\193\003\193\000\000\003\193\003\193\000\000\003\193\000\000\000\000\000\000\000\000\003\193\003\193\003\193\003\193\003\193\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\193\003\193\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\193\003\193\000\000\000\000\nu\000\000\000\000\003\193\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\193\003\193\003\193\003\193\003\193\000\000\000\000\000\000\000\000\003\193\003\193\000\000\000\000\nu\000\000\000\000\nu\nu\000\000\000\000\003\193\000\000\000\000\003\193\000\000\000\000\003\193\000\000\000\000\000\000\000\000\003\193\000\000\000\000\000\000\003\193\003\193\003\193\002i\003\193\011\246\000\000\000\000\003\193\003\1934z\000\000\000\000\000\000\000\000\003\193\003\193\003\193\000\000\nu\002i\002i\012\n\002i\002i\002i\000\000\002i\000\000\000\000\000\000\002i\000\000\002i\000\000\000\000\000\000\002i\002i\002i\002i\002i\002i\000\000\000\000\000\000\000\000\000\000 z\000\000\nu\002i\002i\002i\002i\000\000\000\000\000\000\nu\000\000\000\000\002i\002i\000\000\000\000\002i\nu\000\000\000\000\002i\002i\002i\nu\000\000\000\000\000\000\002i\002i\002i\002i\002i\000\000\000\000\000\000\000\000\002i\002i\000\000\000\000\000\000\000\000\003\154\003\158\000\000\000\000:\134\000\000\003\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002i\000\000\012R\000\000\000\000\000\000\028\n\000\000\002i\012n\028\014\003\213:\142\000\000\000\000\002i\000\000\023~\023\174\000\000\000\000\000\000\002i\002i\003\213\003\213\000\000\003\213\003\213\000\000\003\213:\146\011\154\000\000\000\000\023\194\023\230\023\242\023\206\023\254\000\000\004b\012v\012\134\000\000\003\222:\158\000\000\012\n\024\n\024\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\"\024F\000\000\000\000\000\000\000\000\000\000\003\213\000\000\000\000\000\000:\170\000\000\000\000\012\162\023\138\023\218\024.\024:\024R\000\000\000\000\000\000;Z\024^\024j\005\222\000\000\000\000\000\000\000\000\000\000\000\000:\178\000\000\003\213\000\000\000\000\003\213\000\000:\186\003\213\000\000\000\000\000\000\000\000\003\213\000\000\000\000\000\000\003\213\003\213\003\213\000\000\003\213\004\185\000\000\000\000\003\213\024\130\003\213\023~\023\174\000\000\000\000\003\213\024\142\024\154\004\185\004\185\000\000\004\185\004\185\000\000\023\186\000\000\000\000\000\000\000\000\023\194\023\230\023\242\023\206\023\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\n\024\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\"\024F\000\000\000\000\000\000\000\000\000\000\004\185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023\138\023\218\024.\024:\024R\000\000\000\000\nM\000\000\024^\024j\000\000\nM\000\000\nM\nM\000\000\000\000\000\000\nM\004\185\nM\000\000\004\185\000\000\000\000\004\185\000\000\000\000\000\000\000\000\004\1857f\000\000\000\000\004\185\004\185\024\166\nM\004\185\000\000\nM\nM\004\185\024\130\004\185\000\000\000\000\000\000\nM\004\185\024\142\024\154\nM\nM\nM\nM\nM\nM\nM\nM\nM\nM\000\000\nM\nM\nM\nM\nM\nM\nM\nM\nM\nM\nM\nM\020R\000\0009^::\000\000\000\000\000\000\000\000\nM\nM\nM\nM\nM\nM\000\000\nM\nM\nM\nM\nM\nM\nM\000\000\nM\nM\nM\nM\nM\nM\004\018\000\000\nM\nM\nM\nM\nM\nM\nM\nM\nM\nM\nM\nM\nM\nM\nM\nM\000\000\nM\nM\nM\000\000\000\000\000\000\000\000\nM\nM\000\000\000\000\000\000\000\000\nM\nM\nM\nM\nM\000\000\nM\nM\000\000\000\000\000\000\000\000\004\018\000\000\004\018\004\018\nM\000\000\nM\nM\018\001\000\000\000\000\000\000\000\000\000\000\nM\000\000\nM\nM\000\000\000\000\nM\nM\nM\nM\nM\018\001\018\001\000\000\021\190\022.\023B\000\000\018\001\000\000\000\000\018\001\018\001\000\000\018\001\000\000\000\000\000\000\0226\018\001\018\001\018\001\018\001\018\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022:\018\001\018\001\023J\000\000\000\000\000\000\000\000\000\000\000\000\018\001\018\001\000\000\000\000\004\190\000\000\000\000\000\000\0312\016z\016\158\000\000\000\000\000\000\000\000\018\001\018\001\018\001\018\001\018\001\000\000\000\000\0001\000\000\018\001\018\001\000\000\0001\000\000\0001\0001\000\000\000\000\000\000\0001\000\000\0001\000\000\018\001\000\000\000\000\000\000\000\000\000\000\031>\t\229\000\000\000\000\000\000\000\000\000\000\000\000\018\001\0001\000\000\000\000\0001\0001\000\000\018\001\000\000\000\000\000\000\000\000\0001\000\000\018\001\018\001\000\000\0001\0001\0001\0001\000\000\000\000\000\000\0001\0001\000\000\0001\000\000\0001\0001\000\000\0001\0001\0001\0001\0001\0001\0001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0001\000\000\000\000\000\000\000\000\000\000\0001\0001\0001\0001\000\000\000\000\0001\000-\000\000\000\000\000\000\000\000\000-\000\000\000-\000-\000\000\000\000\0001\000-\014b\000-\000\000\000\000\000\000\000\000\000\000\000\000\0001\000\000\t\225\000\000\000\000\0001\0001\0001\000\000\000\000\000-\000\000\000\000\000-\000-\b\177\b\177\000\000\b\177\b\177\000\000\000-\000\000\000\000\000\000\000\000\000-\000-\000-\000-\000\000\000\000\000\000\000-\000-\000\000\000-\000\000\000-\000-\000\000\000-\000-\000-\000-\000-\000-\000-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\177\000-\000\000\b\177\000\000\000\000\000\000\000-\000-\000-\000-\000\000\000\000\000-\017!\000\000\000\000\000\000\000\000\017!\000\000\017!\017!\000\000\000\000\000-\017!\000\000\017!\b\177\000\000\b\177\000\000\000\000\000\000\000-\000\000\t\237\000\000\b\177\000-\000-\000-\b\177\b\177\017!\000\000\000\000\017!\017!\000\000\b\177\000\000\000\000\000\000\000\000\017!\000\000\b\177\000\000\000\000\017!\017!\017!\017!\000\000\000\000\000\000\017!\017!\000\000\017!\000\000\017!\017!\000\000\017!\017!\017!\017!\017!\017!\017!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017!\000\000\000\000\000\000\000\000\000\000\017!\017!\017!\017!\000\000\000\000\017!\017\029\000\000\001Q\000\000\000\000\017\029\001Q\017\029\017\029\000\000\000\000\017!\017\029\000\000\017\029\000\000\000\000\000\000\000\000\000\000\000\000\017!\000\000\t\233\000\000\000\000\017!\017!\017!\015\194\000\000\017\029\000\000\000\000\017\029\017\029\000\000\000\000\000\000\000\000\003\254\000\000\017\029\001Q\000\000\004N\000\250\017\029\017\029\017\029\017\029\000\000\000\000\000\000\017\029\017\029\000\000\017\029\000\000\017\029\017\029\000\000\017\029\017\029\017\029\017\029\017\029\017\029\017\029\000\000\000\000\000\000\000\000\000\000\001Q\000\000\000\000\000\000\017\029\000\000\000\000\000\000\001Q\000\000\017\029\017\029\017\029\017\029\000\000\023\130\017\029\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\001Q\001Q\017\029\004>\019=\001J\000\000\000\000\000\000\000\000\000\000\000\000\017\029\000\000\nA\000\000\000\000\017\029\017\029\017\029\000\000\000\000\001\150\000\000\000\000\001\242\001\246\019=\019=\000\000\019=\019=\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019=\0166\000\000\019=\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000\023\142\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\019=\000\000\019=\000\000\000\000\000\000\004~\000\000\003\014\000\000\019=\021\130\015N\021\134\019=\019=\001\150\000\000\000\000\001\242\001\246\000\000\019=\000\000\000\000\000\000\000\000\001\154\000\000\019=\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000\023\178\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\0199\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\0199\0199\000\000\0199\0199\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0199\0166\000\000\0199\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000\023\198\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\0199\000\000\0199\000\000\000\000\000\000\004~\000\000\003\014\000\000\0199\021\130\015N\021\134\0199\0199\001\150\000\000\000\000\001\242\001\246\000\000\0199\000\000\000\000\000\000\000\000\001\154\000\000\0199\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000\023\210\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000\023\222\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000\023\234\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000\023\246\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000\024\002\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000\024\014\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000\024\026\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000\024&\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000\0242\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000\024>\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000\024J\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000\024V\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000\024b\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000\024v\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000\024\134\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000\024\146\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000\024\158\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000\024\170\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000\025B\021.\000\254\000\000\000\000\000\000\000\000\001\n\000\000\001>\001\014\000\000\000\000\005\222\001n\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\022\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\026\000\000\000\000\000\000\b\133\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\b\133\004\r\000\000\b\133\b\133\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\004\r\004\r\022\022\000\000\000\000\000\000\000\000\004\r\004\r+F\004\r\004\r\000\000\004\r\005\222\000\000\000\000\000\000\004\r\004\r\004\r\004\r\004\r\b\133\016\250\000\000\031\166\000\000\000\000\022\"\016\254\022&\004\r\004\r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\r\004\r\000\000\000\000\000\000\000\000\000\000\004\r\000\000\000\000\000\000\000\000\000\000\b\133\000\000\025J\004\r\004\r\004\r\004\r\025N\b\133\000\254\004\r\004\r\004\r\000\000\001\n\000\000\001>\001\014\000\000\000\000\000\000\001n\000\000\001\018\000\000\004\r\000\000\b\133\000\000\000\000\000\000\000\000\000\000\004\r\000\000\000\000\000\000\004\r\004\r\004\r\001\022\004\r\000\000\001\242\001\246\004\r\004\r\004\r\000\000\000\000\000\000\001\026\004\r\004\r\004\r\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\003\249\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\003\249\003\249\022\022\000\000\000\000\000\000\000\000\003\249\003\249\000\000\003\249\003\249\000\000\003\249\005\222\000\000\000\000\000\000\003\249\003\249\003\249\003\249\003\249\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\003\249\003\249\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\249\003\249\000\000\000\000\000\000\000\000\000\000\003\249\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\003\249\003\249\003\249\003\249\025z\000\000\000\254\003\249\003\249\003\249\000\000\001\n\000\000\001>\001\014\000\000\000\000\000\000\001n\000\000\001\018\000\000\003\249\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\249\000\000\000\000\000\000\003\249\003\249\003\249\001\022\003\249\000\000\001\242\001\246\003\249\003\249\003\249\000\000\000\000\000\000\001\026\003\249\003\249\003\249\nu\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\nu\003\245\000\000\nu\nu\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\003\245\003\245\022\022\000\000\000\000\000\000\000\000\003\245\003\245\011\246\003\245\003\245\000\000\003\245\005\222\000\000\000\000\000\000\003\245\003\245\003\245\003\245\003\245\nu\016\250\000\000\012\n\000\000\000\000\022\"\016\254\022&\003\245\003\245\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\245\003\245\000\000\000\000\000\000\000\000\000\000\003\245\000\000\000\000\000\000 \138\000\000\nu\000\000\025J\003\245\003\245\003\245\003\245\000\000\nu\000\000\003\245\003\245\003\245\000\000\000\000\000\000\nu\000\000\000\000\000\000\000\000\000\000\nu\000\000\000\000\003\245\000\000\000\000\000\000\000\000\000\000\004\197\000\000\003\245\000\000\000\000\000\000\003\245\003\245\003\245\000\000\003\245\000\000\000\000\000\000\003\245\003\245\003\245\025>\025v\000\000\000\000\003\245\003\245\003\245\004\197\004\197\000\000\004\197\004\197\000\000\025\134\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\222\025\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\246\026\026\000\000\000\000\000\000\000\000\000\000\004\197\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\026&\025\154\000\000\000\254\004\197\0262\026>\000\000\001\n\000\000\001>\001\014\000\000\000\000\000\000\001n\000\000\001\018\000\000\004\197\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\197\000\000\000\000\000\000\004\197\004\197\026z\001\022\004\197\000\000\001\242\001\246\004\197\026V\004\197\000\000\000\000\000\000\001\026\004\197\026b\026n\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\004-\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\025>\025v\022\022\000\000\000\000\000\000\000\000\004-\004-\000\000\004-\004-\000\000\004-\005\222\000\000\000\000\000\000\004-\004-\004-\025\162\004-\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\004-\004-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004-\004-\000\000\000\000\000\000\000\000\000\000\004-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\004-\004-\004-\025\166\000\000\000\254\004-\004-\004-\000\000\001\n\000\000\001>\001\014\000\000\000\000\000\000\001n\000\000\001\018\000\000\004-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004-\000\000\000\000\000\000\004-\004-\004-\001\022\004-\000\000\001\242\001\246\004-\004-\004-\000\000\000\000\000\000\001\026\004-\004-\004-\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\0041\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\0041\0041\022\022\000\000\000\000\000\000\000\000\0041\0041\000\000\0041\0041\000\000\0041\005\222\000\000\000\000\000\000\0041\0041\0041\0041\0041\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\0041\0041\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0041\0041\000\000\000\000\000\000\000\000\000\000\0041\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\0041\0041\0041\0041\025\178\000\000\000\254\0041\0041\0041\000\000\001\n\000\000\001>\001\014\000\000\000\000\000\000\001n\000\000\001\018\000\000\0041\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0041\000\000\000\000\000\000\0041\0041\0041\001\022\0041\000\000\001\242\001\246\0041\0041\0041\000\000\000\000\000\000\001\026\0041\0041\0041\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\003\241\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\003\241\003\241\022\022\000\000\000\000\000\000\000\000\003\241\003\241\000\000\003\241\003\241\000\000\003\241\005\222\000\000\000\000\000\000\003\241\003\241\003\241\003\241\003\241\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\003\241\003\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\241\003\241\000\000\000\000\000\000\000\000\000\000\003\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\003\241\003\241\003\241\003\241\025\190\000\000\000\254\003\241\003\241\003\241\000\000\001\n\000\000\001>\001\014\000\000\000\000\000\000\001n\000\000\001\018\000\000\003\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\241\000\000\000\000\000\000\003\241\003\241\003\241\001\022\003\241\000\000\001\242\001\246\003\241\003\241\003\241\000\000\000\000\000\000\001\026\003\241\003\241\003\241\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\004\001\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\025>\025v\022\022\000\000\000\000\000\000\000\000\004\001\004\001\000\000\004\001\004\001\000\000\004\001\005\222\000\000\000\000\000\000\004\001\004\001\004\001\025\162\004\001\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\004\001\004\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\001\004\001\000\000\000\000\000\000\000\000\000\000\004\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\004\001\004\001\004\001\025\202\000\000\000\254\004\001\004\001\004\001\000\000\001\n\000\000\001>\001\014\000\000\000\000\000\000\001n\000\000\001\018\000\000\004\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\001\000\000\000\000\000\000\004\001\004\001\004\001\001\022\004\001\000\000\001\242\001\246\004\001\004\001\004\001\000\000\000\000\000\000\001\026\004\001\004\001\004\001\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\003\253\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\025>\025v\022\022\000\000\000\000\000\000\000\000\003\253\003\253\000\000\003\253\003\253\000\000\003\253\005\222\000\000\000\000\000\000\003\253\003\253\003\253\025\162\003\253\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\003\253\003\253\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\253\003\253\000\000\000\000\000\000\000\000\000\000\003\253\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\003\253\003\253\003\253\025\214\000\000\000\254\003\253\003\253\003\253\000\000\001\n\000\000\001>\001\014\000\000\000\000\000\000\001n\000\000\001\018\000\000\003\253\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\253\000\000\000\000\000\000\003\253\003\253\003\253\001\022\003\253\000\000\001\242\001\246\003\253\003\253\003\253\000\000\000\000\000\000\001\026\003\253\003\253\003\253\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\004\025\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\025>\025v\022\022\000\000\000\000\000\000\000\000\004\025\004\025\000\000\004\025\004\025\000\000\004\025\005\222\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\025\222\025\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\246\026\026\000\000\000\000\000\000\000\000\000\000\004\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\026&\025\226\000\000\000\254\004\025\0262\026>\000\000\001\n\000\000\001>\001\014\000\000\000\000\000\000\001n\000\000\001\018\000\000\004\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\025\000\000\000\000\000\000\004\025\004\025\004\025\001\022\004\025\000\000\001\242\001\246\004\025\026V\004\025\000\000\000\000\000\000\001\026\004\025\026b\026n\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\004\t\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\025>\025v\022\022\000\000\000\000\000\000\000\000\004\t\004\t\000\000\004\t\004\t\000\000\004\t\005\222\000\000\000\000\000\000\004\t\004\t\004\t\025\162\004\t\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\004\t\004\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\t\004\t\000\000\000\000\000\000\000\000\000\000\004\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\004\t\004\t\004\t\025\238\000\000\000\254\004\t\004\t\004\t\000\000\001\n\000\000\001>\001\014\000\000\000\000\000\000\001n\000\000\001\018\000\000\004\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\t\000\000\000\000\000\000\004\t\004\t\004\t\001\022\004\t\000\000\001\242\001\246\004\t\004\t\004\t\000\000\000\000\000\000\001\026\004\t\004\t\004\t\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\004\005\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\025>\025v\022\022\000\000\000\000\000\000\000\000\004\005\004\005\000\000\004\005\004\005\000\000\004\005\005\222\000\000\000\000\000\000\004\005\004\005\004\005\025\162\004\005\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\004\005\004\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\005\004\005\000\000\000\000\000\000\000\000\000\000\004\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\004\005\004\005\004\005\025\250\000\000\000\254\004\005\004\005\004\005\000\000\001\n\000\000\001>\001\014\000\000\000\000\000\000\001n\000\000\001\018\000\000\004\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\005\000\000\000\000\000\000\004\005\004\005\004\005\001\022\004\005\000\000\001\242\001\246\004\005\004\005\004\005\000\000\000\000\000\000\001\026\004\005\004\005\004\005\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\0045\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\025>\025v\022\022\000\000\000\000\000\000\000\000\0045\0045\000\000\0045\0045\000\000\0045\005\222\000\000\000\000\000\000\025\150\025\186\025\198\025\162\0045\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\025\222\025\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0045\0045\000\000\000\000\000\000\000\000\000\000\0045\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\0045\026\006\000\000\000\254\0045\0045\0045\000\000\001\n\000\000\001>\001\014\000\000\000\000\000\000\001n\000\000\001\018\000\000\0045\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0045\000\000\000\000\000\000\0045\0045\0045\001\022\0045\000\000\001\242\001\246\0045\0045\0045\000\000\000\000\000\000\001\026\0045\0045\0045\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\003\237\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\025>\025v\022\022\000\000\000\000\000\000\000\000\003\237\003\237\000\000\003\237\003\237\000\000\003\237\005\222\000\000\000\000\000\000\003\237\003\237\003\237\025\162\003\237\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\003\237\003\237\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\237\003\237\000\000\000\000\000\000\000\000\000\000\003\237\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\003\237\003\237\003\237\026\018\000\000\000\254\003\237\003\237\003\237\000\000\001\n\000\000\001>\001\014\000\000\000\000\000\000\001n\000\000\001\018\000\000\003\237\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\237\000\000\000\000\000\000\003\237\003\237\003\237\001\022\003\237\000\000\001\242\001\246\003\237\003\237\003\237\000\000\000\000\000\000\001\026\003\237\003\237\003\237\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\003\233\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\025>\025v\022\022\000\000\000\000\000\000\000\000\003\233\003\233\000\000\003\233\003\233\000\000\003\233\005\222\000\000\000\000\000\000\025\150\025\186\025\198\025\162\003\233\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\025\222\025\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\233\003\233\000\000\000\000\000\000\000\000\000\000\003\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\003\233\026\030\000\000\000\254\003\233\003\233\003\233\000\000\001\n\000\000\001>\001\014\000\000\000\000\000\000\001n\000\000\001\018\000\000\003\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\233\000\000\000\000\000\000\003\233\003\233\003\233\001\022\003\233\000\000\001\242\001\246\003\233\003\233\003\233\000\000\000\000\000\000\001\026\003\233\003\233\003\233\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\004\017\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\025>\025v\022\022\000\000\000\000\000\000\000\000\004\017\004\017\000\000\004\017\004\017\000\000\004\017\005\222\000\000\000\000\000\000\025\150\025\186\025\198\025\162\004\017\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\025\222\025\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\246\004\017\000\000\000\000\000\000\000\000\000\000\004\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\004\017\026*\000\000\000\254\004\017\004\017\004\017\000\000\001\n\000\000\001>\001\014\000\000\000\000\000\000\001n\000\000\001\018\000\000\004\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\017\000\000\000\000\000\000\004\017\004\017\004\017\001\022\004\017\000\000\001\242\001\246\004\017\004\017\004\017\000\000\000\000\000\000\001\026\004\017\004\017\004\017\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\003\229\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\025>\025v\022\022\000\000\000\000\000\000\000\000\003\229\003\229\000\000\003\229\003\229\000\000\003\229\005\222\000\000\000\000\000\000\025\150\025\186\025\198\025\162\003\229\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\025\222\025\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\246\003\229\000\000\000\000\000\000\000\000\000\000\003\229\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\003\229\0266\000\000\000\254\003\229\003\229\003\229\000\000\001\n\000\000\001>\001\014\000\000\000\000\000\000\001n\000\000\001\018\000\000\003\229\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\229\000\000\000\000\000\000\003\229\003\229\003\229\001\022\003\229\000\000\001\242\001\246\003\229\003\229\003\229\000\000\000\000\000\000\001\026\003\229\003\229\003\229\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\004=\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\025>\025v\022\022\000\000\000\000\000\000\000\000\004=\004=\000\000\004=\004=\000\000\004=\005\222\000\000\000\000\000\000\025\150\025\186\025\198\025\162\004=\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\025\222\025\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\246\004=\000\000\000\000\000\000\000\000\000\000\004=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\004=\026J\000\000\000\254\004=\004=\004=\000\000\001\n\000\000\001>\001\014\000\000\000\000\000\000\001n\000\000\001\018\000\000\004=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004=\000\000\000\000\000\000\004=\004=\004=\001\022\004=\000\000\001\242\001\246\004=\004=\004=\000\000\000\000\000\000\001\026\004=\004=\004=\nu\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\nu\0049\000\000\nu\nu\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\025>\025v\022\022\000\000\000\000\000\000\000\000\0049\0049\011\246\0049\0049\000\000\0049\005\222\000\000\000\000\000\000\025\150\025\186\025\198\025\162\0049\nu\016\250\000\000\012\n\000\000\000\000\022\"\016\254\022&\025\222\025\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\246\0049\000\000\000\000\000\000\000\000\000\000\0049\000\000\000\000\000\000 \150\000\000\nu\000\000\025J\025\174\026\002\026\014\0049\000\000\nu\000\000\0049\0049\0049\000\000\000\000\000\000\nu\000\000\000\000\000\000\000\000\000\000\nu\000\000\000\000\0049\000\000\000\000\000\000\000\000\000\000\004\021\000\000\0049\000\000\000\000\000\000\0049\0049\0049\000\000\0049\000\000\000\000\000\000\0049\0049\0049\025>\025v\000\000\000\000\0049\0049\0049\004\021\004\021\000\000\004\021\004\021\000\000\004\021\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\004\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\222\025\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\246\004\021\000\000\000\000\000\000\000\000\000\000\004\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\004\021\026Z\000\000\000\254\004\021\004\021\004\021\000\000\001\n\000\000\001>\001\014\000\000\000\000\000\000\001n\000\000\001\018\000\000\004\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\021\000\000\000\000\000\000\004\021\004\021\004\021\001\022\004\021\000\000\001\242\001\246\004\021\004\021\004\021\000\000\000\000\000\000\001\026\004\021\004\021\004\021\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\004\029\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\025>\025v\022\022\000\000\000\000\000\000\000\000\004\029\004\029\000\000\004\029\004\029\000\000\004\029\005\222\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\025\222\025\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\246\026\026\000\000\000\000\000\000\000\000\000\000\004\029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\026&\026f\000\000\000\254\004\029\0262\026>\000\000\001\n\000\000\001>\001\014\000\000\000\000\000\000\001n\000\000\001\018\000\000\004\029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\029\000\000\000\000\000\000\004\029\004\029\004\029\001\022\004\029\000\000\001\242\001\246\004\029\026V\004\029\000\000\000\000\000\000\001\026\004\029\026b\026n\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\004!\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\025>\025v\022\022\000\000\000\000\000\000\000\000\004!\004!\000\000\004!\004!\000\000\004!\005\222\000\000\000\000\000\000\025\150\025\186\025\198\025\162\004!\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\025\222\025\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\246\026\026\000\000\000\000\000\000\000\000\000\000\004!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\026&\026r\000\000\000\254\004!\0262\026>\000\000\001\n\000\000\001>\001\014\000\000\000\000\000\000\001n\000\000\001\018\000\000\004!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004!\000\000\000\000\000\000\004!\004!\004!\001\022\004!\000\000\001\242\001\246\004!\004!\004!\000\000\000\000\000\000\001\026\004!\026b\026n\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\004%\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\025>\025v\022\022\000\000\000\000\000\000\000\000\004%\004%\000\000\004%\004%\000\000\004%\005\222\000\000\000\000\000\000\025\150\025\186\025\198\025\162\004%\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\025\222\025\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\246\026\026\000\000\000\000\000\000\000\000\000\000\004%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\026&\026~\000\000\000\254\004%\0262\026>\000\000\001\n\000\000\001>\001\014\000\000\000\000\000\000\001n\000\000\001\018\000\000\004%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004%\000\000\000\000\000\000\004%\004%\004%\001\022\004%\000\000\001\242\001\246\004%\004%\004%\000\000\000\000\000\000\001\026\004%\026b\026n\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\004)\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\025>\025v\022\022\000\000\000\000\000\000\000\000\004)\004)\000\000\004)\004)\000\000\025\134\005\222\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\025\222\025\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\246\026\026\000\000\000\000\000\000\000\000\000\000\004)\019=\019=\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\026&\000\000\000\000\000\000\004)\0262\026>\000\000\000\000\000\000\000\000\000\000\000\000\019=\019=\000\000\019=\019=\000\000\004)\000\000\000\000\000\000\000\000\000\000\004\173\000\000\004)\000\000\000\000\000\000\004)\004)\026z\000\000\004)\000\000\000\000\000\000\004)\026V\004)\025>\025v\000\000\000\000\004)\026b\026n\004\173\004\173\000\000\004\173\004\173\019=\025\134\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\222\025\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\246\026\026\019=\000\000\000\000\000\000\000\000\004\173\027.\000\000\019=\000\000\000\000\000\000\019=\025J\025\174\026\002\026\014\026&\000\000\000\000\019=\004\173\0262\026>\000\000\000\000\000\000\019=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\173\000\000\000\000\000\000\000\000\000\000\004\177\000\000\004\173\000\000\000\000\000\000\004\173\004\173\026z\000\000\004\173\000\000\000\000\000\000\004\173\026V\004\173\025>\025v\000\000\000\000\004\173\026b\026n\004\177\004\177\000\000\004\177\004\177\000\000\025\134\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\222\025\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\246\026\026\000\000\000\000\000\000\000\000\000\000\004\177\0199\0199\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\026&\000\000\000\000\000\000\004\177\0262\026>\000\000\000\000\000\000\000\000\000\000\000\000\0199\0199\000\000\0199\0199\000\000\004\177\000\000\000\000\000\000\000\000\000\000\004\181\000\000\004\177\000\000\000\000\000\000\004\177\004\177\026z\000\000\004\177\000\000\000\000\000\000\004\177\026V\004\177\025>\025v\000\000\000\000\004\177\026b\026n\004\181\004\181\000\000\004\181\004\181\0199\025\134\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\222\025\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\246\026\026\0199\000\000\000\000\000\000\000\000\004\181\027.\000\000\0199\000\000\000\000\000\000\0199\025J\025\174\026\002\026\014\026&\000\000\000\000\0199\004\181\0262\026>\000\000\000\000\000\000\0199\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\181\000\000\000\000\000\000\000\000\000\000\004\169\000\000\004\181\000\000\000\000\000\000\004\181\004\181\026z\000\000\004\181\000\000\000\000\000\000\004\181\026V\004\181\025>\025v\000\000\000\000\004\181\026b\026n\004\169\004\169\000\000\004\169\004\169\000\000\025\134\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\222\025\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\246\026\026\000\000\000\000\000\000\000\000\000\000\004\169\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\026&\000\000\000\000\000\000\004\169\0262\026>\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\169\000\000\000\000\000\000\000\000\000\000\007\225\000\000\004\169\000\000\000\000\000\000\004\169\004\169\026z\000\000\004\169\000\000\000\000\000\000\004\169\026V\004\169\025>\025v\000\000\000\000\004\169\026b\026n\007\225\007\225\000\000\007\225\007\225\000\000\025\134\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\222\025\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\246\026\026\000\000\000\000\000\000\000\000\000\000\007\225\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\026&)\154\000\000\000\254\007\225\0262\026>\000\000\001\n\000\000\001>\001\014\000\000\000\000\000\000\001n\000\000\001\018\000\000\007\225\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\225\000\000\000\000\000\000\007\225\007\225\026z\001\022\007\225\000\000\001\242\001\246\007\225\026V\007\225\000\000\000\000\000\000\001\026\007\225\026b\026n\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\000\000)\166\022\022\000\254\000\000\000\000\000\000\000\000\001\n\000\000\001>\001\014\000\000\000\000\005\222\001n\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\000\000\000\000\001\022\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\026\000\000\000\000\000\000\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\000\000)\194\022\022\000\254\000\000\000\000\000\000\000\000\001\n\000\000\001>\001\014\000\000\000\000\005\222\001n\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\000\000\000\000\001\022\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\026\000\000\000\000\000\000\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\000\000)\206\022\022\000\254\000\000\000\000\000\000\000\000\001\n\000\000\001>\001\014\000\000\000\000\005\222\001n\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\000\000\000\000\001\022\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\026\000\000\000\000\000\000\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\000\000)\218\022\022\000\254\000\000\000\000\000\000\000\000\001\n\000\000\001>\001\014\000\000\000\000\005\222\001n\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\000\000\000\000\001\022\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\026\000\000\000\000\000\000\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\000\000)\230\022\022\000\254\000\000\000\000\000\000\000\000\001\n\000\000\001>\001\014\000\000\000\000\005\222\001n\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\000\000\000\000\001\022\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\026\000\000\000\000\000\000\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\000\000)\242\022\022\000\254\000\000\000\000\000\000\000\000\001\n\000\000\001>\001\014\000\000\000\000\005\222\001n\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\000\000\000\000\001\022\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\026\000\000\000\000\000\000\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\000\000)\254\022\022\000\254\000\000\000\000\000\000\000\000\001\n\000\000\001>\001\014\000\000\000\000\005\222\001n\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\000\000\000\000\001\022\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\026\000\000\000\000\000\000\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\000\000*\n\022\022\000\254\000\000\000\000\000\000\000\000\001\n\000\000\001>\001\014\000\000\000\000\005\222\001n\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\000\000\000\000\001\022\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\026\000\000\000\000\000\000\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\000\000*\022\022\022\000\254\000\000\000\000\000\000\000\000\001\n\000\000\001>\001\014\000\000\000\000\005\222\001n\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\000\000\000\000\001\022\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\026\000\000\000\000\000\000\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\000\000*\"\022\022\000\254\000\000\000\000\000\000\000\000\001\n\000\000\001>\001\014\000\000\000\000\005\222\001n\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\000\000\000\000\001\022\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\026\000\000\000\000\000\000\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\000\000*.\022\022\000\254\000\000\000\000\000\000\000\000\001\n\000\000\001>\001\014\000\000\000\000\005\222\001n\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\000\000\000\000\001\022\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\026\000\000\000\000\000\000\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\000\000*:\022\022\000\254\000\000\000\000\000\000\000\000\001\n\000\000\001>\001\014\000\000\000\000\005\222\001n\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\000\000\000\000\001\022\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\026\000\000\000\000\000\000\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\000\000*F\022\022\000\254\000\000\000\000\000\000\000\000\001\n\000\000\001>\001\014\000\000\000\000\005\222\001n\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\000\000\000\000\001\022\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\026\000\000\000\000\000\000\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\000\000*R\022\022\000\254\000\000\000\000\000\000\000\000\001\n\000\000\001>\001\014\000\000\000\000\005\222\001n\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\000\000\000\000\001\022\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\026\000\000\000\000\000\000\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\000\000*^\022\022\000\254\000\000\000\000\000\000\000\000\001\n\000\000\001>\001\014\000\000\000\000\005\222\001n\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\000\000\000\000\001\022\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\026\000\000\000\000\000\000\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\000\000*j\022\022\000\254\000\000\000\000\000\000\000\000\001\n\000\000\001>\001\014\000\000\000\000\005\222\001n\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\000\000\000\000\001\022\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\026\000\000\000\000\000\000\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\000\000*~\022\022\000\254\000\000\000\000\000\000\000\000\001\n\000\000\001>\001\014\000\000\000\000\005\222\001n\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\000\000\000\000\001\022\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\026\000\000\000\000\000\000\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\000\000*\142\022\022\000\254\000\000\000\000\000\000\000\000\001\n\000\000\001>\001\014\000\000\000\000\005\222\001n\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\000\000\000\000\001\022\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\026\000\000\000\000\000\000\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\000\000*\154\022\022\000\254\000\000\000\000\000\000\000\000\001\n\000\000\001>\001\014\000\000\000\000\005\222\001n\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\000\000\000\000\001\022\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\026\000\000\000\000\000\000\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\000\000*\166\022\022\000\254\000\000\000\000\000\000\000\000\001\n\000\000\001>\001\014\000\000\000\000\005\222\001n\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\000\000\000\000\001\022\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\026\000\000\000\000\000\000\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\000\000*\178\022\022\000\254\000\000\000\000\000\000\000\000\001\n\000\000\001>\001\014\000\000\000\000\005\222\001n\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\000\000\000\000\001\022\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\026\000\000\000\000\000\000\000\000\001\250\001\254\002\002\004Z\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\003\222\016j\016z\016\158\016\234\016\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\158\000\000\000\000\000\000\000\000\000\000\021\210\021\246\016\242\016\246\000\000\000\000\022\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\222\019\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\250\000\000\000\000\000\000\000\000\022\"\016\254\022&\019\001\019\001\000\000\019\001\019\001\019\001\000\000\019\001\000\000\000\000\019\001\000\000\000\000\019\001\000\000\000\000\000\000\019\001\019\001\019\001\019\001\019\001\019\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019\001\019\001\019\001\019\001\000\000\000\000\000\000\000\000\000\000\000\000\019\001\019\001\000\000\000\000\019\001\000\000\000\000\000\000\019\001\019\001\019\001\000\000\003\185\000\000\000\000\019\001\019\001\019\001\019\001\019\001\000\000\000\000\000\000\000\000\019\001\019\001\000\000\000\000\000\000\025>\025v\000\000\000\000\000\000\000\000\015-\003\185\003\185\000\000\003\185\003\185\000\000\025\134\000\000\019\001\000\000\000\000\025\150\025\186\025\198\025\162\025\210\019\001\000\000\000\000\000\000\000\000\000\000\000\000\019\001\000\000\025\222\025\234\000\000\000\000\000\000\019\001\019\001\000\000\000\000\025\246\026\026\000\000\000\000\000\000\000\000\000\000\003\185\014\245\014\245\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\026&\000\000\000\000\000\000\003\185\0262\026>\000\000\000\000\000\000\000\000\000\000\000\000\014\245\014\245\000\000\014\245\014\245\000\000\003\185\000\000\000\000\000\000\000\000\000\000\003\189\000\000\003\185\000\000\000\000\000\000\003\185\003\185\026z\000\000\003\185\000\000\000\000\000\000\003\185\026V\003\185\025>\025v\000\000\000\000\003\185\026b\026n\003\189\003\189\000\000\003\189\003\189\014\245\025\134\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\222\025\234\000\000\000\000\000\000\000\000\000\000\000\000\005=\025\246\026\026\014\245\000\000\000\000\000\000\000\000\003\189\b\161\b\161\014\245\000\000\000\000\000\000\014\245\025J\025\174\026\002\026\014\026&\000\000\000\000\014\245\003\189\0262\026>\000\000\000\000\000\000\014\245\000\000\000\000\b\161\b\161\000\000\b\161\b\161\000\000\003\189\000\000\000\000\000\000\000\000\000\000\0035\000\000\003\189\000\000\000\000\000\000\003\189\003\189\026z\000\000\003\189\000\000\000\000\000\000\003\189\026V\003\189\025>\025v\000\000\000\000\003\189\026b\026n\0035\0035\000\000\0035\0035\b\161\025\134\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\222\025\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\246\026\026\b\161\000\000\000\000\000\000\000\000\0035\b\177\026\230\b\161\000\000\000\000\000\000\b\161\025J\025\174\026\002\026\014\026&\000\000\000\000\b\161\0035\0262\026>\000\000\000\000\000\000\027f\000\000\000\000\b\177\b\177\000\000\b\177\b\177\000\000\0035\000\000\000\000\000\000\000\000\000\000\003\193\000\000\0035\000\000\000\000\000\000\0035\0035\026z\000\000\0035\000\000\000\000\000\000\0035\026V\0035\003\193\003\193\000\000\000\000\0035\026b\026n\003\193\003\193\000\000\003\193\003\193\b\177\003\193\000\000\000\000\000\000\000\000\003\193\003\193\003\193\003\193\003\193\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\193\003\193\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\193\003\193\b\177\000\000\000\000\000\000\000\000\003\193\000\000\000\000\b\177\000\000\000\000\000\000\b\177\003\193\003\193\003\193\003\193\003\193\000\000\000\000\b\177\003\193\003\193\003\193\000\000\000\000\000\000\b\177\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\193\000\000\000\000\000\000\000\000\000\000\003\213\000\000\003\193\000\000\000\000\000\000\003\193\003\193\003\193\000\000\003\193\000\000\000\000\000\000\003\193\003\193\031\210\025>\025v\000\000\000\000\003\193\003\193\003\193\003\213\003\213\000\000\003\213\003\213\000\000\003\213\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\222\025\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\246\026\026\000\000\000\000\000\000\000\000\000\000\003\213\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\026&\000\000\000\000\000\000\003\213\0262\026>\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\213\000\000\000\000\000\000\000\000\000\000\004\185\000\000\003\213\000\000\000\000\000\000\003\213\003\213\003\213\000\000\003\213\000\000\000\000\000\000\003\213\026V\003\213\025>\025v\000\000\000\000\003\213\026b\026n\004\185\004\185\000\000\004\185\004\185\000\000\025\134\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\222\025\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\246\026\026\000\000\000\000\000\000\000\000\000\000\004\185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\026&@\154\000\000\000\242\004\185\0262\026>\000\000\001\030\000\000\004\030\001F\000\000\000\000\000\000\004>\000\000\001J\000\000\004\185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\185\000\000\000\000\000\000\004\185\004\185\026z\001\150\004\185\000\000\001\242\001\246\004\185\026V\004\185\000\000\000\000\000\000\001\154\004\185\026b\026n\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000@\166\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000@\194\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000@\206\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000@\218\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000@\230\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000@\242\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000@\254\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000A\n\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000A\022\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000A\"\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000A.\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000A:\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000AF\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000AR\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000A^\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000Aj\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000A~\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000A\142\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000A\154\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000A\166\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000A\178\021.\000\242\000\000\000\000\000\000\000\000\001\030\000\000\004\030\001F\000\000\000\000\005\222\004>\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\021\130\015N\021\134\000\000\000\000\001\150\000\000\000\000\001\242\001\246\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\nu\001\250\001\254\004\170\015\030\000\000\000\000\000\000\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\003\222\015>\004N\000\250\015J\004r\000\000\nu\000\000\000\000\nu\nu\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\017\014\021\026\004v\004z\000\000\000\000\021.\000\000\000\000\000\000\000\000\000\000\000\000\011\246\000\000\000\000\000\000\000\000\005\222\017\249\017\249\000\000\015r\016F\021\142\000\000\017\249\nu\004~\000\000\012\n\000\000\017\249\021\130\015N\021\134\015\182\017\249\017\249\017\249\017\249\017\249\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\186\017\249\017\249\015\194\000\000\000\000 \162\000\000\nu\000\000\017\249\017\249\000\000\000\000\003\254\000\000\nu\000\000\016N\004N\000\250\000\000\000\000\000\000\nu\017\249\017\249\017\249\017\249\017\249\nu\000\000\000\000\000\000\017\249\017\249\000\000\000\000\000\000\018\001\018\001\000\000\015r\016F\021\142\000\000\018\001\000\000\017\249\000\000?2\000\000\018\001\000\000\021\150\000\000\015\182\018\001\018\001\018\001\018\001\018\001\017\249\000\000\000\000\000\000\000\000\000\000\000\000\017\249\015\186\018\001\018\001\015\194\000\000\000\000\017\249\017\249\000\000\000\000\018\001\018\001\000\000\000\000\003\254\000\000\000\000\000\000\016N\004N\000\250\000\000\000\000\000\000\000\000\018\001\018\001\018\001\018\001\018\001\000\000\000\000\000\000\000\000\018\001\018\001\000\000\000\000\000\000\018\233\018\233\000\000\015r\016F\021\142\000\000\018\233\000\000\018\001\000\000\000\000\000\000\018\233\000\000\021\150\000\000\015\182\018\233\018\233\018\233\018\233\018\233\018\001\000\000\000\000\000\000\000\000\000\000\000\000\018\001\015\186\018\233\018\233\015\194\000\000\000\000\018\001\018\001\000\000\000\000\018\233\018\233\000\000\000\000\003\254\000\000\000\000\000\000\016N\004N\000\250\000\000\000\000\000\000\000\000\018\233\018\233\018\233\018\233\018\233\000\000\000\000\000\000\000\000\018\233\018\233\000\000\000\000\000\000\018\005\018\005\000\000\015r\016F\021\142\000\000\018\005\000\000\018\233\000\000\000\000\000\000\018\005\000\000\021\150\000\000\015\182\018\005\018\005\018\005\018\005\018\005\018\233\000\000\000\000\000\000\000\000\000\000\000\000\018\233\015\186\018\005\018\005\015\194\000\000\000\000\018\233\018\233\000\000\000\000\018\005\018\005\000\000\000\000\003\254\000\000\000\000\000\000\016N\004N\000\250\000\000\000\000\000\000\000\000\018\005\018\005\018\005\018\005\018\005\000\000\000\000\000\000\000\000\018\005\018\005\000\000\000\000\000\000\018\229\018\229\000\000\015r\016F\021\142\000\000\018\229\000\000\018\005\000\000\000\000\000\000\018\229\000\000\021\150\000\000\015\182\018\229\018\229\018\229\018\229\018\229\018\005\000\000\000\000\000\000\000\000\000\000\000\000\018\005\015\186\018\229\018\229\015\194\000\000\000\000\018\005\018\005\000\000\000\000\018\229\018\229\000\000\000\000\003\254\000\000\000\000\000\000\016N\004N\000\250\000\000\000\000\000\000\000\000\018\229\018\229\018\229\018\229\018\229\000\000\000\000\000\000\000\000\018\229\018\229\000\000\000\000\000\000\017\217\017\217\000\000\015r\016F\021\142\000\000\017\217\000\000\018\229\000\000\000\000\000\000\017\217\000\000\021\150\000\000\015\182\017\217\017\217\017\217\017\217\017\217\018\229\000\000\000\000\000\000\000\000\000\000\000\000\018\229\015\186\017\217\017\217\015\194\000\000\000\000\018\229\018\229\000\000\000\000\017\217\017\217\000\000\000\000\003\254\000\000\000\000\000\000A\230\004N\000\250\000\000\000\000\000\000\000\000\017\217\017\217\017\217\017\217\017\217\000\000\000\000\000\000\000\000\017\217\017\217\015A\000\000\000\000\011j\001\030\000\000\000\000\001F\000\000\000\000\000\000\000\000\017\217\001J\000\000\000\000\000\000\000\000A\250\011n\000\000\015A\015A\000\000\015A\015A\017\217\000\000\000\000\000\000\000\000\000\000\000\000\017\217\011v\000\000\000\000\000\000\000\000\000\000\017\217\017\217\000\000\000\000\000\000\000\000\000\000\011\130\018>\001v\000\000\000\000\011\146\001\n\000\000\000\000\001\014\000\000\002\014\000\000\000\000\0176\001\018\018\026\000\000\018*\000\000\004r\011\150\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015A\000\000\000\000\000\000\000\000\000\000\000\000\017>\000\000\004v\004z\000\000\000\000\000\000\015A\015A\000\000\015A\000\000\000\000\017B\017\206\001\182\000\000\000\000\000\000\000\000\003-\000\000\015A\000\000\004b\015A\015A\017b\004~\017v\015A\017\146\015A\016\238\018n\000\000\015A\025>\025v\000\000\000\000\000\000\000\000\000\000\003-\000\000\000\000\003-\003-\000\000\025\134\016\242\016\246\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\222\025\234\000\000\000\000\000\000\000\000\000\000\000\000\016\250\025\246\026\026\000\000\000\000\000\000\017\222\000\000\003-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\026&\000\000\023~\023\174\000\000\0262\026>\000\000\000\000\003-\005\241\000\000\011m\003-\000\000\023\186\000\000\000\000\000\000\003-\023\194\023\230\023\242\023\206\023\254\000\000\000\000\003-\000\000\000\000\000\000\000\000\000\000\026z\024\n\024\022\000\000\000\000\000\000\000\000\026V\000\000\000\000\024\"\024F\000\000\003-\026b\026n\000\000\003-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023\138\023\218\024.\024:\024R\000\000\000\000\000\000\000\000\024^\024j\000\000\001\030\000\000\000\000\001F\000\000\000\000\000\000\000\000\n\201\001J\000\000\003-\000\000\005\n\015\174\025\018\000\000\000\000\000\000\003-\000\000\000\000\000\000\005\241\000\000\024\166\001\190\025\026\000\000\000\000\000\000\000\000\024\130\003-\000\000\000\000\000\000\001\194\003-\024\142\024\154\025\030\002\221\000\000\001\202\001v\000\000\006\161\006\161\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\004\014\000\0007\166\004N\000\250\000\000\004r\015A\002\221\002\221\000\000\002\221\002\221\011\146\001\n\000\000\000\000\001\014\000\000\000\000\000\000\000\000\000\000\001\018\004v\004z\000\000\000\000\000\000\011\150\000\000\015A\015A\000\000\015A\015A\000\000\000\000\026\134\000\000\000\000\000\000\000\000\000\000\017>\000\000\000\000\000\000\000\000\002\221\004~\000\000\002\221\000\000\000\000\000\000\004\154\017B\017\206\001\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004b\000\000\000\000\017b\000\000\017v\000\000\017\146\000\000\016\238\002\221\000\000\002\221\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\221\000\000\002\221\000\000\002\221\002\221\000\000\016\242\016\246\000\000\000\000\000\000\002\221\000\000\002\221\000\000\000\000\000\000\006N\002\221\000\000\000\000\000\000\000\000\000\000\017\233\000\000\015A\000\000\000\000\015A\015A\000\000\016\250\000\000\015A\000\000\015A\000\000\017\222\000\000\015A\017\233\017\233\000\000\000\000\000\000\000\000\000\000\017\233\000\000\000\000\017\233\017\233\000\000\017\233\000\000\000\000\000\000\000\000\017\233\017\233\017\233\017\233\017\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\233\017\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\233\017\233\001\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\166\001\170\000\000\017\233\017\233\017\233\017\233\017\233\000\000\000\000\000\000\000\000\017\233\017\233\000\000\000\000\n\254\001\206\001\210\011\002\011\006\001\222\001\226\000\000\000\000\000\000\017\233\000\000\000\000\000\000\000\000\000\000\011\n\011\014\n\250\001v\000\000\000\000\000\000\000\000\017\233\004\182\011\018\000\000\000\000\018\225\000\000\017\233\031\210\000\000\000\000\000\000\000\000\000\000\017\233\017\233\011\022\011\026\011\030\011\"\011&\000\000\025>\025v\000\000\011*\011.\000\000\000\000\018\225\000\000\000\000\018\225\018\225\000\000\025\134\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0116\025\222\025\234\000\000\000\000\000\000\000\000\011:\000\000\011>\025\246\026\026\000\000\000\000\011B\011F\000\000\000\000\000\000\000\000\000\000\000\000\017\253\000\000\000\000\025J\025\174\026\002\026\014\026&\000\000\000\000\000\000\000\000\0262\026>\000\000\000\000\000\000\025>\025v\000\000\000\000\000\000\000\000\000\000\017\253\000\000\018\225\017\253\017\253\000\000\017\253\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\026z\000\000\000\000\000\000\000\000\000\000\000\000\026V\000\000\025\222\025\234\000\000\000\000\000\000\026b\026n\000\000\000\000\025\246\026\026\000\000\000\000\017\225\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\026&\000\000\025>\025v\000\000\0262\026>\000\000\000\000\017\225\000\000\000\000\017\225\017\225\000\000\025\134\000\000\000\000\000\000\017\253\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\253\025\222\025\234\000\000\000\000\000\000\000\000\026V\000\000\000\000\025\246\026\026\000\000\000\000\026b\026n\000\000\000\000\000\000\000\000\000\000\000\000\017\229\000\000\000\000\025J\025\174\026\002\026\014\026&\000\000\000\000\000\000\000\000\0262\026>\000\000\000\000\000\000\025>\025v\000\000\000\000\000\000\000\000\000\000\017\229\000\000\017\225\017\229\017\229\000\000\025\134\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\026z\000\000\000\000\000\000\000\000\000\000\000\000\026V\000\000\025\222\025\234\000\000\000\000\000\000\026b\026n\000\000\000\000\025\246\026\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\026&\000\000\000\000\000\000\000\000\0262\026>\000\000\011j\001\030\017\026\000\000\001F\000\000\017\"\000\000\000\000\000\000\001J\017\229\000\000\000\000\000\000\000\000\011n\000\000\000\000#\242\000\000\000\000\000\000\017\197\000\000\026z\000\000\000\000\000\000\000\000\000\000(\222\026V\000\000\000\000\000\000\000\000\000\000\000\000\026b\026n\017.\000\000\000\000(\226\011\142\001v\000\000\000\000\000\000\000\000\0185\000\000\000\000\000\000\002\014\000\000\000\000\0176\003\222\018\026\000\000\018*\018:\004r\000\000\000\000\000\000\0185\0185\000\000\000\000\000\000\000\000\000\000\0185\000\000\000\000\0185\0185\000\000\0185\004v\004z\000\000\018b\0185\0185\0185\0185\0185\000\000\000\000\000\000\000\000\000\000(\230\000\000\005\222\000\000\0185\0185\000\000\000\000\000\000\000\000\000\000\000\000\004~\0185\0185\000\000\000\000\018\029\018f\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\0185\0185\0185\0185\000\000\018\029\018\029\000\000\0185\0185\000\000\000\000\018\029\000\000\000\000\018\029\018\029\000\000\018\029\000\000\000\000\000\000\0185\018\029\018\029\018\029\018\029\018\029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0185\018\029\018\029\000\000\000\000\000\000\000\000\0185\000\000\000\000\018\029\018\029\000\000\000\000\0185\0185\000\000\000\000\000\000\000\000\000\000\000\000\018\237\000\000\000\000\025J\018\029\018\029\018\029\018\029\000\000\000\000\000\000\000\000\018\029\018\029\000\000\000\000\000\000\025>\025v\000\000\000\000\000\000\000\000\000\000\018\237\000\000\018\029\018\237\018\237\000\000\025\134\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\018\029\000\000\000\000\000\000\000\000\000\000\000\000\018\029\000\000\025\222\025\234\000\000\000\000\000\000\018\029\018\029\000\000\000\000\025\246\026\026\000\000\000\000\018U\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\026&\000\000\025>\025v\000\000\0262\026>\000\000\000\000\018U\000\000\000\000\018U\018U\000\000\018U\000\000\000\000\000\000\018\237\018U\018U\018U\025\162\018U\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026z\018U\018U\000\000\000\000\000\000\000\000\026V\000\000\000\000\018U\018U\000\000\000\000\026b\026n\000\000\000\000\000\000\000\000\000\000\000\000\018)\000\000\000\000\025J\025\174\018U\018U\018U\000\000\000\000\000\000\000\000\018U\018U\000\000\000\000\000\000\025>\025v\000\000\000\000\000\000\000\000\000\000\018)\000\000\018U\018)\018)\000\000\018)\000\000\000\000\000\000\000\000\018)\018)\018)\025\162\018)\018U\000\000\000\000\000\000\000\000\000\000\000\000\018U\000\000\018)\018)\000\000\000\000\000\000\018U\018U\000\000\000\000\018)\018)\000\000\000\000\018%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\018)\018)\018)\000\000\025>\025v\000\000\018)\018)\000\000\000\000\018%\000\000\000\000\018%\018%\000\000\018%\000\000\000\000\000\000\018)\018%\018%\018%\025\162\018%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018)\018%\018%\000\000\000\000\000\000\000\000\018)\000\000\000\000\018%\018%\000\000\000\000\018)\018)\000\000\000\000\000\000\000\000\000\000\000\000\018Y\000\000\000\000\025J\025\174\018%\018%\018%\000\000\018Y\018Y\000\000\018%\018%\000\000\000\000\018Y\018Y\018Y\000\000\000\000\000\000\018Y\000\000\018Y\000\000\018%\018Y\018Y\018Y\018Y\018Y\000\000\000\000\000\000\018Y\018Y\018Y\018Y\018Y\018%\018Y\018Y\000\000\000\000\000\000\000\000\018%\000\000\018Y\018Y\018Y\000\000\000\000\018%\018%\000\000\000\000\018Y\018Y\000\000\000\000\018A\000\000\000\000\023\138\018Y\018Y\018Y\018Y\000\000\000\000\000\000\025J\018Y\018Y\018Y\018Y\000\000\025>\025v\000\000\018Y\018Y\000\000\000\000\018A\000\000\018Y\018A\018A\000\000\018A\000\000\000\000\000\000\018Y\025\150\025\186\025\198\025\162\025\210\018Y\000\000\000\000\000\000\000\000\000\000\000\000\018Y\018Y\025\222\025\234\000\000\000\000\000\000\018Y\018Y\000\000\000\000\025\246\026\026\000\000\000\000\018Y\018Y\000\000\000\000\000\000\000\000\000\000\000\000\0181\000\000\000\000\025J\025\174\026\002\026\014\026&\000\000\000\000\000\000\000\000\0262\026>\000\000\000\000\000\000\025>\025v\000\000\000\000\000\000\000\000\000\000\0181\000\000\018A\0181\0181\000\000\0181\000\000\000\000\000\000\000\000\0181\0181\0181\025\162\0181\018A\000\000\000\000\000\000\000\000\000\000\000\000\026V\000\000\0181\0181\000\000\000\000\000\000\026b\026n\000\000\000\000\0181\0181\000\000\000\000\018-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\0181\0181\0181\000\000\025>\025v\000\000\0181\0181\000\000\000\000\018-\000\000\000\000\018-\018-\000\000\018-\000\000\000\000\000\000\0181\018-\018-\018-\025\162\018-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0181\018-\018-\000\000\000\000\000\000\000\000\0181\000\000\000\000\018-\018-\000\000\000\000\0181\0181\000\000\000\000\000\000\000\000\000\000\000\000\018]\000\000\000\000\025J\025\174\018-\018-\018-\000\000\000\000\000\000\000\000\018-\018-\000\000\000\000\000\000\025>\025v\000\000\000\000\000\000\000\000\000\000\018]\000\000\018-\018]\018]\000\000\018]\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\018]\018-\000\000\000\000\000\000\000\000\000\000\000\000\018-\000\000\025\222\025\234\000\000\000\000\000\000\018-\018-\000\000\000\000\018]\018]\000\000\000\000\0189\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\018]\000\000\025>\025v\000\000\018]\018]\000\000\000\000\0189\000\000\000\000\0189\0189\000\000\0189\000\000\000\000\000\000\018]\025\150\025\186\025\198\025\162\0189\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018]\025\222\025\234\000\000\000\000\000\000\000\000\018]\000\000\000\000\025\246\0189\000\000\000\000\018]\018]\000\000\000\000\000\000\000\000\000\000\000\000\018!\000\000\000\000\025J\025\174\026\002\026\014\0189\000\000\018!\018!\000\000\0189\0189\000\000\000\000\018!\018!\018!\000\000\000\000\000\000\018!\000\000\018!\000\000\0189\018!\018!\018!\018!\018!\000\000\000\000\000\000\018!\018!\018!\018!\018!\0189\018!\018!\000\000\000\000\000\000\000\000\0189\000\000\018!\018!\018!\000\000\000\000\0189\0189\000\000\000\000\018!\018!\000\000\000\000\018\025\000\000\000\000\023\138\018!\018!\018!\018!\000\000\000\000\000\000\025J\018!\018!\018!\018!\000\000\018\025\018\025\000\000\018!\018!\000\000\000\000\018\025\000\000\018!\018\025\018\025\000\000\018\025\000\000\000\000\000\000\018!\018\025\018\025\018\025\018\025\018\025\018!\000\000\000\000\000\000\000\000\000\000\000\000\018!\018!\018\025\018\025\000\000\000\000\000\000\018!\018!\000\000\000\000\018\025\018\025\000\000\000\000\018!\018!\000\000\000\000\000\000\000\000\000\000\000\000\018\021\000\000\000\000\025J\018\025\018\025\018\025\018\025\000\000\000\000\000\000\000\000\018\025\018\025\000\000\000\000\000\000\025>\025v\000\000\000\000\000\000\000\000\000\000\018\021\000\000\018\025\018\021\018\021\000\000\018\021\000\000\000\000\000\000\000\000\018\021\018\021\018\021\025\162\018\021\018\025\000\000\000\000\000\000\000\000\000\000\000\000\018\025\000\000\018\021\018\021\000\000\000\000\000\000\018\025\018\025\000\000\000\000\018\021\018\021\000\000\000\000\018\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\018\021\018\021\018\021\000\000\025>\025v\000\000\018\021\018\021\000\000\000\000\018\017\000\000\000\000\018\017\018\017\000\000\018\017\000\000\000\000\000\000\018\021\025\150\025\186\025\198\025\162\018\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\021\025\222\025\234\000\000\000\000\000\000\000\000\018\021\000\000\000\000\018\017\018\017\000\000\000\000\018\021\018\021\000\000\000\000\000\000\000\000\000\000\000\000\018\r\000\000\000\000\025J\025\174\026\002\026\014\018\017\000\000\000\000\000\000\000\000\018\017\018\017\000\000\000\000\000\000\025>\025v\000\000\000\000\000\000\000\000\000\000\018\r\000\000\018\017\018\r\018\r\000\000\018\r\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\018\r\018\017\000\000\000\000\000\000\000\000\000\000\000\000\018\017\000\000\025\222\025\234\000\000\000\000\000\000\018\017\018\017\000\000\000\000\025\246\018\r\000\000\000\000\018e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\018\r\000\000\025>\025v\000\000\018\r\018\r\000\000\000\000\018e\000\000\000\000\018e\018e\000\000\018e\000\000\000\000\000\000\018\r\025\150\025\186\025\198\025\162\018e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\r\025\222\025\234\000\000\000\000\000\000\000\000\018\r\000\000\000\000\025\246\018e\000\000\000\000\018\r\018\r\000\000\000\000\000\000\000\000\000\000\000\000\018a\000\000\000\000\025J\025\174\026\002\026\014\018e\000\000\000\000\000\000\000\000\018e\018e\000\000\000\000\000\000\025>\025v\000\000\000\000\000\000\000\000\000\000\018a\000\000\018e\018a\018a\000\000\018a\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\018a\018e\000\000\000\000\000\000\000\000\000\000\000\000\018e\000\000\025\222\025\234\000\000\000\000\000\000\018e\018e\000\000\000\000\025\246\018a\000\000\000\000\018=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\018a\000\000\025>\025v\000\000\018a\018a\000\000\000\000\018=\000\000\000\000\018=\018=\000\000\018=\000\000\000\000\000\000\018a\025\150\025\186\025\198\025\162\018=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018a\025\222\025\234\000\000\000\000\000\000\000\000\018a\000\000\000\000\025\246\018=\000\000\000\000\018a\018a\000\000\000\000\000\000\000\000\000\000\000\000\018Q\000\000\000\000\025J\025\174\026\002\026\014\018=\000\000\000\000\000\000\000\000\018=\018=\000\000\000\000\000\000\025>\025v\000\000\000\000\000\000\000\000\000\000\018Q\000\000\018=\018Q\018Q\000\000\025\134\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\018=\000\000\000\000\000\000\000\000\000\000\000\000\018=\000\000\025\222\025\234\000\000\000\000\000\000\018=\018=\000\000\000\000\025\246\026\026\000\000\000\000\018E\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\026&\000\000\025>\025v\000\000\0262\026>\000\000\000\000\018E\000\000\000\000\018E\018E\000\000\018E\000\000\000\000\000\000\018Q\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026z\025\222\025\234\000\000\000\000\000\000\000\000\026V\000\000\000\000\025\246\026\026\000\000\000\000\026b\026n\000\000\000\000\000\000\000\000\000\000\000\000\018I\000\000\000\000\025J\025\174\026\002\026\014\026&\000\000\000\000\000\000\000\000\0262\026>\000\000\000\000\000\000\025>\025v\000\000\000\000\000\000\000\000\000\000\018I\000\000\018E\018I\018I\000\000\018I\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\018I\018E\000\000\000\000\000\000\000\000\000\000\000\000\026V\000\000\025\222\025\234\000\000\000\000\000\000\026b\026n\000\000\000\000\025\246\026\026\000\000\000\000\018M\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\026&\000\000\025>\025v\000\000\0262\026>\000\000\000\000\018M\000\000\000\000\018M\018M\000\000\018M\000\000\000\000\000\000\018I\025\150\025\186\025\198\025\162\018M\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018I\025\222\025\234\000\000\000\000\000\000\000\000\018I\000\000\000\000\025\246\026\026\000\000\000\000\026b\026n\000\000\000\000\000\000\000\000\000\000\000\000\018\213\000\000\000\000\025J\025\174\026\002\026\014\026&\000\000\000\000\000\000\000\000\0262\026>\000\000\000\000\000\000\025>\025v\000\000\000\000\000\000\000\000\000\000\018\213\000\000\018M\018\213\018\213\000\000\025\134\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\018M\000\000\000\000\000\000\000\000\000\000\000\000\018M\000\000\025\222\025\234\000\000\000\000\000\000\026b\026n\000\000\000\000\025\246\026\026\000\000\000\000\018\217\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\026&\000\000\025>\025v\000\000\0262\026>\000\000\000\000\018\217\000\000\000\000\018\217\018\217\000\000\025\134\000\000\000\000\000\000\018\213\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026z\025\222\025\234\000\000\000\000\000\000\000\000\026V\000\000\000\000\025\246\026\026\000\000\000\000\026b\026n\000\000\000\000\000\000\000\000\000\000\000\000\018\221\000\000\000\000\025J\025\174\026\002\026\014\026&\000\000\000\000\000\000\000\000\0262\026>\000\000\000\000\000\000\025>\025v\000\000\000\000\000\000\000\000\000\000\018\221\000\000\018\217\018\221\018\221\000\000\025\134\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\026z\000\000\000\000\000\000\000\000\000\000\000\000\026V\000\000\025\222\025\234\000\000\000\000\000\000\026b\026n\000\000\000\000\025\246\026\026\000\000\000\000\018\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\026&\nu\025>\025v\000\000\0262\026>\000\000\000\000\018\209\000\000\000\000\018\209\018\209\000\000\025\134\000\000\000\000\000\000\018\221\025\150\025\186\025\198\025\162\025\210\nu\000\000\000\000\nu\nu\000\000\000\000\000\000\026z\025\222\025\234\000\000\000\000\000\000\000\000\026V\000\000\000\000\025\246\026\026\000\000\000\000\026b\026n\000\000\000\000\000\000\011\246\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\026&\000\000\000\000\000\000\nu\0262\026>\012\n\011j\001\030\017\026\000\000\001F\000\000\017\"\000\000\000\000\000\000\001J\018\209\000\000\000\000\000\000\000\000\011n\000\000\000\000?\194\000\000\000\000\000\000\017\197\000\000\026z\000\000\nu\000\000\000\000\000\000(\222\026V\000\000\000\000\nu\000\000\nu\000\000\026b\026n\017.\000\000\nu(\226\011\142\001v\000\000\000\000\nu\000\000\000\000\000\000\000\000\nu\002\014\000\000\000\000\0176\003\222\018\026\000\000\018*\018:\004r\018\182\000\000\000\000\000\000\000\000\000\000\011j\001\030\017\026\000\000\001F\000\000\017\"\000\000\000\000\000\000\001J\004v\004z\000\000\018b\000\000\011n\000\000\000\0004*\000\000\000\000\000\000\000\000\000\000?\230\000\000\005\222\000\000\000\000\000\000\011v\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\017.\000\000\018f\011\130\011\142\001v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\014\000\000\000\000\0176\003\222\018\026\000\000\018*\018:\004r\000\000\000\000\000\000\000\000\000\000\000\000\011j\001\030\017\026\000\000\001F\000\000\017\"\000\000\000\000\000\000\001J\004v\004z\000\000\018b\000\000\011n\000\000\000\000\021\222\000\000\000\000\000\000\000\000\000\0004B\000\000\005\222\000\000\000\000\000\000\011v\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\017.\000\000\018f\011\130\011\142\001v\000\000\000\000\000\000\000\000\006\185\000\000\000\000\000\000\002\014\000\000\000\000\0176\003\222\018\026\000\000\018*\018:\004r\000\000\000\000\000\000\025>\025v\000\000\000\000\000\000\000\000\000\000\006\185\000\000\000\000\000\000\006\185\000\000\025\134\004v\004z\000\000\018b\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\0003\"\000\000\005\222\000\000\025\222\025\234\000\000\000\000\000\000\000\000\000\000\000\000\004~\025\246\026\026\000\000\000\000\006\189\018f\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\026&\000\000\025>\025v\000\000\0262\026>\000\000\000\000\006\189\000\000\000\000\000\000\006\189\000\000\025\134\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\006\185\000\000\026z\025\222\025\234\000\000\000\000\000\000\000\000\026V\000\000\000\000\025\246\026\026\000\000\000\000\026b\026n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\026&\000\000\000\000\000\000\000\000\0262\026>\003\166\003\002\000\000\000\000\000\000\000\000\003\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n=\000\000\003\182\000\000\000\000\nA\000\000\007\001\000\000\003\194\006\189\000\000\026z\000\000\000\000\000\000\000\000\025>\025v\026V\000\000\000\000\000\000\000\000\029\026\000\000\026b\026n\n=\000\000\025\134\003\190\005\138\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\002\014\005\142\005\146\000\000\003\222\005\150\000\000\005\154\025\222\025\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\246\026\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\194\025J\025\174\026\002\026\014\026&\000\000\000\000\000\000\000\000\0262\026>\005\222\011j\001\030\017\026\000\000\001F\000\000\017\"\000\000\000\000\000\000\001J\000\000\000\000\007\"\000\000\007&\011n\000\000\000\000\030v\000\000\000\000\000\000\029\030\000\000\026z\000\000\000\000\000\000\000\000\000\000\011v\026V\000\000\000\000\000\000\000\000\000\000\000\000\026b\026n\017.\000\000\000\000\011\130\011\142\001v\n\149\000\000\000\000\000\000\031r\000\000\000\000\000\000\002\014\000\000\000\000\0176\003\222\018\026\000\000\018*\018:\004r\000\000\000\000\000\000\025>\025v\000\000\n\149\000\000\000\000\n\149\n\149\b9\000\000\000\000\000\000\000\000\025\134\004v\004z\000\000\018b\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\030\142\000\000\005\222\000\000\025\222\025\234\000\000\000\000\000\000\000\000\000\000\000\000\004~\025\246\026\026\000\000\n\149\000\000\018f\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\026&\000\000\000\000\000\000\000\000\0262\026>\000\000\011j\001\030\017\026\000\000\001F\000\000\017\"\n\149\000\000\000\000\001J\000\000\000\000\000\000\000\000\n\149\011n\n\149\000\000$\170\000\000\000\000\000\000\012N\031v\026z\000\000\031\134\000\000\n\149\000\000\011v\026V\000\000\n\149\000\000\000\000\000\000\000\000\026b\026n\017.\000\000\000\000\011\130\011\142\001v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\014\000\000\000\000\0176\003\222\018\026\000\000\018*\018:\004r\000\000\000\000\000\000\000\000\000\000\000\000\011j\001\030\017\026\000\000\001F\000\000\017\"\000\000\000\000\000\000\001J\004v\004z\000\000\018b\000\000\011n\000\000\000\000%v\000\000\000\000\000\000\000\000\000\000$\194\000\000\005\222\000\000\015=\000\000\011v\000\000\000\000\000\000\000\000\001\n\004~\000\000\001\014\000\000\017.\000\000\018f\011\130\011\142\001v\000\000\000\000\000\000\000\000\000\000\000\000\015=\015=\002\014\015=\015=\0176\003\222\018\026\000\000\018*\018:\004r\000\000\000\000\000\000\000\000\000\000\000\000\011j\001\030\017\026\000\000\001F\000\000\017\"\000\000\000\000\018^\001J\004v\004z\000\000\018b\000\000\011n\000\000\000\000'\134\000\000\000\000\019\174\000\000\019\186%\150\019\202\005\222\000\000\000\000\000\000\011v\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\017.\000\000\018f\011\130\011\142\001v\016\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\014\000\000\000\000\0176\003\222\018\026\000\000\018*\018:\004r\000\000\015=\000\000\000\000\015=\015=\011j\001\030\017\026\015=\001F\015=\017\"\000\000\000\000\015=\001J\004v\004z\000\000\018b\000\000\011n\000\000\000\000)\018\000\000\000\000\000\000\000\000\000\000'\166\000\000\005\222\000\000\000\000\000\000\011v\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\017.\000\000\018f\011\130\011\142\001v\000\000\000\000\000\000\nu\000\000\000\000\nu\nu\002\014\000\000\000\000\0176\003\222\018\026\000\000\018*\018:\004r\000\000\000\000\000\000\023~\023\174\000\000\000\000\000\000\000\000\000\000\019\025\b9\bb\011i\019\025\000\000\023\186\004v\004z\000\000\018b\023\194\023\230\023\242\023\206\023\254\nu\0155\000\000\007\210\000\000)\026\000\000\005\222\000\000\024\n\024\022\000\000\000\000\000\000\000\000\000\000\000\000\004~\024\"\024F\000\000\000\000\000\000\018f\000\000\0155\0155\000\000\0155\0155\000\000\nu\000\000\023\138\023\218\024.\024:\024R\000\000\nu\000\000\nu\024^\024j\000\000\000\000\000\000\nu\000\000\000\000\000\000\000\000\000\000\nu\000\000\000\000<\022\000\000\nu\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b96\170\024\166\000\0006\174\025>\025v\000\000\000\000\024\130\000\000\000\000\000\000\b9\000\000\000\000\024\142\024\154\025\134\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\017\254\000\000\000\000\025\222\025\234\000\000\000\000\0155\000\000\000\000\0155\0155\025\246\026\026\000\000\0155\000\000\0155\000\000\000\000\000\000\0155\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\026&\000\000\000\000\000\000\000\000\0262\026>\000\000\011j\001\030\017\026\000\000\001F\000\000\017\"\000\000\000\000\000\000\001J\000\000\000\000\000\000\000\000\000\000\011n\000\000\000\000@\018\000\000\000\000\000\000\000\000<\026\026z\000\000<\"\000\000\000\000\000\000\011v\026V\000\000\000\000\000\000\000\000\000\000\000\000\026b\026n\017.\000\000\000\000\011\130\011\142\001v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\014\000\000\000\000\0176\003\222\018\026\000\000\018*\018:\004r\000\000\000\000\000\000\000\000\000\000\000\000\011j\001\030\017\026\000\000\001F\000\000\017\"\000\000\000\000\000\000\001J\004v\004z\000\000\018b\000\000\011n\000\000\000\000\021J\000\000\000\000\000\000\000\000\000\000@\026\000\000\005\222\000\000\000\000\000\000\011v\000\000\003\166\003\002\000\000\000\000\004~\000\000\003\170\000\000\017.\000\000\018f\011\130\011\142\001v\000\000\000\000\003\182\000\000\000\000\br\000\000\000\000\002\014\003\194\000\000\0176\003\222\018\026\000\000\018*\018:\004r\011j\001\030\017\026\000\000\001F\000\000\017\"\000\000\000\000\003\202\001J\000\000\000\000\003\190\005\138\000\000\011n\004v\004z\nA\018b\000\000\000\000\002\014\005\142\005\146\000\000\003\222\005\150\000\000\005\154\011v\000\000\005\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017.\000\000\004~\011\130\011\142\001v\000\000\000\000\018f\000\000\n=\000\000\000\000\005\194\002\014\000\000\000\000\0176\003\222\018\026\000\000\018*\018:\004r\000\000\005\222\000\000\025>\025v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n=\000\000\025\134\004v\004z\000\000\018b\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\222\000\000\025\222\025\234\000\000\000\000\000\000\000\000\000\000\000\000\004~\025\246\026\026\000\000\000\000\007q\018f\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\026&\000\000\025>\025v\000\000\0262\026>\000\000\000\000\000\000\000\000\000\000\000\000\007q\000\000\025\134\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\028\022\000\000\026z\025\222\025\234\000\000\000\000\000\000\000\000\026V\000\000\000\000\025\246\026\026\000\000\000\000\026b\026n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\026&\000\000\000\000\000\000\000\000\0262\026>\007y\000\000\000\000\020\022\000\000\000\000\000\000\000\000\000\000\003\154\003\002\000\000\000\000\000\000\000\000\003\170\000\000\025>\025v\b\129\000\000\000\000\000\000\000\000\007q\012R\026z\000\000\007y\000\000\025\134\000\000\012n\026V\000\000\025\150\025\186\025\198\025\162\025\210\026b\026n\000\000\b\129\b\129\000\000\b\129\b\129\000\000\025\222\025\234\000\000\000\000\000\000\012Z\011\154\000\000\000\000\025\246\026\026\000\000\000\000\n\161\000\000\004b\012v\012\134\000\000\003\222\012\146+F\012\158\000\000\025J\025\174\026\002\026\014\026&\000\000\025>\025v\000\000\0262\026>\b\129\000\000\000\000\031\166\000\000\000\000\n\161\000\000\025\134\000\000\000\000\012\162\000\000\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\005\222\007y\000\000\026z\025\222\025\234\000\000\000\000\b\129\000\000\026V\000\000\000\000\025\246\026\026\000\000\b\129\026b\026n\000\000\b\129\000\000\000\000\000\000\b\129\005U\000\000\000\000\025J\025\174\026\002\026\014\026&\000\000\000\000\b\129\000\000\0262\026>\000\000\011j\001\030\017\026\000\000\001F\000\000\017\"\000\000\005U\005U\001J\005U\005U\000\000\000\000\000\000\011n\000\000\000\000\030\146\000\000\000\000\000\000\n\161\000\000\026z\000\000\000\000\000\000\000\000\000\000\011v\026V\000\000\000\000\003\006\000\000\000\000\000\000\026b\026n\017.\000\000\000\000\011\130\011\142\001v\000\000\000\000\005U\000\000\000\000\005U\000\000\000\000\002\014\000\000\000\000\0176\003\222\018\026\000\000\018*\018:\004r\011j\001\030\017\026\000\000\001F\000\000\017\"\000\000\000\000\000\000\001J\000\000\005U\005U\000\000\005U\011n\004v\004z$\198\018b\b\005\000\000\005U\000\000\000\000\000\000\005U\005U\000\000\000\000\011v\000\000\005\222\000\000\005U\000\000\000\000\000\000\000\000\000\000\017.\005U\004~\011\130\011\142\001v\000\000\000\000\018f\000\000\000\000\000\000\000\000\000\000\002\014\000\000\000\000\0176\003\222\018\026\000\000\018*\018:\004r\011j\001\030\017\026\000\000\001F\000\000\017\"\000\000\000\000\000\000\001J\000\000\000\000\000\000\000\000\000\000\011n\004v\004z%\154\018b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011v\000\000\005\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017.\000\000\004~\011\130\011\142\001v\000\000\000\000\018f\000\000\000\000\000\000\000\000\000\000\002\014\000\000\000\000\0176\003\222\018\026\000\000\018*\018:\004r\011j\001\030\017\026\000\000\001F\000\000\017\"\000\000\000\000\000\000\001J\000\000\000\000\000\000\000\000\000\000\011n\004v\004z'\170\018b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011v\000\000\005\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017.\000\000\004~\011\130\011\142\001v\000\000\000\000\018f\000\000\000\000\000\000\000\000\000\000\002\014\000\000\000\000\0176\003\222\018\026\000\000\018*\018:\004r\011j\001\030\017\026\000\000\001F\000\000\017\"\000\000\000\000\000\000\001J\000\000\000\000\000\000\000\000\000\000\011n\004v\004z(\234\018b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011v\000\000\005\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017.\000\000\004~\011\130\011\142\001v\000\000\000\000\018f\000\000\000\000\000\000\000\000\000\000\002\014\000\000\000\000\0176\003\222\018\026\000\000\018*\018:\004r\011j\001\030\017\026\000\000\001F\000\000\017\"\000\000\000\000\000\000\001J\000\000\000\000\000\000\000\000\000\000\011n\004v\004z)\030\018b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011v\000\000\005\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017.\000\000\004~\011\130\011\142\001v\000\000\000\000\018f\000\000\000\000\000\000\000\000\000\000\002\014\000\000\000\000\0176\003\222\018\026\000\000\018*\018:\004r\011j\001\030\017\026\000\000\001F\000\000\017\"\000\000\000\000\000\000\001J\000\000\000\000\000\000\000\000\000\000\011n\004v\004z3&\018b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011v\000\000\005\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017.\000\000\004~\011\130\011\142\001v\000\000\000\000\018f\000\000\000\000\000\000\000\000\000\000\002\014\000\000\000\000\0176\003\222\018\026\000\000\018*\018:\004r\011j\001\030\017\026\000\000\001F\000\000\017\"\000\000\000\000\000\000\001J\000\000\000\000\000\000\000\000\000\000\011n\004v\004z4F\018b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011v\000\000\005\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017.\000\000\004~\011\130\011\142\001v\000\000\000\000\018f\000\000\019\025\000\000\000\000\000\000\002\014\000\000\000\000\0176\003\222\018\026\000\000\018*\018:\004r\000\000\000\000\000\000\025>\025v\000\000\000\000\000\000\000\000\000\000\019\025\000\000\000\000\000\000\019\025\000\000\025\134\004v\004z\000\000\018b\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\222\000\000\025\222\025\234\000\000\000\000\000\000\000\000\000\000\000\000\004~\025\246\026\026\000\000\000\000\019\029\018f\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025J\025\174\026\002\026\014\026&\000\000\025>\025v\000\000\0262\026>\000\000\000\000\019\029\000\000\000\000\000\000\019\029\000\000\025\134\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026z\025\222\025\234\000\000\000\000\000\000\000\000\026V\000\000\000\000\025\246\026\026\000\000\000\000\026b\026n\000\000\000\000\000\000\000\000\n}\n}\000\000\000\000\n}\025J\025\174\026\002\026\014\026&\n}\000\000\000\000\000\000\0262\026>\n}\000\000\000\000\000\000\n}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n}\000\014\000\000\nY\000\000\000\000\000\000\000\000\000\000\000\000\n\246\026z\000\000\n}\n}\n}\000\000\000\000\026V\000\000\005\017\000\000\000\000\000\000\n}\026b\026n\n}\n}\n}\000\000\n}\n}\n}\000\000\000\000\000\000\025>\025v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\134\n}\n}\000\000\n}\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n}\000\000\025\222\025\234\000\000\000\000\000\000\000\000\000\000\000\000\n}\025\246\026\026\000\000\000\000\000\000\n}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\233\017\233\025J\025\174\026\002\026\014\026&\017\233\000\000\000\000\005\017\0262\026>\017\233\000\000\000\000\000\000\000\000\017\233\017\233\017\233\017\233\017\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\233\017\233\000\000\000\000\000\000\005\017\000\000\026z\000\000\017\233\017\233\000\000\000\000\000\000\026V\000\000\000\000\000\000\000\000\000\000\000\000\026b\026n\000\000\017\233\017\233\017\233\017\233\017\233\000\000\000\000\000\000\000\000\017\233\017\233\000\000\011j\001\030\017\026\000\000\001F\000\000\017\"\000\000\000\000\000\000\001J\017\233\000\000\000\000\000\000\000\000\011n\000\000\000\000?\234\000\000\000\000\000\000\000\000\000\000\017\233\000\000\000\000\000\000\000\000\000\000\011v\017\2334z\000\000\000\000\000\000\000\000\000\000\017\233\017\233\017.\000\000\000\000\011\130\011\142\001v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\014\000\000\000\000\0176\003\222\018\026\000\000\018*\018:\004r\011j\001\030\017\026\000\000\001F\000\000\017\"\000\000\000\000\000\000\001J\000\000\000\000\000\000\000\000\000\000\011n\004v\004z@\030\018b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011v\000\000\005\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017.\000\000\004~\011\130\011\142\001v\000\000\000\000\018f\000\000\025:\000\000\000\000\000\000\002\014\000\000\000\000\0176\003\222\018\026\000\000\018*\018:\004r\000\000\000\000\000\000\025>\025v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\130\000\000\000\000\025\134\004v\004z\000\000\018b\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\222\000\000\025\222\025\234\000\000\000\000\000\000\026\146\000\000\000\000\004~\025\246\026\026\000\000\000\000\000\000\018f\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025>\025v\025J\025\174\026\002\026\014\026&\000\000\000\000\000\000\026\150\0262\026>\025\134\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\222\025\234\000\000\000\000\000\000\000\000\000\000\026z\000\000\025\246\026\026\000\000\000\000\000\000\026V\000\000\000\000\000\000\000\000\000\000\000\000\026b\026n\000\000\025J\025\174\026\002\026\014\026&\000\000\023~\023\174\000\000\0262\026>\000\000\000\000\018\225\030.\000\000\000\000\007-\000\000\023\186\000\000\000\000\000\000\000\000\023\194\023\230\023\242\023\206\023\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026z\024\n\024\022\000\000\000\000\000\000\000\000\026V\000\000\000\000\024\"\024F\000\000\000\000\026b\026n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023\138\023\218\024.\024:\024R\000\000\023~\023\174\000\000\024^\024j\000\000\000\000\017\225 &\000\000\000\000\007)\000\000\023\186\000\000\000\000\000\000\018\225\023\194\023\230\023\242\023\206\023\254\000\000\000\000\000\000\000\000\000\000\000\000\007-\000\000\024\166\024\n\024\022\000\000\000\000\000\000\029V\024\130\000\000\000\000\024\"\024F\000\000\000\000\024\142\024\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025>\025v\023\138\023\218\024.\024:\024R\000\000\000\000\000\000\029Z\024^\024j\025\134\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\000\000\017\225\000\000\000\000\000\000\000\000\000\000\000\000\025\222\025\234\000\000\000\000\000\000\007)\000\000\024\166\000\000\025\246\026\026\000\000\000\000\029r\024\130\000\000\000\000\000\000\000\000\000\000\000\000\024\142\024\154\000\000\025J\025\174\026\002\026\014\026&\000\000\025>\025v\000\000\0262\026>\000\000\000\000\000\000\000\000\000\000\029v\000\000\000\000\025\134\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026z\025\222\025\234\000\000\000\000\000\000\029V\026V\000\000\000\000\025\246\026\026\000\000\000\000\026b\026n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025>\025v\025J\025\174\026\002\026\014\026&\000\000\000\000\000\000\031:\0262\026>\025\134\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\222\025\234\000\000\000\000\000\000\000\000\000\000\026z\000\000\025\246\026\026\000\000\000\000\029r\026V\000\000\000\000\000\000\000\000\000\000\000\000\026b\026n\000\000\025J\025\174\026\002\026\014\026&\000\000\025>\025v\000\000\0262\026>\000\000\000\000\000\000\000\000\000\000\031J\000\000\000\000\025\134\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026z\025\222\025\234\000\000\000\000\000\000\000\000\026V\000\000\000\000\025\246\026\026\000\000\000\000\026b\026n\000\000 \022\000\000\000\000\000\000\000\000\000\000\023~\023\174\025J\025\174\026\002\026\014\026&\017\2293\014\000\000\000\000\0262\026>\023\186\000\000\000\000\000\000\000\000\023\194\023\230\023\242\023\206\023\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\n\024\022\000\000\000\000\000\000\000\000\000\000\026z\000\000\024\"\024F\000\000\000\000\000\000\026V\000\000\000\000\000\000\000\000\000\000\000\000\026b\026n\000\000\023\138\023\218\024.\024:\024R\000\000\000\000\000\000\000\000\024^\024j\000\000\000\000\000\000\023~\023\174\000\000\000\000\000\000\000\000\000\000\019\0294\030\017\229\000\000\019\029 \026\023\186\000\000\000\000\000\000\000\000\023\194\023\230\023\242\023\206\023\254\024\166\000\000\024\178\000\000\000\000\000\000\000\000\024\130\000\000\024\n\024\022\000\000\000\000\000\000\024\142\024\154\000\000\000\000\024\"\024F\000\000\000\000\029V\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023\138\023\218\024.\024:\024R\000\000\025>\025v\000\000\024^\024j\000\000\000\000\000\000\000\000\000\000*\230\000\000\000\000\025\134\000\000\000\000\000\000=\151\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\030&\000\000\024\166\025\222\025\234\000\000\000\000\000\000\029r\024\130\000\000\000\000\025\246\026\026\000\000\000\000\024\142\024\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025>\025v\025J\025\174\026\002\026\014\026&\000\000\000\000\000\000*\254\0262\026>\025\134\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\003\166\003\002\005b\025\222\025\234\000\000\003\170\000\000\000\000\000\000\026z\000\000\025\246\026\026\000\000\000\000\003\182\026V\000\000\000\000\000\000\012E\012E\003\194\026b\026n\000\000\025J\025\174\026\002\026\014\026&\000\000\000\000\n\210\000\000\0262\026>\000\000\000\000\000\000\n\226\000\000\000\000\000\000\003\190\005\138\n\242\000\000\000\000\000\000\000\000\000\000\000\000\011^\002\014\005\142\005\146\000\000\003\222\005\150\000\000\005\154\000\000\026z2\174\000\000\000\000\000\000\000\000\000\000\026V-\234\000\000\000\000\000\000\000\000\000\000\026b\026n\000\000\000\000\025>\025v-\242.\022\005\194\000\000\000\000\000\000\012E\000\0002\178\000\000\000\000\025\134\000\000\000\000\005\222\000\000\025\150\025\186\025\198\025\162\025\210\003\145\003\145.\030\000\000\000\000\000\000\003\145\000\000\000\000\025\222\025\234\000\000\000\000\000\0002\202\000\000\003\145\000\000\025\246\026\026\000\000\000\000\000\000\003\145\000\000\000\000\t\250\000\000\000\000\000\000\000\000\025>\025v\025J\025\174\026\002\026\014\026&\000\000\000\000\000\0002\206\0262\026>\025\134\003\145\003\145\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\003\145\003\145\003\145\000\000\003\145\003\145\000\000\003\145\025\222\025\234\000\000\000\000\000\000\000\000\000\000\026z\000\000\025\246\026\026\000\000\000\0003\162\026V\000\000\000\000\000\000\000\000\000\000\000\000\026b\026n\003\145\025J\025\174\026\002\026\014\026&\000\000\025>\025v\000\000\0262\026>\003\145\000\000\000\000\000\000\000\0003\166\000\000\000\000\025\134\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026z\025\222\025\234\000\000\000\000\000\0003\182\026V\000\000\000\000\025\246\026\026\000\000\000\000\026b\026n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025>\025v\025J\025\174\026\002\026\014\026&\000\000\000\000\000\0003\186\0262\026>\025\134\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\222\025\234\000\000\000\000\000\000\000\000\000\000\026z\000\000\025\246\026\026\000\000\000\0002\202\026V\000\000\000\000\000\000\000\000\000\000\000\000\026b\026n\000\000\025J\025\174\026\002\026\014\026&\000\000\025>\025v\000\000\0262\026>\000\000\000\000\000\000\000\000\000\0003\226\000\000\000\000\025\134\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026z\025\222\025\234\000\000\000\000\000\0002\174\026V\000\000\000\000\025\246\026\026\000\000\000\000\026b\026n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025>\025v\025J\025\174\026\002\026\014\026&\000\000\000\000\000\0006^\0262\026>\025\134\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\222\025\234\000\000\000\000\000\000\000\000\000\000\026z\000\000\025\246\026\026\000\000\000\0008\030\026V\000\000\000\000\000\000\000\000\000\000\000\000\026b\026n\000\000\025J\025\174\026\002\026\014\026&\000\000\025>\025v\000\000\0262\026>\000\000\000\000\000\000\000\000\000\0008\"\000\000\000\000\025\134\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026z\025\222\025\234\000\000\000\000\000\0008\238\026V\000\000\000\000\025\246\026\026\000\000\000\000\026b\026n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025>\025v\025J\025\174\026\002\026\014\026&\000\000\000\000\000\0008\242\0262\026>\025\134\000\000\000\000\000\000\000\000\025\150\025\186\025\198\025\162\025\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023~\023\174\025\222\025\234\000\000\000\000\000\000\017\253\000\000\026z\000\000\025\246\026\026\017\253\000\000\000\000\026V\000\000\023\194\023\230\023\242\023\206\023\254\026b\026n\000\000\025J\025\174\026\002\026\014\026&\000\000\024\n\024\022\000\000\0262\026>\000\000\000\000\000\000\000\000\024\"\024F\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0185\0185\023\138\023\218\024.\024:\024R\0185\000\000\026z\000\000\024^\024j\0185\000\000\000\000\026V\000\000\0185\0185\0185\0185\0185\026b\026n\017\253\000\000\000\000\000\000\000\000\018\029\018\029\0185\0185\000\000\000\000\000\000\018\029\000\000\017\253\000\000\0185\0185\018\029\000\000\000\000\024\130\000\000\018\029\018\029\018\029\018\029\018\029\024\142\024\154\000\000\023\138\0185\0185\0185\0185\000\000\018\029\018\029\000\000\0185\0185\000\000\000\000\000\000\000\000\018\029\018\029\000\000\000\000\000\000\000\000\000\000\000\000\0185\000\000\000\000\000\000\000\000\023~\023\174\023\138\018\029\018\029\018\029\018\029\018\2377\218\0185\000\000\018\029\018\029\023\186\000\000\000\000\0185\000\000\023\194\023\230\023\242\023\206\023\254\0185\0185\018\029\000\000\000\000\000\000\000\000\023~\023\174\024\n\024\022\000\000\000\000\000\000\018U\000\000\018\029\000\000\024\"\024F\018U\000\000\000\000\018\029\000\000\018U\018U\018U\023\206\018U\018\029\018\029\000\000\023\138\023\218\024.\024:\024R\000\000\018U\018U\000\000\024^\024j\000\000\000\000\000\000\000\000\018U\018U\000\000\000\000\000\000\000\000\000\000\000\000\018\237\000\000\000\000\000\000\000\000\023~\023\174\023\138\023\218\018U\018U\018U\018)\000\000\024\166\000\000\018U\018U\018)\000\000\000\000\024\130\000\000\018)\018)\018)\023\206\018)\024\142\024\154\018U\000\000\000\000\000\000\000\000\023~\023\174\018)\018)\000\000\000\000\000\000\018%\000\000\018U\000\000\018)\018)\018%\000\000\000\000\018U\000\000\018%\018%\018%\023\206\018%\018U\018U\000\000\023\138\023\218\018)\018)\018)\000\000\018%\018%\000\000\018)\018)\000\000\000\000\000\000\000\000\018%\018%\000\000\000\000\000\000\000\000\000\000\000\000\018)\000\000\000\000\000\000\000\000\023~\023\174\023\138\023\218\018%\018%\018%\018A\000\000\018)\000\000\018%\018%\018A\000\000\000\000\018)\000\000\023\194\023\230\023\242\023\206\023\254\018)\018)\018%\000\000\000\000\000\000\000\000\023~\023\174\024\n\024\022\000\000\000\000\000\000\0181\000\000\018%\000\000\024\"\024F\0181\000\000\000\000\018%\000\000\0181\0181\0181\023\206\0181\018%\018%\000\000\023\138\023\218\024.\024:\024R\000\000\0181\0181\000\000\024^\024j\000\000\000\000\000\000\000\000\0181\0181\000\000\000\000\000\000\000\000\000\000\000\000\018A\000\000\000\000\000\000\000\000\023~\023\174\023\138\023\218\0181\0181\0181\018-\000\000\018A\000\000\0181\0181\018-\000\000\000\000\024\130\000\000\018-\018-\018-\023\206\018-\024\142\024\154\0181\000\000\000\000\000\000\000\000\023~\023\174\018-\018-\000\000\000\000\000\000\018]\000\000\0181\000\000\018-\018-\018]\000\000\000\000\0181\000\000\023\194\023\230\023\242\023\206\018]\0181\0181\000\000\023\138\023\218\018-\018-\018-\000\000\024\n\024\022\000\000\018-\018-\000\000\000\000\000\000\000\000\018]\018]\000\000\000\000\000\000\000\000\000\000\000\000\018-\000\000\000\000\000\000\000\000\023~\023\174\023\138\023\218\024.\024:\018]\0189\000\000\018-\000\000\018]\018]\0189\000\000\000\000\018-\000\000\023\194\023\230\023\242\023\206\0189\018-\018-\018]\000\000\000\000\000\000\000\000\018\025\018\025\024\n\024\022\000\000\000\000\000\000\018\025\000\000\018]\000\000\024\"\0189\018\025\000\000\000\000\018]\000\000\018\025\018\025\018\025\018\025\018\025\018]\018]\000\000\023\138\023\218\024.\024:\0189\000\000\018\025\018\025\000\000\0189\0189\000\000\000\000\000\000\000\000\018\025\018\025\000\000\000\000\000\000\000\000\000\000\000\000\0189\000\000\000\000\000\000\000\000\023~\023\174\023\138\018\025\018\025\018\025\018\025\018\021\000\000\0189\000\000\018\025\018\025\018\021\000\000\000\000\0189\000\000\018\021\018\021\018\021\023\206\018\021\0189\0189\018\025\000\000\000\000\000\000\000\000\023~\023\174\018\021\018\021\000\000\000\000\000\000\018\017\000\000\018\025\000\000\018\021\018\021\018\017\000\000\000\000\018\025\000\000\023\194\023\230\023\242\023\206\018\017\018\025\018\025\000\000\023\138\023\218\018\021\018\021\018\021\000\000\024\n\024\022\000\000\018\021\018\021\000\000\000\000\000\000\000\000\018\017\018\017\000\000\000\000\000\000\000\000\000\000\000\000\018\021\000\000\000\000\000\000\000\000\023~\023\174\023\138\023\218\024.\024:\018\017\018\r\000\000\018\021\000\000\018\017\018\017\018\r\000\000\000\000\018\021\000\000\023\194\023\230\023\242\023\206\018\r\018\021\018\021\018\017\000\000\000\000\000\000\000\000\023~\023\174\024\n\024\022\000\000\000\000\000\000\018e\000\000\018\017\000\000\024\"\018\r\018e\000\000\000\000\018\017\000\000\023\194\023\230\023\242\023\206\018e\018\017\018\017\000\000\023\138\023\218\024.\024:\018\r\000\000\024\n\024\022\000\000\018\r\018\r\000\000\000\000\000\000\000\000\024\"\018e\000\000\000\000\000\000\000\000\000\000\000\000\018\r\000\000\000\000\000\000\000\000\023~\023\174\023\138\023\218\024.\024:\018e\018a\000\000\018\r\000\000\018e\018e\018a\000\000\000\000\018\r\000\000\023\194\023\230\023\242\023\206\018a\018\r\018\r\018e\000\000\000\000\000\000\000\000\023~\023\174\024\n\024\022\000\000\000\000\000\000\018=\000\000\018e\000\000\024\"\018a\018=\000\000\000\000\018e\000\000\023\194\023\230\023\242\023\206\018=\018e\018e\000\000\023\138\023\218\024.\024:\018a\000\000\024\n\024\022\000\000\018a\018a\000\000\000\000\000\000\000\000\024\"\018=\000\000\000\000\000\000\000\000\000\000\000\000\018a\000\000\000\000\000\000\000\000\023~\023\174\023\138\023\218\024.\024:\018=\018Q<\014\018a\000\000\018=\018=\023\186\000\000\000\000\018a\000\000\023\194\023\230\023\242\023\206\023\254\018a\018a\018=\000\000\000\000\000\000\000\000\023~\023\174\024\n\024\022\000\000\000\000\000\000\018E\000\000\018=\000\000\024\"\024F\018E\000\000\000\000\018=\000\000\023\194\023\230\023\242\023\206\023\254\018=\018=\000\000\023\138\023\218\024.\024:\024R\000\000\024\n\024\022\000\000\024^\024j\000\000\000\000\000\000\000\000\024\"\024F\000\000\000\000\000\000\000\000\000\000\000\000\018Q\000\000\000\000\000\000\000\000\023~\023\174\023\138\023\218\024.\024:\024R\018I\000\000\024\166\000\000\024^\024j\018I\000\000\000\000\024\130\000\000\023\194\023\230\023\242\023\206\018I\024\142\024\154\018E\000\000\000\000\000\000\000\000\023~\023\174\024\n\024\022\000\000\000\000\000\000\018M\000\000\018E\000\000\024\"\024F\018M\000\000\000\000\024\130\000\000\023\194\023\230\023\242\023\206\018M\024\142\024\154\000\000\023\138\023\218\024.\024:\024R\000\000\024\n\024\022\000\000\024^\024j2\174\000\000\000\000\000\000\024\"\024F\000\000\000\000\000\000\000\000\000\000\000\000\018I\000\000\000\000\000\000\000\000\025>\025v\023\138\023\218\024.\024:\024R\000\000\000\000\018IA\238\024^\024j\025\134\000\000\000\000\018I\000\000\025\150\025\186\025\198\025\162\025\210\024\142\024\154\018M\000\000\000\000\000\000\000\000\023~\023\174\025\222\025\234\000\000\000\000\000\000\018\213>\254\018M\000\000\025\246\026\026\023\186\000\000\000\000\018M\000\000\023\194\023\230\023\242\023\206\023\254\024\142\024\154\000\000\025J\025\174\026\002\026\014\026&\000\000\024\n\024\022\000\000\0262\026>2\202\000\000\000\000\000\000\024\"\024F\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025>\025v\023\138\023\218\024.\024:\024R\000\000\000\000\026zB\006\024^\024j\025\134\000\000\000\000\026V\000\000\025\150\025\186\025\198\025\162\025\210\026b\026n\018\213\000\000\000\000\000\000\000\000\023~\023\174\025\222\025\234\000\000\000\000\000\000\018\217?n\024\166\000\000\025\246\026\026\023\186\000\000\000\000\024\130\000\000\023\194\023\230\023\242\023\206\023\254\024\142\024\154\000\000\025J\025\174\026\002\026\014\026&\000\000\024\n\024\022\000\000\0262\026>\000\000\000\000\000\000\000\000\024\"\024F\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023~\023\174\023\138\023\218\024.\024:\024R\018\221\000\000\026z\000\000\024^\024j\023\186\000\000\000\000\026V\000\000\023\194\023\230\023\242\023\206\023\254\026b\026n\018\217\000\000\000\000\000\000\000\000\023~\023\174\024\n\024\022\000\000\000\000\000\000\018\209\000\000\024\166\000\000\024\"\024F\023\186\000\000\000\000\024\130\000\000\023\194\023\230\023\242\023\206\023\254\024\142\024\154\000\000\023\138\023\218\024.\024:\024R\000\000\024\n\024\022\000\000\024^\024j\000\000\000\000\000\000\000\000\024\"\024F\000\000\000\000\000\000\000\000\000\000\000\000\018\221\000\000\000\000\000\000\000\000\000\000\000\000\023\138\023\218\024.\024:\024R7\210\000\000\024\166\000\000\024^\024j\000\000\000\000\000\000\024\130\011j\001\030\000\000\000\000\001F\000\000\024\142\024\154\018\209\000\000\001J\000\000\000\000\000\000\000\000\000\000\011n\000\000\000\000\002\006<\006\000\000\024\166\000\000\025\142\000\000\000\000\000\000\000\000\024\130\000\000\011v\000\000\003\166\003\002/\022\024\142\024\154\000\000\003\170\000\000\017.\000\000\000\000\011\130\011\142\001v\000\000\000\000\003\182\000\000\012\181\000\000\000\000\012\181\002\014\003\194\000\000\0176\003\222\018\026\000\000\018*\018:\004r\011j\001\030/R\000\000\001F\000\000\000\000\000\000\000\000/^\001J\000\000\000\000\003\190\005\138/z\011n\004v\004z\001\174\018b\000\000\011^\002\014\005\142\005\146\000\000\000\000\005\150\000\000\005\154\011v\000\000\005\222\000\000\000\000\000\000\000\000\000\000\000\000/\138\017.\000\000\004~\011\130\011\142\001v\000\000\000\000\018f\000\000\000\000/\146/\170\005\194\002\014\000\000\000\000\0176\003\222\018\026\000\000\018*\018:\004r\000\000\000\000\000\000\023~\023\174\000\000\000\000\000\000\000\000\000\000/\178\000\000\000\000\000\000\000\000\000\000\023\186\004v\004z\000\000\018b\023\194\023\230\023\242\023\206\023\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\222\000\000\024\n\024\022\000\000\000\000\000\000\000\000\000\000\000\000\004~\024\"\024F\000\000\000\000\000\000\018f\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023\138\023\218\024.\024:\024R\000\000\000\000\000\000\000\000\024^\024j\000\000\000\000\000\000\020\134\000\000\000\000\000\000\000\000\000\000\003\154\003\002\000\000\000\000\000\000\000\000\003\170\023~\023\174\000\000\000\000\000\000\000\000\000\000\000\000>\246\012R\024\166\000\000)\182\023\186\000\000\000\000\012n\024\130\023\194\023\230\023\242\023\206\023\254\000\000\024\142\024\154\000\000\000\000\003\166\003\002\000\000\000\000\024\n\024\022\003\170\000\000\000\000\000\000\012Z\011\154\000\000\024\"\024F\000\000\003\182\000\000\000\000\nA\004b\012v\012\134\003\194\003\222\012\146\000\000\012\158\023\138\023\218\024.\024:\024R\000\000\000\000\000\000\000\000\024^\024j\000\000\001\030\003\202\000\000\001F\000\000\003\190\005\138\000\000\000\000\001J\000\000\012\162\000\000\000\000\000\000\002\014\005\142\005\146\000\000\003\222\005\150\000\000\005\154\005\222\000\000\024\166\001\190@\182\000\000\000\000\000\000\000\000\024\130\000\000\000\000\000\000\000\000\001\194\000\000\024\142\024\154\000\000\000\000\000\000\001\202\001v\005\194\006\161\006\161\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\004\014\005\222\004F\004N\000\250\000\000\004r\011j\001\030\000\000\000\000\001F\000\000\000\000\000\000\000\000\000\000\001J\000\000\000\000\000\000\000\000\000\000\011n\004v\004z\018\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\250\000\000\011v\000\000\000\000\003\166\003\002&R\000\000\000\000\000\000\003\170\000\000\000\000\004~\011\130\011\142\001v\000\000\000\000\004\154\003\182\000\000\000\000\000\000\000\000\002\014\000\000\005\174\0176\003\222\018\026\000\000\018*\018:\004r\018N\000\000\000\000\000\000\000\000\000\000\011\146\001\n\000\000\000\000\001\014\000\000\000\000\000\000\003\190\005\138\001\018\004v\004z\000\000\018b\000\000\011\150\000\000\002\014\005\142\005\146\000\000\003\222\005\150\000\000\005\154\015=\005\222\000\000\000\000\001\030\017>\000\000\001F\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\000\000\018f\017B\017N\001\182\015=\015=\005\194\015=\015=\000\000\000\000\000\000\004b\000\000\000\000\017b\003\222\017v\005\222\017\146\017\202\016\238\011j\001\030\000\000\000\000\001F\000\000\000\000\000\000\000\000\018\198\001J\000\000\000\000\000\000\000\000\000\000\011n\016\242\016\246\018\166\017\210\000\000\018\254\000\000\019&\000\000\0196\000\000\000\000\000\000\000\000\011v\000\000\005\222\000\000\000\000\000\000\015=\000\000\000\000\000\000\000\000\000\000\016\250\011\130\011\142\001v\004z\000\000\017\214\000\000\015=\015=\000\000\015=\002\014\000\000\000\000\0176\003\222\018\026\000\000\018*\018:\004r\000\000\015=\000\000\000\000\015=\015=\011\133\011\133\000\000\015=\011\133\015=\000\000\000\000\000\000\015=\011\133\004v\004z\000\000\018b\000\000\011\133\000\000\000\000\000\000\030R\000\000\000\000\000\000\000\000\000\000\000\000\005\222\000\000\000\000\000\000\011\133\000\000\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\000\000\000\018f\011\133\011\133\011\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\133\000\000\000\000\011\133\011\133\011\133\000\000\011\133\011\133\011\133\000\000\n\221\000\000\000\000\n\221\000\000\000\000\000\000\000\000\000\000\n\221\000\000\000\000\000\000\000\000\000\000\000\000\011\133\011\133\000\000\011\133\000\000\000\000\000\000\000\000\000\000\000\000\n\221\000\000\000\000\000\000\000\000\000\014\011\133\000\000\000\000\000\000\000\000\n\221\000\000\000\000\000\000\000\000\011\133\000\000\n\221\n\221\000\000\000\000\011\133\n\221\n\221\000\000\n\221\000\000\n\221\n\221\000\000\n\221\000\000\n\221\n\221\n\221\000\000\n\221\000\000\001\030\000\000\000\000\001F\000\000\000\000\000\000\000\000\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\n\221\n\221\000\000\000\000\000\000\000\000\000\000\001\146\000\000\000\000\001\150\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\n\221\000\000\001\162\001v\000\000\000\000\n\221\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\015&\000\000\015>\004N\000\250\000\000\004r\000\000\001\n\000\000\000\000\001\014\000\000\000\000\000\000\000\000\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\004v\004z\t\189\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\026\000\000\000\000\000\000\b\005\004~\000\000\001:\001\182\000\000\000\000\015N\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\016R\b\005\016j\016z\016\158\000\000\016\238\b\005\b\005\000\000\b\005\b\005\000\000\b\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\242\016\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\006\b\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\t\000\000\000\000\000\000\b\005\000\000\016\250\b\005\000\000\000\000\000\000\000\000\016\254\b\005\000\000\000\000\000\000\b\t\000\000\000\000\000\000\b\005\b\005\b\t\b\t\000\000\b\t\b\t\000\000\b\t\000\000\000\000\000\000\b\005\000\000\b\005\000\000\000\000\000\000\000\000\000\000\b\005\000\000\b\005\000\000\000\000\000\000\b\005\b\005\000\000\003\022\b\t\000\000\000\000\000\000\b\005\000\000\000\000\000\000\000\000\b\r\000\000\b\005\000\000\b\t\000\000\000\000\b\t\000\000\000\000\000\000\000\000\000\000\b\t\000\000\000\000\000\000\b\r\001\161\000\000\000\000\b\t\b\t\b\r\b\r\000\000\b\r\b\r\000\000\b\r\000\000\000\000\000\000\b\t\000\000\b\t\000\000\000\000\021\190\022.\023B\b\t\001\161\b\t\000\000\000\000\001\161\b\t\b\t\000\000\003\030\b\r\0226\000\000\000\000\b\t\000\000\000\000\000\000\000\000\000\000\000\000\b\t\000\000\b\r\000\000\022:\b\r\000\000\023J\000\000\000\000\000\000\b\r\001\030\000\000\000\000\001F\000\000\000\000\004\190\b\r\b\r\001J\0312\016z\016\158\000\000\000\000\000\000\000\000\000\000\000\000\b\r\000\000\b\r\000\000\000\000\000\000\000\000\001N\b\r\000\000\b\r\000\000\000\000\000\000\b\r\b\r\000\000\000\000\001R\000\000\000\000\000\000\b\r\000\000\000\000\001j\001v\031>\000\000\b\r\001z\003\238\000\000\003\242\000\000\002\014\003\254\000\000\004&\000\000\004F\004N\000\250\000\000\004r\003\166\005\130\000\000\000\000\b^\000\000\003\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\182\004v\004z\000\000\000\000\001\n\000\000\003\194\001\014\000\000\bj\000\000\000\000\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004~\000\000\bn\005\138\021\194\000\000\004\130\000\000\000\000\000\000\000\000\000\000\002\014\005\142\005\146\021\198\003\222\b\146\000\000\007\210\000\000\000\000\021\206\001\182\000\000\000\000\000\000\001z\001\186\000\000\003\242\000\000\004b\004\190\000\000\022>\000\000\022V\016z\016\158\b\158\016\238\000\000\005\194\000\193\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\162\000\000\000\000\005\222\000\000\000\000\000\000\016\242\016\246\000\000\b\166\000\000\000\000\000\000\000\000\000\193\000\193\b\174\000\193\000\193\000\000\000\000\000\000\000\000\000\201\000\201\000\201\000\000\000\000\000\000\000\000\000\000\000\000\016\250\000\000\000\000\000\000\000\000\000\000\022Z\000\000\000\000\003\190\000\000\000\000\000\000\000\000\000\000\000\201\000\201\000\201\000\201\000\201\000\201\000\000\000\000\000\193\000\000\000\000\000\193\000\193\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\193\012Z\003\190\000\000\000\000\000\000\0155\000\000\000\000\000\193\000\193\000\193\000\193\000\193\000\000\000\201\000\201\000\000\000\000\000\201\000\000\000\193\000\000\000\193\000\000\000\193\000\193\0155\0155\000\000\0155\0155\000\000\000\193\000\201\000\193\012Z\000\000\b\241\000\193\000\193\000\000\000\000\000\201\000\201\000\201\000\201\000\201\000\000\000\000\000\193\000\000\000\000\000\000\000\201\000\201\000\201\000\201\000\201\000\201\000\201\b\241\b\241\000\000\b\241\b\241\000\201\000\201\000\201\000\201\000\000\000\000\000\201\000\201\000\201\000\000\000\000\000\000\000\193\000\193\000\000\000\193\0155\000\000\000\000\b\241\b\241\000\000\000\000\000\193\000\000\000\193\000\000\000\193\000\193\000\000\0155\0155\000\000\0155\000\000\000\193\b\241\000\193\018\142\b\241\000\000\000\193\000\193\b\241\b\241\0155\b\241\b\241\0155\0155\000\000\000\000\000\000\0155\000\000\0155\000\000\000\000\000\000\0155\000\000\000\000\003\166\003\002\0066\b\241\000\000\b\241\003\170\000\000\000\000\002\221\002\221\000\000\000\000\b\241\000\000\b\241\003\182\b\241\b\241\b\214\000\000\b\150\b\241\003\194\000\000\b\241\000\000\b\241\000\000\000\000\000\000\b\241\b\241\002\221\002\221\000\000\002\221\002\221\000\000\000\000\000\000\003\202\000\000\000\000\005U\003\190\005\138\000\000\000\000\000\000\012\230\b\241\000\000\b\241\000\000\002\014\005\142\005\146\000\000\003\222\005\150\b\241\005\154\b\241\000\000\b\241\b\241\005U\005U\000\000\005U\005U\000\000\b\241\002\221\b\241\000\000\000\000\000\000\b\241\b\241\000\000\000\000\000\000\000\000\000\000\005\194\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\022\000\000\000\000\000\000\005\222\000\000\000\000\000\000\000\000\002\221\000\000\002\221\000\000\000\000\005U\000\000\000\000\005U\007\"\002\221\007&\002\221\000\000\002\221\002\221\000\000\000\000\000\000\000\000\000\000\000\000\002\221\000\000\002\221\000\000\000\000\000\000\012\250\002\221\000\000\000\000\000\000\005U\005U\000\000\005U\003\166\003\002\030\202\000\000\000\000\b\t\003\170\005U\003\166\003\002$\254\005U\005U\000\000\003\170\000\000\003\182\000\000\000\000\005U\000\000\000\000\000\000\005\174\003\182\000\000\005U\000\000\003\166\003\002\000\000\005\174\000\000\000\000\003\170\000\000\000\000\000\000\000\000\000\000\000\000\015\238\000\000\000\000\003\182\003\190\005\138:\150\000\000\015\238\000\000\003\194\000\000\003\190\005\138\002\014\005\142\005\146\000\000\003\222\005\150\000\000\005\154\002\014\005\142\005\146\000\000\003\222\005\150\003\202\005\154\000\000\000\000\003\190\005\138\000\000\003\154;\018\000\000\000\000:\214\000\000\003\170\002\014\005\142\005\146\005\194\003\222\005\150\000\000\005\154\000\000\012R\000\000\005\194\000\000\003\166\003\002\005\222\012n\000\000\000\000\003\170\000\000\000\000\000\000\005\222\000\000\000\000\000\000\000\000\000\000\003\182\000\000\005\194:\226\000\000\b\226\000\000\003\194\000\000;\022\011\154\000\000\000\000\000\000\005\222\000\000\000\000\000\000\000\000\004b\012v\012\134\000\000\000\000;\026\003\202\012\n\000\000\000\000\003\190\005\138\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\014\005\142\005\146\000\000\003\222\005\150\000\000\005\154:\246\000\000\000\000\012\162\005}\000\000\015r\016F\021\142\000\000\001\165\000\000\000\000\000\000\001\165\000\000\001~\000\000\000\000\000\000\015\182\000\000:\254\005\194\000\000\000\000\000\000\000\000\000\000;\030\000\000\000\000\000\000\000\000\015\186\005\222\000\000\015\194\001\134\003\166\003\002\000\000\000\000\000\000\000\000\005\210\000\000\000\000\003\254\007\"\000\000\007&\016N\004N\000\250\003\182\000\000\000\000\003\166\003\002\001\138\000\000\003\194\000\000\003\170\000\000\000\000\000\000\005}\005}\000\000\000\000\000\000\000\000\003\182\000\000\000\000\000\000\000\000\000\000\003\202\003\194\000\000\000\000\003\190\005\138\003\166\003\002\021\150\000\000\000\000\000\000\003\170\000\000\002\014\005\142\005\146\000\000\003\222\005\150\000\000\005\154\003\182\003\190\005\138\000\000\003\154\003\002\000\000\003\194\000\000\000\000\003\170\002\014\005\142\005\146\000\000\003\222\005\150\000\000\007\210\000\000\012R\000\000\000\000\005\194\000\000\015\238\000\000\012n\000\000\003\190\005\138\000\000\003\166\003\002(R\005\222\000\000\000\000\003\170\002\014\005\142\005\146\005\194\003\222\005\150\026\206\005\154\000\000\003\182\012Z\011\154\003\166\003\002\000\000\005\222\005\174\000\000\000\000\000\000\004b\012v\012\134\000\000\003\222\012\146\000\000\012\158\003\182\000\000\000\000\005\194\000\000:\162\000\000\003\194\000\000\000\000\003\190\005\138\000\000\000\000\000\000\005\222\000\000\000\000\000\000\000\000\002\014\005\142\005\146\012\162\003\222\005\150\000\000\005\154\000\000\003\190\005\138\003\166\003\002\ta\000\000\005\222\000\000\000\000\000\000\002\014\005\142\005\146\000\000\003\222\005\150\000\000\005\154\003\182\000\000\000\000\000\000\005\194:\238\000\000\003\194\000\000\ta\ta\000\000\ta\ta\000\000\000\000\005\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\190\005\138\000\000\000\000\019-\000\000\005\222\000\000\000\000\000\000\002\014\005\142\005\146\000\000\003\222\005\150\000\000\005\154\000\000\000\000\007\"\ta\007&\000\000\ta\000\000\000\000\019-\019-\000\000\019-\019-\003\154\003\002\000\000\000\000\000\000\000\000\003\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012R\000\000\ta\000\000\ta\005\222\000\000!b\000\000\014\245\000\000\000\000\ta\000\000\t\"\000\000\ta\ta\000\000\007\"\019-\007&\000\000\019-\ta\000\000\000\000\000\000\000\000\012Z\011\154\ta\014\245\014\245\000\000\014\245\014\245\000\000\000\000\004b\012v\012\134\000\000\003\222\012\146\000\000\012\158\000\000\000\000\019-\000\000\019-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019-\000\000\t\"\000\000\019-\019-\000\000\000\000\000\000\000\000\000\000\012\162\019-\001\165\014\245\000\000\000\000\014\245\000\000\019-\000\000\000\000\000\000\005\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\190\022.\023B\000\000\001\165\000\000\000\000\000\000\001\165\005=\014\245\000\000\014\245\000\000\0226\000\000\000\000\000\000\000\000\000\000\014\245\000\000\000\000\000\000\014\245\014\245\000\000\000\000\022:\000\000\000\000\023J\014\245\000\000\000\000\000\000\000\000\000\000\000\000\014\245\000\000\000\000\004\190\000\000\000\000\000\000\0312\016z\016\158\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031>"))
  
  and lhs =
    (16, "\000\006\000\005\000\004\000\003\000\002\000\001\000\000\001-\001-\001-\001-\001,\001,\001+\001+\001*\001*\001)\001)\001(\001(\001'\001'\001&\001&\001&\001%\001%\001%\001$\001#\001#\001#\001\"\001\"\001!\001!\001 \001 \001\031\001\031\001\030\001\030\001\029\001\029\001\028\001\028\001\028\001\028\001\028\001\028\001\028\001\028\001\028\001\028\001\028\001\027\001\027\001\026\001\026\001\026\001\026\001\026\001\026\001\026\001\026\001\026\001\026\001\025\001\025\001\024\001\023\001\023\001\023\001\023\001\023\001\023\001\023\001\023\001\023\001\023\001\022\001\021\001\021\001\020\001\020\001\020\001\020\001\020\001\020\001\020\001\020\001\020\001\019\001\019\001\019\001\018\001\018\001\018\001\018\001\018\001\018\001\018\001\018\001\018\001\018\001\018\001\018\001\018\001\017\001\017\001\017\001\017\001\016\001\016\001\015\001\014\001\r\001\r\001\r\001\012\001\012\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\n\001\n\001\n\001\n\001\n\001\n\001\n\001\t\001\b\001\b\001\b\001\007\001\006\001\006\001\005\001\005\001\004\001\004\001\004\001\004\001\003\001\003\001\003\001\003\001\003\001\002\001\001\001\000\001\000\001\000\001\000\000\255\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\253\000\252\000\252\000\252\000\251\000\251\000\250\000\250\000\249\000\249\000\248\000\248\000\247\000\247\000\246\000\246\000\245\000\245\000\244\000\244\000\243\000\243\000\242\000\242\000\241\000\241\000\240\000\240\000\239\000\239\000\239\000\238\000\238\000\238\000\238\000\238\000\237\000\237\000\237\000\237\000\237\000\237\000\236\000\236\000\236\000\236\000\236\000\236\000\236\000\235\000\235\000\234\000\234\000\234\000\234\000\234\000\234\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\232\000\231\000\230\000\230\000\229\000\228\000\228\000\228\000\228\000\228\000\228\000\227\000\227\000\227\000\227\000\227\000\227\000\226\000\226\000\225\000\225\000\225\000\225\000\224\000\224\000\224\000\224\000\223\000\223\000\223\000\223\000\222\000\221\000\221\000\220\000\220\000\219\000\218\000\217\000\216\000\215\000\215\000\215\000\215\000\214\000\214\000\214\000\214\000\214\000\214\000\213\000\213\000\212\000\212\000\211\000\211\000\211\000\211\000\210\000\210\000\209\000\209\000\209\000\209\000\208\000\208\000\208\000\208\000\208\000\208\000\207\000\207\000\206\000\206\000\206\000\206\000\206\000\205\000\205\000\204\000\203\000\203\000\203\000\202\000\202\000\201\000\201\000\201\000\201\000\201\000\201\000\200\000\199\000\199\000\198\000\198\000\197\000\197\000\196\000\196\000\196\000\195\000\195\000\194\000\194\000\193\000\193\000\193\000\193\000\193\000\192\000\192\000\192\000\192\000\192\000\191\000\191\000\190\000\190\000\189\000\189\000\188\000\188\000\187\000\187\000\187\000\186\000\185\000\185\000\184\000\184\000\183\000\183\000\182\000\182\000\181\000\181\000\180\000\180\000\179\000\179\000\178\000\178\000\177\000\177\000\176\000\176\000\175\000\175\000\174\000\174\000\173\000\173\000\172\000\172\000\171\000\171\000\170\000\170\000\169\000\169\000\168\000\168\000\167\000\167\000\166\000\166\000\165\000\165\000\164\000\164\000\164\000\164\000\163\000\163\000\162\000\162\000\161\000\161\000\160\000\160\000\159\000\159\000\158\000\158\000\157\000\157\000\156\000\156\000\155\000\155\000\154\000\154\000\153\000\153\000\152\000\152\000\151\000\150\000\149\000\149\000\149\000\149\000\148\000\148\000\148\000\147\000\147\000\147\000\146\000\146\000\145\000\145\000\144\000\144\000\143\000\143\000\142\000\142\000\142\000\142\000\142\000\142\000\141\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\139\000\139\000\138\000\137\000\137\000\137\000\137\000\136\000\136\000\136\000\136\000\136\000\135\000\135\000\134\000\134\000\133\000\132\000\132\000\131\000\131\000\130\000\130\000\130\000\129\000\129\000\128\000\128\000\127\000~\000~\000}\000}\000|\000|\000{\000{\000z\000z\000z\000z\000z\000z\000z\000z\000y\000y\000y\000y\000y\000y\000y\000y\000x\000x\000w\000w\000v\000v\000u\000u\000t\000t\000t\000s\000s\000r\000r\000r\000r\000q\000p\000p\000p\000p\000p\000o\000o\000n\000n\000n\000n\000n\000n\000n\000n\000n\000n\000n\000n\000n\000n\000n\000n\000n\000n\000n\000n\000n\000n\000n\000n\000n\000n\000m\000m\000l\000l\000k\000k\000j\000j\000i\000i\000h\000h\000g\000g\000f\000f\000e\000e\000d\000d\000c\000c\000b\000b\000a\000a\000`\000`\000_\000_\000^\000^\000]\000]\000\\\000\\\000[\000[\000Z\000Z\000Y\000Y\000X\000X\000W\000W\000V\000V\000U\000U\000T\000S\000S\000S\000R\000Q\000P\000O\000O\000N\000M\000M\000L\000L\000L\000K\000K\000K\000K\000K\000K\000K\000K\000K\000K\000K\000K\000J\000J\000J\000J\000J\000J\000I\000I\000H\000G\000G\000F\000F\000E\000D\000D\000D\000D\000D\000D\000D\000D\000D\000D\000D\000D\000D\000D\000D\000C\000C\000C\000B\000B\000B\000B\000A\000A\000@\000@\000?\000?\000>\000>\000>\000>\000=\000=\000=\000=\000=\000=\000=\000<\000<\000;\000;\000;\000;\000:\000:\000:\0009\0009\0009\0009\0009\0009\0009\0009\0009\0009\0009\0009\0009\0009\0009\0009\0009\0009\0009\0009\0009\0009\0009\0009\0008\0008\0007\0007\0007\0007\0007\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0006\0005\0005\0005\0005\0005\0005\0005\0005\0005\0005\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\0003\0003\0003\0003\0003\0003\0003\0003\0003\0003\0003\0003\0003\0003\0003\0003\0003\0003\0003\0003\0003\0003\0003\0003\0003\0003\0003\0003\0003\0003\0003\0003\0003\0003\0003\0003\0003\0003\0003\0003\0002\0002\0002\0002\0001\0001\0001\0001\0001\0001\0000\0000\000/\000/\000/\000/\000/\000/\000.\000-\000-\000-\000-\000-\000-\000-\000-\000-\000-\000-\000-\000-\000-\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000,\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000+\000*\000*\000)\000)\000)\000)\000(\000'\000'\000&\000%\000%\000$\000#\000#\000#\000#\000#\000#\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000!\000!\000 \000 \000 \000 \000\031\000\030\000\029\000\029\000\029\000\028\000\028\000\027\000\027\000\027\000\027\000\027\000\027\000\026\000\026\000\025\000\025\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\023\000\022\000\021\000\020\000\019\000\018\000\017\000\017\000\017\000\016\000\016\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\014\000\r\000\012\000\012\000\011\000\011\000\n\000\n\000\n\000\n\000\n\000\n\000\t\000\b\000\b\000\007\000\007\000\007\000\007\000\007")
  
  and goto =
    ((16, "\t\\\t\220\000\139\000/\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000T\000\000\000\000\000\137 Z\002h\000\156\000\023\002\184\000\228\006\"\000\000\000\000\000\000\0116\001\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\027\n\004\248\011\012\000\000\000\000\020h\005\024\000\000\000\000\000\000\000\000\000\000\027\142\005*\027\242\000\000\001\127\000\000\001k\0013\000\000 \230.\248~f\005\026\000\000\028\012\000\000\000\000\000\000\0116\000\000\005\162R.\005J\000\000\028\138\000\000\000\000\000\000\000\000\000\000\000\000\000}\000\248;\174\000\000\000\000\000\000\000\000\027\n\000\000\007\n\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\240\000\000\002J\000-\000\000\000\174\001*\000!\000\000\000\000\000\221\000\000\000\000\000\000\000@\000\000\002\130\000\000\000\000\000\215\000\000\000\000\000\000\000\000\000\000\000\227\000\000\000\000\000\000\000\000\000\000\0006\000\000\000\000\000\000\001X\000\000\000\000\000\000\000\000\003P\003L\000\000\000\000\000\000\005\246\003\146\000\000\000\023\029\"\000\000\000\000\000\0000T\b\192\004\000&\184\003<\000\000\000O\000\000\b^\000\000\001z\006L\002\146\006V\"\172\017\002\005j\005\000\000\000\001\029\005`\000\000=\002\000\"\000\000\000\0001\006\n\208AT\002\228\000\000\000\000\006\170\007>1z\011\170A\254\000\000\000\000\b\136\000\000;\230\000\000<.\007r\004l\012(o\192\000\000\000\000\000\000\000\000\006\166\000\000\000\000\000\000\000\000S0\006\244\000<'X\000\000\028\012\000\000\000\000\000\000\005j\000\243\007\142\000\000\000\000\000\000\000o\000\000\t:\000\000\000\000\000\000\b\148\000\000\000\000A\186\000\000\000\000\000\000F\224[\232\000\000\000\000\000\000\n>\029.\007\180\nB\t\190\000\000\t\184\000\000\000\000\000\000\000\000\n\248\000\000\n\"\000\000\000\000\007\130\b\180\011\142\007\016\007\004\003\"\000\000\000\000\nz\003\166\000z\030F\000\000\023t\000,+L\000\000\000\000\t\244\000\000'\"\n\208\012\016\011j\012\016\000\000\011V\000\205\000\000'\168\000\000\000\0001\128\000\000\000\000\000\000\r\210\000\000\000\000\r\194\000\000\000\000\000\000\003\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019\000\000\000\000\000\000\145\176\000\000\002\216\000\000\000\000\000\000\000\000\012\224\000\000\000\000\000\000\000\000\000\000\015\n\015\150'\228\000\000\000\000\000\000\000\000\1464\000\000\000\000\000\000<~\000\000\000\000\000\000(N\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000)\016\000\000\000\000)f\000\000\015\196\000\160\000\000\000\000\000\000\015\212\001\212\000\000\000\000\000\000\000\000\000\000\012\192\000\000\000\000\000\000\000\000\029\140\015\196\015\222\000\000\004\252\000\000\000\000\006\212\000\000\000\000\000\000\000\000\016\210\016f\b\020\000\000\000\000\000\000\000\000\014\132\000\000\000\000\000\000\000\002\000\000(\170\000\000\000\000\004B\000\000\000\000\006\148\000\000\000\000\000\000\000\000\017\152\019\128\020 \021 \000\000\000\000\000\000\000\000\000\004\000\000\000\000\021p\000\000\000\000)\232\000\000\000\000\000\000*\028\000\000\021\234\000i\000\000\000\000\000\000\000\000\000\000\000\000\021\254<\162\000\000\000\000\000\000\000\000\000\000\000\000\022r=\004\000\000\000\000\000\000\000\000\000\000\002\012\031\250\000\000\026\n&\184\002x\000\000\000\000\023\n2>\000\000\000\000\000\000+L\b\020\000\000\t\016\000\000\n\138\000\000\001\196\000z\000\000\000\000\000\000\011\242\000\000\014b\000\000\000\000\015\208\000\000\000\000\017\202\000\000\021\016\000\000\021\204\000\000\000\000\000\000\025\158\011\242&\184+L\b\000\000\000\000\000\000\223\0120\000\000=j\000\000\023\184\000\000\025\210\007\004\000T\000\000\007\220\n\152\002 \002\196\000\000\026\182\000\000\000\000\000\000\000\000\000\000\003\158\000\000\000\000\000\000\004*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\214\000\000\000\000\000+\005:\000\004\000\000\026p\000\000\000\000\000\000\000\000\026\232\000\000\000\000\000\000\000\000\t2\n\152\025\162\000\000\000\205\025\252\000\000\026\140\000\000\000\000\029\216\000\000\000\000\0312\000\000\031\208\000\000#\136\000\000\006.\025\228\004|\000\000\000\000\006X\027\"\005l\000\000\006l\000\000\t\154\000\000\000\000\005\b\006^\027L\b\212\000\000\007R\027\142\t\018\000\000\n\130\000\000\000\000\012N\000\000\000\000\000\000\000\000\000\000\000\000\n\216\000\000\027\218\000>\000\000\029\028\028\174\000\000\000\000\000\000\028D\007\218\017\014\029\230\000\000\003\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000=\222\000\000\007\214\004\158O\162\000\000\007\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\000\000\000\b \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\029X\000\000\016\174\018R\029>\n6\rF\000!\015\146\028l\003\138#\202 \162\000\000\000\000\000\000\000\000\000D\000\000\r\138\000\000\000\000\000\000\000\000\018\246\000\000\000\000\000\000\000\000\029|\000\000\000\000\000\000\029\160>2\011\214\0304*@\029\206\000\000\000\000\000\000\028\244\000\000>n\029J\000\000\000\000\020`\000\000\000\000>\192\000\000\000\000\000\000\028z\000\000\146\158\000\000\000\000\030\152\000\000\000\000\015\202\000\000\000\000\000\000\000\000\146\224\000\000\000\000\000\000\147\004\000\000\000\000\000\000\000\000\000\000\029\018\000\000\000\000\000\000\000\000\000\000\000\000$\016\000\000\000\000$6\000\000\000\000% \000\000%\216\000\000'\004\000\000\t\172\029\006\011\166\000\000\000\000\n\002\029\012\r\014\000\000\r\226\000\000\r\232\000\000\000\000\012\158\017\022\029\014\014\016\000\000\017L\029\022\015&\000\000\016\170\000\000\000\000\016\202\000\000\000\000\000\000\003p1\202\000\000>\166\000\000\029\246\000\000\030\174\001*\000\000\014*\015\146\000\000\000\000\b \000\000\030\182\000\000\000\000\000\000\000\000\000\000\000\000\015\216\000\000\029\026\005d\000\000\000\000\029:\n\136\021\240\000\000\021\236\000\000:\164\000\000\000\000\000\000\000\000\n\250\n\004\000\000\000\000\000\000\000\000\018\\\000\000\029\030?\\\030\022\000\000?\190\000\000\029\230\000\000\014\"\000\000\000\000\018\138\000\000\000\000\000\000\031\002\000\000\000\000\029b\000\000\000\000\000\000\000\000@\210\000\000\000\000F\170\000\000\000\000\000\000\000\000\tj\000\000\000\000\000\000\t\168\000\000\018\134?l\000\000?\176\t\212\000\000\000\000\030H\000\000\000\000\000\254\000\000\000\000\142\236\029f\000<\000\000\000\000\000\000\000\000\000\000\000\000\000+fb\000\000\029h\000\000L\206\000\000\000\000\000\000\000\000\t\002\000\000\000\000\000\000w\014\000\000\150\136\000+\000\000w\208\000\000\t\138\000\000\000\000*\192\000\000\001\226\003\006\000\023@f\000\0003\196\030\170\000\000\000\000\030x@\128\000\000\000\000\000\000\000\000\000\000\n>\000\000\000\000\000\000\000\000\030\128!b\000\000\012\214\b\186\151\004\000+\151*\000+@\180\011\208\000\000\000\000\030\\\000\000\000\000\004\186\000\000\000\000\000\000\b\176\000\000\030d\029v\000\000\000\000\000\000\000\000\000\000\000\026\012$\0308\000\000\000\000A\028\000\000\000\000\000\000\030B\000\000\000\000\000\000A\162\000\000\000\000\000\000\031\016A\200\1516\000\000\000\000\000\000\000\000\029\148\r\012+V\000\000\014D\011\2344\186\000\000\000\000\000\000\007\026\001H\000\000\000\000\004\150x\176\000\000\000\000\000\000\000\000\012\016\000\000\000\000\000\000\000\000\007\214\004$\000\000\030~|\240\000\011\000\000\000\000\000\000\030|\030~\000\000\019\210\016\024\000\000\000\000\000\000\000\000\000\000\020\140\030\146\000\000\000\000\000\000\000\000\144\174\007\024\012\016$\024\029\178\011V\029\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\148\000\000\000\000\000\000\000\000\147\194\000\000\004\206\000\000\000\000\000\000\020\200\000\000\000\000\000\000\017\026\007\000\000\000\000\000%\170\000\000\000\000\000\000\002j\028b^\172\029\194\"\202\029\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\196\000\000\000\000\000\000\000\000\147\232\000\000\000\000\000\000\151^\000\000\000\000\000\000\003F/X\000\000\000\000B\n\000\000\148V\000\000\151z\000\000\030\174&\012\000\000\000\000\000\000\014l\148\162\000\000\004$\030\188\148\208\000\000\000\000\000\000\000\000\005\132\000\000\000\000\000\000\0214\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031x\000\000\000\000\000\000\000\000\015\030\000\000\000\000\n4\000\000\000\000\000\000\000\000\021\152\000\000\000\000\000\000\000\000\000\000\030\190\000\000\000\000\015\232\000\000\000\000\r\194\000\000\000\000\000\000\021\214\000\000\000\000\000\000\000\000\000\000\000\000\000\000\151\150\000\000\031~\000\000\012\016\000\000\000\000\000\000\000\000\000\000B&\000\000\000\000\000\000\149\b\000\000\030\198\000\000\000\000\000\000\000\000\000\000\017\018\000\000\000\000\014\150\000\000\000\000\000\000\000\000\022\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\176\000\000\000\000\000\000\030\200\000\000\000\000\000\000\000\000\031\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\151\178\000\000\152\018\000\000\000\000\000\000\000\000\005:\000\000\000\000\000\000\000\000\000\000\000\000\000\000C\020\000\000\018B\000\000\1496\000\000C\136\000x\000\000\n\234\000\000\000\000\000\000C\252\000\000\000\000\030\214B\228\000\000\000\000\000\000\000\000\030\228\000\000\000\000\000\000\000\000C\202D\012\152`\000+\000\000\000\000\014fDL\019Z\015\202\152\130\000\000\000\000\000\000\000\000\011@|\024\130\026\016\016\000\000\029\218\020\026\014\128Dn\031\004\002,\000\000+>\004\018D\190\021\158\000\000\149@\000\000EFE\196\000+E\216\014\024\000\000FtF\128\152\226\011@\152\238\011@\000\000\153\004\012|\000\000\000\000\030\238\000\000\000\000\000\000\030\020\r\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\194\031\018\011~\t\168$\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\030(\250\000\000\b^\000\000\000\000\000\000\011\196\t\168\000\000\022\228\t\168\021\236\021j\031\208\000\000F\156\000\000\018\148\004\208\027\n\000\000\000\000F\238\000\000\n>\031\\\024\024\t\168-\220\000\000\000\000\000\000F\128G \011@\000\000\000\000\017\006\000\000\000\000\000\000\000\000\031\024\031.+\142\000\000\000\000\000\000\000\000\031\222GR\000\000\000\000G\150\000\000\000\000\t\002\000\000G\214\000\000HB\000\000H\174\000\000\000\000H\242\000\000IV\000\000\000\000I\142\000\000\000\000I\208\000\000\000\000JT\000\000\000\000J\192\000\000\000\000K\000\000\000\000\000Kv\000\000\000\000K\144\000\000\000\000K\156\000\000\000\000K\182\000\000\000\000L8\000\000\000\000LL\000\000\000\000L\232\000\000\000\000M^\000\000\000\000M\190\000\000M\216\000\000\000\000\000\000NJ\000\000\000\000NZ\000\000\000\000N\200\000\000\000\000O\014\000\000\000\000O\208\000\000\000\000\000\000\000\000PD\000\000\031\194\031\220\025\166\t\1689t\000\000\000\000\000\000\031P1\196\030p\000\000N \000\000\000\000\153Z\000\000\000\000\000\000\000\000\153|\000\000\000\000P\190\000\000\000\000\000\000\000\000P\208\000\000\000\000P\246\000\000\000\000\015<\000\000\000\000\000\000Q\\\000\000Qp\000\000Q\228\000\000\000\000\000\000RH\000\000S\026\000\000SZ\000\000\000\000S\162\000\000\000\000T\006\000\000\000\000T\022\000\000\000\000TF\000\000\000\000T\166\000\000\000\000T\216\000\000\000\000U\024\000\000\000\000U\212\000\000\000\000VN\000\000\000\000Vf\000\000\000\000V\206\000\000\000\000V\218\000\000\000\000W\000\000\000\000\000Wz\000\000W\160\000\000\000\000\000\000X\006\000\000\000\000XL\000\000\000\000X\220\000\000\000\000Y \000\000\000\000\017\142Y`\000\000\000\000\000\0002\198\031\\Y\196\000\000\000\000\000\000\000\000\000\000\000\000\031\250Y\150\000\000Y\210;8\000\000\000\000\000\000\000\000\000\000\021@\020\030\018z\000\000\030hZ~\031\\\000\000Z\154\000\000\031(\000\000\020l\000\000\0042\000\000\000\000\000\000\000\000\000\000\016h\000\000\000\000\000\000\017|\000\000\000\000\000\000\020\248\000\000\000\000\000\000 @\000\000\000\000\030\164\000\000\000\000\000\000\000\000GF\000\000\000\000Jx\000\000\031\176[\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\192\000\000\000\000!\170\000\000\000\000\000\000\007\146\000\000\000\000\000\000\012\012\031\146\000\000\000\000\000\000\n\022\000\000\000\000[\164\031\152\000\000\000\000\000\00038\000\000\015\140\020\140\000\000[\202\000\000\031\162\031\168\021\198\000\000\\\012\000\000\000\000\002\n\031\190\\>\000\000\000\000\000\000\000\000\021\226\031\006\\\128\031\012\031\178\000\000\031\186\022\200\000\000\\\166\000\000\000\000\031\186\000\000\000\000\031\188 D\000\000\000\000\003\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\202\023\b\031(\\\192\031,\031\208\000\000\000\000\031\210\000\000\000\000]D\031\212\000\000\031\222\023r\031<]v\031@\031\248\000\000\000\000 \002\000\000\000\000\000\000\000\000\000\000\000\000\000\000^f\000\000\023\156^\140\000\000\000\000\000\000^\206\000\0003\130 \004\000\000\000\000_.\000\000\000\000_B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006t\000\000\000\000\":\000\000\000\000\000\000\r\012\000\000\000\000\000\000\r\142 \014\000\000\000\000\000\000\nt\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000_\174\000\000\000\000\000\000\000\000\000\000\000\000_\190\000\000\000\179 Z\000\0004R\000\000_\136\000\000`2\000\000\021z_\134 *\001z`\178\000\000\000\000\000\000aN ,\007L\000\000 \030\000\000 6\011\214\000\000 \"\000\000 D\017b\000\0003\196 \n \014\000\000\000\000`\248\000\000a\210\000\000\000\000a\026\000\000b\020\000\000\000\000b\142\000\000\000\000\000\000b\152\000\000\000\000\000\000\018\246\006\170\153\140\011@c\004\000\000\000\000\023\182c\014\000\000\000\0003\252 8\000\000\000\000\000\000\027\216\001\220c\136\000\000\000\000 F\000\000<\004\000\000 H\000\000D\152\000\000 JH\218\000\000\000\000\011\182\022\002\016P\153\236\011@c\160\000\000\000\000\000\000\022n\016.\149\162 lc\186\000\000\000\000dx\000\000\031\182 \b\000\000\000\000\023N\000\000\149\186\000\000d\144\031F\000\000\000\000e\n\000\000\154\n\011@!$\000\000ef\000\000\016\232 F\000\000\000\000\000\000\001G#\202\001F\000\000\000\000$\016\b\018\000\000\000\000$6\017\182\000\000\000\000% \018\214\000\000%\216\020\206\000\000'\004\021\202\000\000\000\000\000\000\000\000\017H\000\000e\020\000\000-\216\000\000e\192\000\000\000\000\r\150\000\000\019\176\000\000\031\206\015\022\000\000\000\000!\024\031\144\000\000\000\000\000\000 x\016\148\000\000\000\000\000\000\018\186\004\160\019\028 H\000\000!H\000\000\000\000\000\000\000\000f,\000\000!J\000\000\000\000+\168\031\164\012\016\000\000\000\000f\192\000\000\000\000!V\000\000\000\000+\214\000\000\000\138\000\000\000\000\000\000\000\000\000\000\031\254,\250 \154\000\000\000\000\000\000\000\000\000\000\000\000\001P\000\000\007\208\021h\000\000\000\000\000\000f\212\000\000\000\000!`\000\000\000\000-\018\000\000!b\000\000\000\000-P\000\000\003\230\000\000\rR\017\2303\254\000\000gR\000\000\000\000g\134\000\000\000\000\031\194\024\142\000\000!f\000\000\000\000-\136\000\000!l\000\000\000\000.8\000\000\004\b\000\000\000\000\000\000\000\000 \022.v\000\000\000\000\000\000\000\000\000\000\004\142\000\0004\240\000\000\000\000 \188\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\206\000\0005R\000\000h\020\000\000\000\000h.\000\000\000\000\031\214\025\016\000\000!~\000\000\000\000.\254\000\000!\132\000\000\000\000/x\000\000\rf\000\0005f\000\000\000\000 \228\006\188\000\000\000\000\022\208\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\170\000\000\000\000\000\000\000\168\023b\000\000\000\000\024\152\000\000\000\000\007\018\000\000\000\000\022\166\"\242\024\018\000\237\000\000\000\000\000\000\028f\000\000\031\202!\210\019\n \182\000\000\000\000hx\000\000\000\000\000\000 \204\000\000\000\000\000\000h\146\000\000\000\000\000\000!\154f\140\000\000\000\000i\026\000\000\000\000\000\000\011^\014\190\"\244\024&!J>\190\000\000i \000\000i\194\000\000\023\168j\150!\026\023\158jb\000\000\000\000\000\000j\226!\028\023\222\000\000!\n\000\000!(\024\n\000\000!\020\000\000!,\024\028\000\0005\128 \252\000\000k\024\000\000kl\000\000\000\000k(\000\000k\132\000\000\000\000l\"\000\000\000\000\000\000ld\000\000\000\000\154Z\011@!P\016(\023\196\024D\000\000\000\000\000\000\000\000l\164\000\000\017\244\r\190\000\000\000\000\000\000\0190\000\000m<\000\000\019\172\000\000!(\000\000\000\000\019\216\000\000!,\000\000\000\000\022\236\000\000!J\000\000\000\000\000\0005\250\000\000\000\000\000\000\000\000\002$\021\014\000\000\024(!\140]\254\000\000\154l\011@!p\023\192!Z\000\0006\166\000\000\000\000\024\138\000\000\000\000\000\000/\224\000\000\005l0\022!(\000\000m \024D\000\000\000\000\024X\000\000\000\000\000\000!h\002\136\002$\000\000\025P\000\000\000\000\000\000 (\149\218\000\000\000\000\006\202\000\000\000\000\000\000#4\014|iv\015\140\000\000\131\170\017\226\000\000\000\000\000\000\000\000\000\000\001\188\000\000\000\000\000\000\000\000\000\000\000\000\030\136\000\000\000\000\000\000\000\000\000\000 8\000\000\000\000\000\000\000\000#\166\000\000\000\000\000\000#\208\000\000\000\000\000\000\154\142\000+\000\000\000\000!\160\024B\024 \025\028\000\000\000\000\000\000\000\000m\244\000\000\025(\016Z\000\000\000\000\000\000\030\000\000\000n\024\000\000 \022\000\000!x\000\000\000\000 H\000\000!z\000\000\000\000 \184\000\000!\146\000\000\000\000\000\0006\224\000\000\000\000\000\000\000\000\022\022\025\016\000\000\154\216\000+!\172\"\014!\156\000\00078\000\000\000\000\025p\000\000\000\000\000\0000\158\000\000\024\2420\022!j\000\000m\210\024b\000\000\024|\000\000\000\000\000\000!\158\006F\022\022\000\000\025\158\000\000\000\000\000\000 P\149\242\000\000\000\000\011\000\000\000\000\000\000\000$J\000\000\000\000\006\240\000\000\000\000&\150\000\000\000\000\000\000\000\000\000\000nf\024\184\000\000!\158\000\000\025\\\000\000!\160\000\000\025dn\136\025n\000\000n\246\025\176\000\000!\162\000\000\025\210\000\000!\164\000\000\025\248\000\000\000\000!\170\000\000\025\252\000\000\000\000\0002\023\028\000\000\000\000\024r\000\000\000\000\007|\000\000o\024\000\000\155\002\011@\000\000oX\000\000\000\000o\206\000\000\000\000p\022\000\000pH\000\000p\138\000\000\000\000p\194\000\000\000\000q>\000\000\000\000qN\000\000\000\000r\020\000\000\000\000r\150\000\000\000\000r\200\000\000\000\000s\012\000\000\000\000sL\000\000\000\000s\140\000\000\000\000s\190\000\000\000\000t\"\000\000\000\000t<\000\000\000\000t\196\000\000\000\000u\014\000\000\000\000ut\000\000u\146\000\000\000\000\000\000v6\000\000\000\000vF\000\000\000\000v\232\000\000\000\000w \000\000\000\000\000\000w2\000\000\000\000\011\232\000\000\000\000\000\000\011@w\154\000\000\000\000x\b\000\000\025lx\024\000\000\000\000xJ\000\0005\168!\176\000\000\000\000x\148\000\000\000\000y\028\000\000\011@\000\000\025\238\028\144\000\000\025\250\023:\000\000\025\250\000\000S^\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\180\002h\t\168\000\000\000\000\000\000 \206!\220\005\140O\142\000\000\000\000\000\000\000\000\000\000\000\000\029\022\025\250\030\226\025\250V\194\025\254\000\000\000\000\000\000\000\000\017\196\bH\000\000\018\244\000\000\000\000\000\000\019j\000\000\000\000\tT\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\014!\184\017r\026b\015\146 \212\r\212\003V\018\172\014\b\000\000\000\000\003\152\019@\017\254\000\000\018z\000\000\019$\000\000\000\000\018\006\005z\019T\019\250\000\000\rT\019\130\021\000\000\000\021\"\000\000\000\000\021&\000\000\000\000\000\000\000\000\000\000\000\000\026\190\000\000 \214\023\154\000\000\"\004!\144\000\000\000\000!\236!\004\026\026\000\000\000\000\025\212\"2\142\242\000\000\"Z\025\250\"\168\000\000r\134\000\000\024\242\000\000\019\230\000\000\025N\025\178\b\130\000\000\011.\000\000\000\000\019\192\000\000\020\158\t\194\000\000\0146\000\000\000\000\021\b\147\020\0212\000\000\147\182\021P\000\000\000\000\000\000\014~\000\000\000\000\000\000y|\000\000\000\000\012\178\000\000\000\000\000\000\025\250\000\000W2\000\000\000\000\000\000\000\000\025\250\016,[\138\000\000\"\174\000\000y\206\000\000\026\182!\210\000\000\000\000\000\000!\b\000\000\004>\026\028\000\000!`\025\154\021n\000\000\000\000\000\000\b\160\026\196\000\000\000\000\026\252\000\000\000\000\n\232\000\000\000\000!b\000\000&B\000\000\003j\025\162\000\000\000\000\025\172\000\000\000\000\005\166\000\000\000\000\000\000\022P\000\000\000\000\000\000\000\000\0074!\178\000\000\000\000\019Hd\020\000\000\000\000\000\000\023\252\006\174\000\000\026@\000\000\000\000\000\000\026|\000\000\000\000\n\\\000\000\000\000\000\147!\242\020\224\027\024\n\152!\b\007Z\000\000\000\000\000\000\000\000\027\026\000\000!\016\011n\000\000\"@!\204\000\000\000\000!:\026\184h\154\000\000\000\000\000\000\"\220\000\000z\b\000\000j\156\000\000\"\224\000\000zb\000\000\026\248\000\000!4\000\000\026\018\027\030\011x\000\000\005\238\000\000\n\182!\218\000\000\000\000\026\224\012\024\000\000\000\000\000\000\000\000\000\000\000\000\003\016\000\000\000\000\000\000\000\000zV\000\000\000\000\000\000\000\000\000\000l\\\000\000\"\238\000\000{<\000\000\027L\000\000!@\000\000\027~\000\000!\156\000\000't\000\000\rb\027\184\000\000\000\000\027\220\000\000\000\000\015\254\000\000\000\000\000\000\024~\000\000\000\000\000\000\000\000\016\248!\244\000\000\000\000\027\016{\240\000\000\000\000\000\000\027d\012\\\000\000\027\140\000\000\000\000\000\000\027\142\000\000\000\000\015\022\000\000\000\000\005j\"2\021\014\027z\015\146!H\012\236\000\000\000\000\000\000\027\150\000\000!R\018v\000\000\000\000!x\027Z\000\000#\030\000\000{z\000\000\136\182\000\000#\"\000\000{\182\000\000\027|\000\000!t\000\000\027\228\016\028\000\000\018p\"\026\000\000\000\000\027\154\015\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\178\000\000\000\000\000\000\"nPf\000\000\000\000\000\000\000\000\000\000\000\000\000\000\"\142\000\000\"\176\t\168\000\000\000\000\000\000\r\248\000\000\000\000%\b\000\000\000\000\000\000\014j\000\000\000\000\000\000\026\002\"r\000\000\000\000\000\000\015\172\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015<\000\000\000\000:\246\000\000{\"\000\000\000\000\000\000\000\000|n\000\000\0276|\176\000\000\000\000\000\000|\246\000\00076\"t\000\000\000\000}r\000\000\000\000}\134\000\000\000\000!^}\236\000\000\155\028\011@\000\000\000\000\000\000~|\"\156\0268\000\000\"\134\000\000\"\162\026r\000\000\"\144\000\000\"\178\026\170\000\000!\246 \b\000\000\000\000\000\000\000\000\000\000\155:\000\000\155d\011@\000\000\000\000\000\000\155\180\000\000~$\000\000\000\000\000\000\027`~.\000\000\000\000\000\0007\248\"\166\000\000\000\000\000\000\000\000\127\000\000\000\000\000\000\0008\018\"\172\000\000\000\000\000\000\000\000\000\000F\232\000\000\127D\000\000!\144\127\212\000\000\155\198\000+\000\000\"\204\026\190\127\230\000\000\000\000\000\000\128\026\"\218\026\228\000\000\"\196\000\000\"\224\026\230\000\000\"\202\000\000\"\230\026\232\000\000\150\014\"\240\000\000\128\128\000\000\",\"z\000\000\000\000\"\2148\\\000\000\000\000\000\000\000\000\011@\000\000\000\000\128\194\000\000\000\000\000\000\000\000\000\179\022\020\025\252\026v\000\000\000\000\026\140\027\028\000\000\000\000\029\216\027\226\000\000\000\000\0312\027\228\000\000\031\208\027\232\000\000#\136\027\250\000\000\000\000\000\000\000\0008\222\"\216\015\140\000\000\002\n\000\000\000\000\000\000\016\204\000\000\000\000\000\000#\004\"\144\000\000\017\178\000\000\021\016\000\000\018|\000\000\000\000\002$\025\212\022T\000\000\000\000#\012\"\148\000\000\018\250\000\000\"\246\019b\000\000\026\b\000\000\"\254\019\224\000\000\"\254\020\170\000\0009J\000\000\000\000\028\016# \t\168\138h\028\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002$\000\000\031\194\000\0009|\000\000\000\000\128\250\000\000\000\000\000\000\000\000\000\023\000\000\000\000\000\000\000\000\000\000\000\000\"\246\000\000\000\000\000\000\000\000\000\000 F H\025\250\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\155\246\000\000\156\016\000\000\000\000\000\000\000\000\129>\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\168P\156\000\000\000\000\000\000\000\000\000\000\000\000\015V\000\000\000\000%8\000\000\000\000\000\000\019\030\000\000\000\000\000\000\028\024\"\248\000\000\000\000\000\000\020\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000P\190\000\000\000\000\000\000\156\146\000\000\000\000\000\000\000\000\129\226\000\000\129\244\000\000\000\000\000\000\000\000\000\000\"\250\000\000\000\000\000\000\156.\000+\000\000\000\000\000\000\157\"\000\000\130,\000\000\000\000\000\000\"\166\150Z#$\000\000\021\144\024&\000\000\022\014\000\000\000\000\000\000#6\"\190\000\000\022v\000\000\021`\000\000\022\244\000\000#\"\024(\000\000#J\"\220\000\000\023\190\000\000#B\024\164\000\000\026\140\000\000#F\025\"\000\000#F\025\138\000\0009\224\000\000\000\000\000\000\"\152\"\242\000\000\000\000\027\146\130\168\000\000\000\000\000\000:b#L\000\000\000\000\000\000\000\000\000\000\n>\031\236%\220\t\168\\x\000\000\000\000\000\000\000\000\000\000\000\000\015\246\000\000\000\000%P\000\000\000\000\000\000\020\026\000\000\000\000\000\000\028\028#T\000\000\000\000\000\000\020^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#^\000\000\000\000\000\000\000\000#\014\"\196\"\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000#\018\"\208\"\242\000\000\000\000\000\000\000\000#x\000\000\000\000\000\000\000\000\000\000\000\000\020|\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#&\"\228\"\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000'\178\000\000\027\136*@((\000\000>\192(\238\000\000)\162\000\000)\182\000\000\015,\000\023\000\000\000\000\000\000)\224\000\000*\022\000\000\000\000*\026\000\000\000\000*\156\000\000*\176\000\000*\192\000\000\000\000\000\0006\250)\224*@>\192\017>\000\000\000\000\012\214\020^\000\000\000\000\000\000\015\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0008t\000\000\000\000\tB\012B\000D\000\000#\218\000\000\000\000\000\000\000\000#\224\000\000\000\000\000\000\000\000\028\014\015\146\"\150\023\206\000\000\000\000\000\000\028\164\000\000\"\168\026N\000\000\000\000\000\000\t\168\000\000]\150\000\000\000\000\000\000\000\000\000\000\130\184\000\000\131\030\000\000\000\000\000\000\000\000 F\000\000 H\000\000\000\000\025\250\000\000\140\128\000\000\000\000\000\000\000\000\t\168\000\000a\172\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011@\000+\000+\000\000\001\214\000\000\000\000\000\000\000\000\000\000#T#\018\"\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#`#\030\"\242\000\000\011@:\172#\202\015\140\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\156\188\000+\000\000\000\000#\208\000\000\000\000\000\000\1570\011@\r\206\000\000\000\000\000\000\000\000\000\000\003*\000\000\000\000\000\000::\000\000\000\000\000\000:\242\000\000\000\000\000\000K\210\000\000\000\000\000\000\006\182\026.\026\218\157@\000+#\190\022,\029\020\n\152\"\214\026j\r\198\022n\022\134\000\000\000\000\017<\022~\022\142\000\000\022\150\000\000\022\240\000\000\000\000\022>\018\166\022\132\022\138\000\000\018\178\022\156\024$\000\000\024&\000\000\000\000\024L\000\000\000\000\000\000\000\000\000\000\0298\000\000\"\218\029\000\000\000\028Vq(\000\000\000\000\000\000#\142#J\"\242\000\000\028\130\130$\000\000#\158#\\\"\242\000\000#$\0058\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$\020#4\028(\000\000\028\012\000\000\000\000\131D\000\000\131\218\000\000\000\000\000\000\132f\000\000\024&\157\176\000+'F\t\168\028\156\028:\157\188\000+\132v\000\000\028\212\0198#t\"z\000\000\028\228\000\000\150\142\000\000\132\242#\004\133\002\000\000\157\244\000+$\232\000\000\133\218\000\000\028\186\000\000\017\128\000\000\133f\000\000P\184\000\000\133\174\000\000\000\000\0290\000\000\028\144&$\028\170#\030%b\000\000\000\000(j\000\000\000\000\000\000\134\134\028\184\000\000$2\000\000\028\222\000\000$6\000\000\029,\134\210\029^\000\000\134\244\029\186\000\000$8\000\000\029\218\000\000$:\000\000\029\220\000\000\000\000$R\000\000\029\230\000\000\000\000\017l\029\\\000\000\000\000\029\244\000\000\000\000\018\220\000\000\135^\000\000\1588\000+\000\000\135\150\000\000\000\000\135\198\000\000\000\000\135\254\000\000\136F\000\000\136\138\000\000\000\000\136\206\000\000\000\000\137\022\000\000\000\000\137v\000\000\000\000\137\244\000\000\000\000\138n\000\000\000\000\138\232\000\000\000\000\138\242\000\000\000\000\139^\000\000\000\000\139p\000\000\000\000\139\208\000\000\000\000\139\234\000\000\000\000\140J\000\000\000\000\140\210\000\000\000\000\140\234\000\000\000\000\141v\000\000\141\242\000\000\000\000\000\000\142\002\000\000\000\000\142\012\000\000\000\000\142\202\000\000\000\000\142\250\000\000\000\000\000\000\000\000\000\000\000\000\143|\000\000\000\000\000\000\000\000\000\000\000+\143\196\000\000\000\000\144\004\000\000\028\242\144F\000\000\000\000\144v\000\000;4$T\000\000\000\000\144\214\000\000\000\000\145>\000\000\021\152\000\000\021\158\011\244\000\000\022~\000\000\000\000\000\000\023Z\000\000\000\000\015\216\000\000\000\000\017\226$@\023\184\029B\n\152#V\030\030\000\000\000\000\000\000\029T\000\000#b\"\152\000\000\000\000$p#\138\028~\000\000\024('|\t\168%.\000\000\138:\000\000\029D\000\000\030&\019\024\000\000\000\000\023\146\000\000\024(\016d\000\000\014\226\000\000\000\000\016\002\000\000\000\000\000\000\145P\000\000\000\000\000\000\001\230\000\000\000\000\000\000\000\000\007\160\000\000\000\000\007\172\000\000\000\000\000\000\000\000"), (16, "\005k\005l\000\221\001t\000\223\0011\000\199\001y\002^\007\148\003\149\000J\002`\001z\002\003\015S\001{\000;\004\003\002\156\0007\002\147\005\207\015'\005k\005l\0011\000\199\0071\b\162\000\199\rW\t\215\015&\011\243\011\247\011\004\000\195\000\199\005m\000\204\000\199\005n\005\208\001z\014\158\005\207\001{\002v\001\007\rY\015?\0071\001\155\001\210\rW\015B\015E\003\018\000\207\001]\015%\000\223\005m\b+\b,\005n\005\208\001\247\014\140\001;\001\248\004\158\004_\rY\r\134\003\195\004\004\015\019\001\253\r\137\r\140\b-\003\214\005\171\0007\001\234\001\224\003\019\tz\0013\001;\r[\003\150\003\151\000\189\ra\003\254\re\004O\001\247\003D\002w\001\129\t{\015H\005^\000\212\003\178\000\199\0017\b\165\r\146\tz\001\130\003\133\r[\001\186\001\132\001\133\ra\001\007\re\014\133\001\225\001\248\002\157\007\200\t{\r\143\002\016\000\195\000\199\001\253\001\129\r\147\r\146\000N\001\134\000\199\000\224\002a\t\159\b\166\011\250\001\231\b\171\007\242\n[\001\132\001\217\001\218\002\156\000\207\002\147\b\255\003\215\001\248\004b\r\147\002\017\015K\002\001\t\000\000\183\001\253\t\159\005\172\000\229\001\134\000\199\b\173\t\167\002\021\t\001\002b\004\158\0019\001\144\000\195\000\199\003\182\014\135\002d\003\183\002\172\005\173\001\144\t\216\rp\003\186\011^\001\228\015\"\003\015\001\137\t\167\000B\000\224\0079\001\235\000\205\006>\001\187\006L\rs\t\162\b\244\004\159\004\160\004\161\014\161\004\171\rp\007\241\011^\bg\000\199\006M\004\163\001\139\000\227\rx\0079\n^\002H\006>\005\183\006L\rs\t\162\001\007\002y\002g\014\239\000\199\t\163\001\144\003\149\004\172\005B\001\140\006M\004\180\b\148\003F\rx\000\216\006V\006Y\003\187\001\139\r\158\001$\003\217\001$\016\208\016\209\016%\002\157\t\163\003\216\n\208\t\173\015\012\002h\015\017\000:\001\144\016o\n\221\005\155\006V\006Y\016\210\001\141\016s\016\213\r\150\000\227\001\144\b\247\001\146\002\022\016w\016x\001\229\t\173\t\215\006\\\001\144\001\144\0017\003\218\005_\005\155\003\219\016y\bj\007\028\001z\007\029\r\150\001{\005k\012\001\001\219\001\232\ne\004\249\004\167\001\220\003\216\006\\\001\144\bg\000\199\002\023\002\180\n\175\001\144\003\150\003\151\001\144\n_\014\157\n\176\n\178\012\002\003z\bk\002\016\0009\br\n\181\n\182\003\178\000\199\b\180\012\003\005k\012\001\bs\005m\ne\b\221\005n\n\183\001\191\0020\016\142\016\144\011\004\n\227\016\156\n\175\004\247\001\192\bt\003\209\007\241\002\017\n\176\n\178\012\002\007\030\016\157\014\246\000J\001\144\n\181\n\182\n\228\001\144\002\021\012\003\n\208\rj\011r\005m\011w\b\248\005n\n\183\n\221\002\016\004\248\004\005\b\181\005\197\001\129\002V\000\220\004\176\000>\002W\007\241\bj\003\248\001$\n\204\n\248\011\004\014\155\011\n\001\132\001\217\005z\001\131\003\182\001\144\000\186\003\183\n\240\001z\002\017\011\011\001{\003\186\001]\007-\000\223\b\025\004\177\004\166\001\134\000\199\r\160\002\021\bk\007\162\011\168\br\0072\000A\007\029\n\204\n\248\011\004\0063\011\n\bu\000\226\016\197\t\216\t\176\003\195\t\161\n\224\015$\n\225\t[\011\011\004\185\005\171\004\249\003\223\bt\005\220\016\198\016\200\011\169\011\171\015\\\011\173\011\174\004\210\n\227\000\195\000\199\t\\\007\163\005\221\003,\001\007\0063\001\011\002W\003\187\003-\002?\016\216\003.\001y\002\026\r\161\n\228\001\145\t`\001z\000\201\t\140\001{\011]\tb\011^\004\211\002\211\te\011\243\011\247\011\004\005\230\005\231\001\129\016\201\006>\001\139\006L\011g\011i\t\187\011\175\011\184\011\004\001\144\011\196\003\216\002\023\001\132\001\133\t\141\006M\001\144\007\242\003\216\014\216\n\240\011\197\011]\000\228\011^\001\144\004\005\014\159\001\r\002j\005\172\002\030\001\134\000\199\t\162\006>\016\202\006L\011g\011i\000\183\000\195\000\199\011\019\011\154\006V\006Y\007-\011j\005\173\000\224\006M\003\127\011\162\001\144\001\219\003\128\007\242\004\212\002[\005{\004\250\0030\000\207\t\163\002\023\004\b\003`\005\155\003W\005k\012\001\001\129\014\217\ne\b\220\011\024\0033\0034\002W\b\147\006V\006Y\002k\011j\n\175\011k\001\132\001\133\001\137\005\183\t\165\n\176\n\178\012\002\005k\012\001\002\233\000\199\ne\n\181\n\182\011\250\b\148\005\155\012\003\b\220\001\134\000\199\005m\n\175\b\220\005n\n\183\001\139\011\251\015^\n\176\n\178\012\002\005k\012\001\011k\0050\ne\n\181\n\182\000\242\011\165\004\199\012\003\000\227\b\178\014l\005m\n\175\001\144\005n\n\183\b\162\000\199\002Z\n\176\n\178\012\002\002^\001\144\b+\b,\002`\n\181\n\182\000\227\001z\0035\012\003\b\162\000\199\r\194\005m\011\252\001\225\005n\n\183\001\137\011\029\n\204\n\248\011\004\001\141\011\n\004\213\015\177\001$\003a\011\253\001\146\000\195\000\199\0037\b+\b,\011\011\012\b\004O\b\197\004\136\001\144\002\146\001\139\002\147\n\204\n\248\011\004\001\206\011\n\014\203\b\180\011\027\006\201\003>\014\219\001\007\014\232\014\213\0063\002H\011\011\b\198\001\144\001\147\002m\004O\002z\002g\000Q\n\204\n\248\011\004\001\144\011\n\b\165\001\144\b\162\000\199\001@\001$\003\132\011\166\001\230\0063\002q\011\011\003p\0039\001\144\014\214\b\216\b\165\001\144\000]\003<\001\144\005=\001\141\001\144\002h\b\183\b\189\001\144\002_\001\146\n\236\b\166\012\199\0063\b\171\005@\001\207\011]\002\161\011^\005>\0017\001A\b\231\001B\001E\004\199\001\144\b\166\004b\006>\b\171\006L\011g\011i\004\203\002c\t\155\003q\b\173\b\172\014\233\011]\002r\011^\000\185\006M\005k\005l\000W\000W\012d\012h\011\004\012\200\006>\b\173\006L\011g\011i\b\218\004O\003`\b\165\003W\015\178\002\151\011]\002\147\011^\002b\006M\011\159\001\144\000W\011\"\006V\006Y\002d\011j\006>\001\229\006L\011g\011i\001\144\005m\002\171\004\029\005n\0158\000\254\000\199\003\150\003\151\b\166\006M\011\162\b\171\005\155\000\183\006V\006Y\007\242\011j\000\255\b\220\b\174\003\178\000\199\b\223\b\224\b\234\b\228\001\144\005k\012\001\011k\001F\ne\004b\003\217\001$\b\173\005\155\016%\006V\006Y\007\242\011j\n\175\b\220\b\220\011\162\0011\000\199\016o\n\176\n\178\012\002\016p\016q\011k\016s\016u\n\181\n\182\001z\000\251\005\155\012\003\016w\016x\001\002\005m\015\179\b\220\005n\n\183\004z\003\218\012k\015\029\003\219\016y\002\144\002H\011k\001_\003a\t\157\004z\011\167\002t\002g\000Z\000h\n \012\006\b+\b,\003\182\0063\002\173\001\144\003\223\002\149\003\228\001\209\002\159\003\186\004{\004|\004}\002\153\004\145\002\147\011,\006\242\001;\000r\003\229\004\127\004{\004|\004}\002h\005(\011\242\001\144\014{\n\204\n\248\011\004\004\127\011\n\001\225\016\142\016\144\011\004\tz\016\156\004\146\004\179\0011\000\199\005\003\011\011\003\140\011\189\001\144\003\230\003\233\016\157\001\144\t\172\b\198\002\221\003\217\001$\016\212\001\144\016%\t\161\003\217\001$\016\215\000\183\016%\006>\0063\006L\001\207\016o\003\216\005C\005\197\002\211\016\210\016o\016s\016\213\001\145\001\144\016\210\006M\016s\016\213\016w\016x\002\154\n!\011\166\t\159\016w\016x\002T\003\218\007\242\b\244\003\219\016y\001\015\003\218\001\233\000W\003\219\016y\007r\001;\003\195\002\152\014\248\004\131\002\169\006V\006Y\000\183\005\171\001\144\011\193\n\"\002\174\000\199\011]\004\131\011^\001z\011\166\005\011\016\197\002\163\t\176\002\156\011\178\002\147\002\232\006>\005\155\006L\011g\011i\001\"\003\223\001\007\005\220\016\198\016\200\n$\002R\b\218\001\144\n[\006M\016\142\016\144\011\004\t\162\016\156\005\221\016\142\016\144\011\004\001\144\016\156\011?\r\199\000\249\001\216\016\205\016\157\b\147\001\144\b\249\002\016\001\144\016\157\011\179\004O\001\134\000\199\001(\001\144\006V\006Y\005D\011j\t\163\t\223\005\230\005\231\006\181\016\201\005\197\b\148\003\195\004\150\r\202\001\229\005\197\b\219\005\172\001\144\005\171\002\017\0017\005\155\t\224\004\150\011\221\r\197\011\168\003\216\b\220\t\173\001\144\n\247\002\021\0020\001\144\005\173\011\194\b\220\b\178\011k\t\228\004\151\004\130\n`\b\220\016\202\t\230\001\207\003\149\003\128\t\233\002\166\004Z\005\029\004\130\002\157\011\169\011\171\r\198\011\173\011\174\007\167\016\197\n1\t\176\004\249\0052\0012\016\197\n\253\t\176\004\251\002R\002\233\000\199\003\223\005\183\005\220\016\198\016\200\001\144\003\223\002}\005\220\016\198\016\200\004\016\006\250\b\248\006\183\006\184\005\221\003\231\n\232\012\127\005k\005l\005\221\b\244\ne\016\216\005\172\007\163\b\180\006\220\000\199\016\216\011\175\011\184\011\004\n\175\011\196\001\144\011\148\011\204\002\016\001\144\n\176\n\178\015X\005\173\005\230\005\231\011\197\016\201\n\181\n\182\005\230\005\231\001\026\016\201\003\150\003\151\001\144\005m\012x\012y\005n\n\183\002\161\014\228\011\001\002'\n_\003\216\002\017\003\178\000\199\b\197\014q\003\216\001\144\000W\b\183\b\184\b\232\b\187\001\144\002\021\005k\005l\005\183\016\202\ne\002F\003\232\012z\004\129\016\202\004!\002\161\b\198\011R\0018\n\175\001\144\002\023\006\224\b\028\002\217\006\225\n\176\n\178\015W\005k\005l\006\228\011\151\011U\n\181\n\182\n\204\n\248\011\004\014\229\011\n\001\172\001\174\005m\001\144\b\216\005n\n\183\n\253\004'\r\238\n\176\011\011\002\168\004\007\005k\005l\003\244\r\163\ne\001\144\0071\011\251\001M\003\182\003\131\003\133\003\183\005m\004'\n\175\005n\n\183\003\186\003\195\0063\003\196\n\176\n\178\r\200\001\144\002\155\005\171\002\147\002\165\n\181\n\182\011\002\002R\0073\0076\006\229\003T\001\007\005m\003\203\002U\005n\n\183\002{\n\204\n\248\011\004\n\253\011\n\005\169\r\165\011\252\0071\001\144\b\218\002U\005\170\002)\002\\\004\224\011\011\b\248\001\175\001\176\011\003\001N\011\253\000\239\001\144\011V\011X\011\004\001\177\011]\007\241\011^\011\152\003\187\001\144\003Y\007\131\007\134\002\177\0063\004\158\004O\006>\003\174\006L\011g\011i\002\023\015Z\002\016\001\144\n\204\n\248\011\004\003\205\011\n\001#\001$\006M\003\156\b\223\b\230\014\203\001\184\0063\005\172\003\216\011\011\003\156\014\231\014\213\001\189\004\159\004\160\004\161\011Z\004\171\005k\005l\002\017\011\189\001\144\b\220\004\163\005\173\003\134\000\199\001\194\006V\006Y\0063\011j\002\021\011]\004z\011^\0151\003^\014C\002\161\004b\001\t\014\214\004\172\005T\001\144\006>\004\180\006L\011g\011i\005\155\011?\r\178\001\144\003\156\005m\004\130\b\220\005n\015\031\011\002\006M\003\159\007j\005\183\004{\004|\004}\011k\004~\006>\0079\006L\011[\011m\001T\004\127\002\211\t\254\003\\\005k\005l\011\246\011]\ne\011^\006M\001W\001\144\011\148\011\195\006V\006Y\n+\011j\n\175\006>\001\144\006L\011g\011i\n \n\176\n\178\011p\005k\005l\002\167\001\144\ne\n\181\n\182\006M\004\167\005\155\011\002\006V\006Y\0079\005m\n\175\b\220\005n\n\183\n[\011\179\004z\n\176\n\178\n\180\014D\n\030\011k\001\144\0040\n\181\n\182\005[\002R\005\155\001\144\002+\006V\006Y\005m\011j\001y\005n\n\183\001\017\003\175\0063\001z\n\205\002\156\001{\002\147\011k\004{\004|\004}\011\148\004\145\011\153\n\247\005\155\001Z\004\131\002\016\004\127\007\242\000J\b\220\005Z\001m\002\023\n\204\n\248\011\004\003\195\011\n\005\164\003V\011k\003W\001\144\001\007\005\171\004\022\004\146\004\179\011\194\011\011\005\031\n\206\n!\004\176\003\223\002\017\014h\011T\n\204\n\248\011\004\001\144\011\n\005k\005l\014\223\0041\ne\002\021\001\028\014i\003\195\0063\005\181\011\011\006>\007k\006L\n\175\005\171\016\149\005\000\n\"\004\177\004\166\n\176\n\178\011o\000J\001p\n\247\006M\011\240\n\181\n\182\001\197\001\174\0063\011\189\001\129\014j\014k\005m\r$\004\024\005n\n\183\004\150\001o\n,\001\130\t[\001\144\004\185\001\132\001\133\004\165\004\131\002\157\014\224\011\152\006V\006Y\003\216\001\144\002\161\011]\005\172\011^\001\007\t\\\005\145\0128\005%\001\134\000\199\007\242\005\029\004\130\006>\006\253\006L\011g\011i\005\155\002\250\005\173\001\144\t`\005\155\005\153\011]\016\153\011^\tb\006M\004\015\n_\t\202\n\204\n\248\011\004\005\172\011\n\006>\003e\006L\011g\011i\011\249\001\161\td\001\175\001\176\b\250\011\011\r'\011\212\0022\001\144\006M\005\173\001\177\007\172\001\144\006V\006Y\005\183\011j\014\204\005\147\001\137\011\152\014\206\002\170\004'\003\006\001\174\0063\007\242\004\150\001\007\003`\012<\003W\005k\005l\001\144\005\155\ne\006V\006Y\002\023\011j\003\022\b\220\001\139\001\184\001|\003[\n\175\003W\005\183\005\154\007\163\001\189\011k\n\176\n\178\015V\004\151\004\130\b\197\005\155\003o\n\181\n\182\001\147\002J\007j\b\220\001\199\014\203\004\158\005m\002M\001\144\005n\n\183\014\226\014\213\011k\011]\016\154\011^\b\198\011&\005k\005l\003|\004\251\ne\0017\012\029\001\144\006>\004\240\006L\011g\011i\011\194\001\141\n\175\001\175\001\176\001\128\001\144\005^\001\146\n\176\011\\\006M\014\214\001\177\b\216\001\144\007\242\n\181\n\182\bg\000\199\001\144\004O\005k\005l\001\150\005m\ne\001\144\005n\n\183\n\204\n\248\011\004\012=\011\n\003z\001z\n\175\003a\001{\006V\006Y\015w\011j\n\176\011h\011\011\001\184\011\031\011\022\004\166\014\207\n\181\n\182\003]\001\189\003W\003_\007z\003W\001\144\005m\007}\005\155\005n\n\183\002\016\012 \004E\0063\b\220\003\b\003\217\001$\011\021\011\022\016%\001\144\b\218\003e\004b\011k\n\204\n\248\011\004\014\208\011\n\016o\001\144\b+\b,\0011\000\199\014\210\016s\016\196\002\017\012G\011\011\001\144\bj\005\022\016w\016x\b?\001\007\004\193\011)\005\155\002\021\bC\003\218\003\170\000\199\003\219\016y\001\144\004'\n\204\n\248\011\004\0063\011\n\011]\ta\011^\001\129\004O\b\223\b\224\b\225\b\228\bk\t\179\011\011\br\006>\001\145\006L\011g\011i\001\132\001\217\001\221\b\212\003\156\rM\rN\003l\003z\b\220\001\144\006M\b+\b,\012\139\001;\0063\001\144\006W\bt\001\134\000\199\012\215\015\129\004\195\0017\012!\016\142\016\144\011\004\011 \016\156\003q\nX\011]\003}\011^\001\144\004\200\bg\000\199\006V\006Y\016\157\011j\004b\001\159\006>\000J\006L\011g\011i\0032\005\135\004\193\014\204\005\155\007\242\003-\014\206\0071\003.\003\137\006M\005\155\t\184\005\197\001\144\012\254\0128\011]\b\220\011^\011/\001\144\003\217\001$\003e\0024\016%\014\179\001\144\011k\006>\001\144\006L\011g\011i\012\156\012\159\016o\006X\012\147\006V\006Y\012\217\011j\016s\016\199\006M\001\144\001y\001\139\bD\001\144\016w\016x\001z\002\016\007\012\001{\011\168\002\023\004\195\003\218\001\157\005\155\003\219\016y\005j\016\197\bj\t\176\b\220\0128\0011\000\199\004\220\t\179\006V\006Y\t[\011j\003\223\011k\005\220\016\198\016\200\002\017\001\188\012>\011\169\011\171\011\254\011\173\011\174\003i\001\193\0030\005\221\t\\\002\021\005\155\bk\b?\004\193\br\001\219\001\144\b\220\bF\t\215\001\220\0033\0034\b\238\016\149\003\156\t`\007\016\011k\016\142\016\144\011\004\tb\016\156\005k\005l\t\191\005\230\005\231\bt\016\201\002\233\000\199\012\029\007\237\016\157\014\209\r\211\001;\td\011\175\011\184\011\004\012j\011\196\001\129\005\207\003\149\012\029\t\183\003\216\001@\001$\0011\000\199\rW\011\255\001\144\005\197\014\194\001\132\001\133\004\195\005m\004\158\000J\005n\005\208\016\202\004h\014\208\002R\011\168\001\144\rY\rZ\004\237\000J\014\210\0079\001\134\000\199\r\182\001\144\016\149\007\252\016\155\004\158\0035\012=\001A\001\144\001B\001E\001\144\005\155\004\159\004\160\004\161\b\019\005\014\001\203\011\169\011\171\r\196\011\173\011\174\004\163\012\"\0027\000\195\000\199\016\197\0037\t\176\004\158\r[\014Q\001;\003e\ra\005^\re\012c\0110\003\223\004k\005\220\016\198\016\200\003\150\003\151\006\207\004q\003\254\003e\rf\001\137\001\144\005k\005l\005\221\001\144\002\023\012=\003\178\000\199\003\244\005\214\005^\011\251\b\020\004\193\011\175\011\184\011\004\016\194\011\196\007\255\0063\t[\005\207\001\139\003\217\001$\t\229\007\241\016\189\0039\011\197\rW\005\230\005\231\003c\016\201\003<\012-\001\205\005m\t\\\001\144\005n\005\208\001\147\012\000\016s\001F\016\154\003k\rY\r`\005s\015|\014\179\003\216\011\252\005\216\t`\004\167\001\144\003g\001\144\003\218\tb\003n\003\219\016y\tt\012!\002\016\011\253\004\195\016\202\rp\001\144\011^\016\027\001\141\003\182\012.\td\003\183\001\144\012!\001\146\005\018\006>\003\186\006L\rs\014\146\r[\003\160\007\241\012#\ra\001\214\re\003\216\002\017\005k\005l\006M\0111\000\199\001\215\rx\006\189\000\195\000\199\001\144\rf\002\021\003\223\b\147\003\228\003\156\016\154\n\247\016\190\016\192\011\004\005\207\011\251\012$\012&\r\179\012(\012)\003\229\006\211\rW\006V\006Y\0063\t\179\004\249\b\148\003m\005m\n\249\004\176\005n\005\208\000\183\001\144\005H\003\187\011\026\011\022\rY\rd\016\030\011$\001\243\005\155\rM\rN\005\197\003\230\003\233\001\144\r{\005k\005l\003j\b\178\000J\011\252\b/\t\r\004\231\004\166\006\\\015\127\012*\0123\011\004\bP\012?\006\174\n\206\003\216\011\253\014\201\005\207\003\011\001\174\rp\007\177\011^\012@\r[\000\183\rW\001\144\ra\015\229\re\001\144\n\211\006>\005m\006L\rs\005n\005\208\003`\t\182\003W\011\028\011\022\rf\rY\ro\005k\005l\006M\001\144\001\144\n\247\rx\002:\011.\012g\003\223\001\144\005\220\016\195\016\204\007\163\b\180\n\208\015\134\r\173\0063\n\218\005\207\r\175\015\138\n\221\005\221\001\144\003\173\000\199\t\014\rW\006V\006Y\b \t[\b:\016\031\002R\005m\r[\002\023\005n\005\208\ra\016\027\re\n\222\001\175\001\176\rY\rr\012.\002R\t\\\005\155\005\230\005\231\001\177\001\007\rf\007\242\r{\005k\005l\004\249\b\183\b\184\b\185\b\187\012l\005i\t`\006\\\rp\016\027\011^\n\252\tb\003\216\011\030\011\022\tc\0063\bQ\005\207\001\144\006>\001\144\006L\rs\n\247\r[\001\184\rW\td\ra\016\202\re\003a\001\144\001\189\005m\006M\001\144\005n\005\208\rx\n\227\011\182\000J\011\183\rf\rY\rw\012m\0071\003\r\n\206\015\209\0017\016 \rM\rN\001\242\b+\b,\n\228\rM\rN\012n\001#\001$\006V\006Y\0063\011\000\rp\001z\011^\015\144\001{\b\220\011\020\r\228\r\231\015\141\b\239\001\210\004f\006>\016\188\006L\rs\0071\r[\005\155\n\247\012N\ra\001\144\re\001\144\r{\005k\005l\006M\005v\n\240\b\240\rx\0150\000J\014C\006\\\rf\005\192\n\206\b$\011W\001\234\001\224\014b\014e\001\144\001\007\005\207\r\219\011$\rp\001\144\011^\015\211\t[\000J\rW\006V\006Y\0063\b+\b,\007\242\006>\005m\006L\rs\005n\005\208\011\205\b+\b,\001\144\t\\\t\127\rY\rz\n\247\011\025\006M\005\155\n\206\016\031\rx\003\156\001\144\007\202\r{\011#\001\129\003\156\t`\0110\b+\b,\001\007\006\216\tb\006\\\003\128\001\231\te\001\144\004f\001\132\001\217\001\218\0017\001\144\006V\006Y\011'\016\031\rp\td\011^\t[\r[\bx\011+\n\247\ra\003\156\re\001\134\000\199\006>\014D\006L\rs\006\203\006\209\005\155\004f\002\016\t\\\012#\rf\t[\r{\003\217\001$\006M\b+\b,\004h\rx\007\192\0079\0041\006\\\011Y\b\241\t`\006\188\003#\0017\t\\\007\242\tb\0063\011N\005\131\ti\002\017\001\240\012$\012&\012o\012(\012)\014\016\006V\006Y\014Y\t`\td\002\021\004\249\003\218\011$\tb\003\219\005\132\011a\tn\0079\004f\011\206\000\199\014\018\0144\n\206\001\241\003\223\005\155\014h\011$\td\011$\006\215\006\209\r{\003\217\001$\011a\001\139\005,\rb\007\r\014i\012H\000\199\006\\\rp\001\144\011^\012*\0123\011\004\011a\012?\005\127\014\144\006\181\005\131\006\181\006>\002\016\006L\rs\n\247\014\020\012@\014\016\002\173\014\026\004f\re\by\014j\014k\003\218\006M\001\249\003\219\005\132\rx\014\027\r~\011(\011\168\014\030\014\018\014\019\003\217\001$\011f\002\017\b\162\000\199\001\219\001\232\003\216\006\217\001\144\001\220\011*\004f\011-\014\205\002\021\007\236\006V\006Y\005\197\016\143\005\131\011e\016\145\002\004\011\169\011\171\011\172\011\173\011\174\014\016\002<\n\247\r~\002\012\b'\004f\011d\003\218\014\020\005\155\003\219\005\132\014\026\004p\re\004h\r{\004\249\014\018\014\025\006\183\006\184\006\183\006\184\012r\012t\r\177\006\\\014\030\004h\r~\003\217\001$\r~\002\023\006\220\000\199\006\220\000\199\007\244\012l\n\247\014&\004\140\t\176\011\175\011\184\011\004\b\250\011\196\002\020\005\197\015\136\005\131\b\165\003\223\007\195\005\220\014)\001\144\014\020\011\197\014\016\001\144\014\026\007\242\re\015\148\000\199\n\247\003\218\005\221\n\247\003\219\005\132\014.\001\144\t\004\001\144\007\019\014\030\014\018\014\029\b:\001\144\012m\b\166\015y\015z\b\171\015\136\015~\015z\007\031\002>\015\128\015z\004\207\011\142\001\144\012n\005\230\005\231\005\197\016\148\014&\001z\t\176\006\224\001{\006\224\006\225\b\220\006\225\b\173\007\242\001\210\006\228\003\223\006\228\005\220\014)\015\146\014\020\003\216\b\221\n\012\014\026\002\023\re\b*\0141\003\217\001$\005\221\rM\rN\002#\014.\tK\015\130\015z\005\234\014\030\004h\r~\011\205\004\228\001\237\001\224\003\195\b\001\005\184\rO\005\131\011\251\n\r\014&\005\171\t\176\015\143\n\211\000J\014\016\005\230\005\231\005\197\rM\rN\007\242\003\223\003\218\005\220\014)\003\219\005\132\004h\006\229\004\244\006\229\rM\rN\014\018\014%\n\247\ri\005\221\003\216\rM\rN\014.\rM\rN\n\208\0141\n\212\001\129\n\218\015x\n\219\011\252\n\221\005\026\rM\rN\005\234\015}\001\231\007&\015\135\tY\001\132\001\217\001\218\016\152\011\253\005\230\005\231\001\144\b\250\014&\015\139\t\176\n\222\014\020\011\031\011\022\001\144\014\026\004h\re\001\134\000\199\003\223\b\150\005\220\014)\002N\b:\003\216\007<\005\172\016\191\012#\014\030\t[\0141\003\217\001$\005\221\004h\011\031\011\022\014.\001\144\r~\001\144\005\234\001\144\t\004\005\173\nW\001\144\004h\t\\\016\165\000\199\005\197\000J\005\131\000J\t\"\t\129\012$\012&\012'\012(\012)\014\016\005\230\005\231\007\242\t`\r~\n\227\011\182\003\218\011\185\tb\003\219\005\132\b\220\ts\007J\n\247\015\136\015\136\014\018\014(\b\200\n\003\005\183\003\216\n\228\003\195\td\005\201\001\144\t\142\0141\003\217\001$\005\171\001\139\007g\015\136\000W\016\193\t\221\nZ\005\234\014&\n\247\t\176\012*\0123\011\004\007\216\012?\b\250\b+\b,\005\131\000W\003\223\tN\005\220\014)\b\243\014\020\012@\014\016\t\004\014\026\n\240\re\t/\011L\011 \003\218\005\221\t[\003\219\005\132\014.\by\b+\b,\r~\014\030\014\018\014-\003\217\001$\tZ\015\140\015\142\n\026\001\219\001\232\t\\\011\154\t\158\001\220\011 \t\014\011\154\001\131\t4\b:\005\230\005\231\005\197\001z\005\131\015\145\001{\t0\t`\007\200\007\200\0117\001\144\014\016\tb\005\172\tX\n\247\t\136\b\020\t9\003\218\014\020\003\216\003\219\005\132\014\026\t\142\re\t>\0141\td\014\018\0140\005\173\002]\t\223\014\238\001\144\t0\bQ\005\234\014\030\n\014\t\004\005k\005l\011\154\t\004\t\153\002G\001y\011\138\t\004\012l\t\224\014&\001z\t\176\t\156\001{\t0\t\220\n7\n\025\005\197\n\014\005\207\000W\003\223\t0\005\220\014)\t\228\014\020\005\183\rW\n\027\014\026\t\230\re\001\144\001\144\t\248\005m\005\221\t\004\005n\005\208\014.\007\163\t\164\t\222\001\129\014\030\rt\t\232\002\016\011\015\012m\007\163\001\144\004h\t\004\002@\t0\011B\n\029\001\132\001\133\n]\003\217\001$\b\246\012n\005\230\005\231\005\197\t0\014&\n\028\t\176\t\004\003\195\t\004\0067\b\220\002\017\001\134\000\199\n#\005\171\003\223\005\131\005\220\014)\011\138\r[\003\216\015m\002\021\ra\014\016\re\0114\0141\n<\001\129\005\221\002Y\003\218\t\223\014.\003\219\005\132\002s\005\234\rf\002A\n\244\n\246\014*\001\132\001\133\011\138\n\216\n\201\n\244\n\245\002\016\t\224\014&\n\217\t\176\005k\005l\011?\011@\005\230\005\231\0063\011\138\001\134\000\199\003\223\001\137\005\220\014)\t\228\011\201\011\209\011\031\011\022\011\132\t\230\011\182\005\207\011\188\t\231\002\017\005\221\003\216\012\150\014\020\014.\015\131\015z\014\026\0141\re\001\139\t\232\002\021\005m\005\172\002x\005n\005\208\002\128\005\234\011S\011\143\015n\014\030\007\200\011\182\011\234\011\192\n@\012\021\005\230\005\231\nR\005\173\rp\004\212\011^\nF\012D\001\137\005k\005l\003,\011\144\002\145\011\133\005\197\006>\003-\006L\002\130\003.\012K\003\216\011Q\011\221\011\222\004'\012\021\003z\0141\011\161\005\207\006M\001\139\001\141\011\164\ru\012\017\007\242\nI\005\234\001\146\005\000\005\183\011\182\012\021\011\248\011\133\005m\012\021\002H\005n\005\208\002\023\001\147\002e\nM\002f\002g\001#\001$\012^\006V\006Y\014\195\b+\b,\012\204\0121\014&\0122\t\176\005k\005l\002R\nQ\011\145\nV\0063\rM\rN\014\235\003\223\011 \005\220\005\155\011\241\004\212\001\141\b\020\002h\002\132\r{\001\144\005\207\001\146\012\209\015\132\005\221\015(\003\156\014C\014+\006\\\006<\011?\012R\0030\002\211\012\200\0121\005m\0124\b\020\005n\005\208\004\158\r;\014\196\002R\002R\004h\0033\0034\012\214\002\023\014\245\001\144\005\230\005\231\0121\0121\0127\012;\r\015\005k\005l\0121\012\200\012i\015\147\001\144\002\233\000\199\0063\006>\003\156\006L\004\159\004\160\004\161\003\216\004\171\r\020\r\025\r\030\014\242\005\207\0141\004\163\011\147\006M\006\237\007\141\012\189\006\176\012\200\015\203\003z\005\234\006<\002\211\002\150\n\208\005m\011y\r\016\005n\005\208\004\172\004\179\n\221\002R\004\180\015\156\012\244\004\212\004\212\011\150\004\212\007\241\006V\006Y\002\160\014D\r\016\r\016\r\016\004\212\0035\r>\r\131\r\133\r\131\r\132\011\239\015\165\0063\011\221\015\184\014B\006>\015s\006L\005\155\015\238\001y\005k\005l\015\202\015\227\006Z\001z\015\242\0037\001{\002\164\006M\006\237\015-\015\151\006\176\006\\\006<\002\211\016\161\015\242\015\238\r\222\005\207\014\\\014\203\003z\015\242\016\168\003>\014\211\015\208\014\212\014\213\004\167\011\221\016\176\b\162\000\199\015\213\005m\006V\006Y\005n\005\208\003\223\015\242\014h\n\227\n\208\004\233\n\209\012\026\002\255\0063\002\179\011\133\n\221\006>\001z\006L\014i\001{\0039\005\155\014\214\002\182\n\228\001\144\001\210\003<\006Z\002\183\016\185\006M\006\237\r\248\004'\006\176\004'\006<\012\028\006\\\rB\rF\015\242\rI\005k\005l\015\131\015z\014j\014k\002\187\002\213\rL\001\129\015\238\007\242\012\031\002\211\002R\001\211\012b\006V\006Y\003\156\001\130\n\240\005\207\015\242\001\132\001\133\002\244\003\216\002\247\n\208\004\176\n\239\b\165\007\242\006>\015\238\006L\n\221\011\133\005m\005\155\002\252\005n\005\208\002\b\000\199\007\242\006Z\003\016\0063\006M\006\237\015\025\n\227\006\176\003C\003\027\002\016\006\\\001y\004\177\004\166\001\129\007\241\b\166\001z\000\207\b\171\001{\015\242\002R\002\t\n\228\001\212\007\242\006<\b\255\001\132\001\217\001\218\006V\006Y\007\242\016\139\t\003\015\242\015\242\002\017\002R\003\025\004\185\015\242\b\173\002R\003\029\t\001\003 \001\134\000\199\005\000\002\021\001\137\002R\005\155\016\023\003*\003/\rM\rN\003A\006Z\003U\002\006\n\240\003Z\003d\006>\015\249\006L\003h\n\227\006\\\003w\003~\015\252\015\132\001\139\003\130\003\139\003\143\003\162\001\131\006M\006\237\r\207\0063\006\176\001z\003\164\n\228\001{\003\171\003\149\016\000\003\177\015\131\015z\001\147\002\r\003\181\003\206\003\213\003\001\003\234\000W\001\129\005k\005l\004\002\004\012\004\025\006<\006V\006Y\004$\004#\001\130\004+\015\154\001\144\001\132\001\133\0048\r0\004A\004]\004d\003\253\005\207\001\139\n\240\001\141\016\018\016\024\002l\005\155\001\144\004o\001\146\004w\002\b\000\199\006Z\005k\005l\005m\004y\004\155\005n\005\208\004\157\004\190\006>\006\\\006L\016\026\004\197\016\006\004\216\004\234\002\135\005\002\000\207\005\012\005&\005\207\005+\002\t\006M\006\237\012\218\005X\006\176\bg\000\199\003\150\003\151\001\129\005\\\003\254\002\016\005|\005m\005\148\001\219\005n\005\208\t\223\005\152\001\220\003\178\000\199\001\132\001\133\002\023\007T\012\131\001\137\006V\006Y\rM\rN\005\188\016\t\0060\005\000\t\224\005k\005l\n\208\002\017\n\241\001\134\000\199\005\218\005k\005l\n\221\015\132\016\r\016\017\005\155\001\139\002\021\t\228\016\022\006/\001y\006Z\005\207\t\230\016\029\006\236\001z\t\233\006C\001{\005\207\006\171\006\\\006\235\0063\002\211\001\147\002\r\006\191\005m\t\232\002\014\005n\005\208\006\193\006\213\006\219\005m\bj\016\187\005n\005\208\002\016\006\223\016\164\001\144\003\182\006\234\006\254\003\183\006<\007\007\001\137\003\217\001$\003\186\007\022\007\018\007\027\007*\001\141\0063\007\"\002\006\007)\001\144\007%\001\146\007,\0070\bk\007/\002\017\br\007;\005\131\007B\001\139\007?\007A\007D\007S\t\195\n\227\007I\002\021\007P\006<\007M\005\000\t\196\006>\003\218\006L\001y\003\219\005\132\002\211\bt\007O\001z\t\199\n\228\001{\007R\007c\001\129\006M\006\237\012\135\007~\006\176\007\150\007\159\007\166\003\187\002\138\001\130\007\169\007\171\007\174\001\132\001\133\003\217\001$\0063\007\176\007\182\006>\007\181\006L\007\214\001\141\0063\007\224\007\228\007\231\006V\006Y\001\146\007\249\001\134\000\199\n\240\006M\006\237\007n\002\255\006\176\007\253\002\023\006<\007\254\b\b\000W\b\r\b\018\bI\bB\006<\005\155\bA\003\218\bG\bM\003\219\015#\006Z\002\t\bO\bV\bZ\bg\000\199\006V\006Y\ba\bq\006\\\000W\bn\b\127\b\132\b\177\b\152\003\217\001$\b\157\005\197\b\170\001\129\b\182\006>\b\215\006L\002\140\b\202\005\155\001\137\b\207\006>\001\130\006L\r\155\006Z\001\132\001\133\005\131\006M\006\237\006\238\b\222\006\176\n6\015O\006\\\006M\006\237\014M\t\b\006\176\005k\005l\001\139\003\218\001\134\000\199\003\219\005\132\002\023\t\021\t\025\t#\t,\t3\000W\t6\t\223\006V\006Y\t8\t;\t=\005\207\001\147\002\r\006V\006Y\tA\002\014\tV\tk\002\t\tp\bj\003\223\t\224\005\220\005\197\tw\005m\005\155\t\223\005n\005\208\t\130\t\135\t\137\006Z\005\155\t\150\005\221\r-\015Q\t\228\005\223\006Z\t\166\001\141\006\\\t\230\t\224\001\137\001\144\t\237\001\146\bk\006\\\t\170\br\t\218\t\239\t\244\005k\005l\t\251\n\007\t\232\t\195\t\228\n\t\005\230\005\231\n\022\n%\t\230\t\201\001\139\n)\t\242\n>\nB\nK\nO\bt\005\207\nT\t\199\t\223\n\197\005\197\n\226\t\232\n\229\003\216\003\223\n\237\005\220\001\147\002\r\t\254\005\232\005m\003\001\011\r\005n\005\208\t\224\011\017\0116\0119\005\221\005\234\011:\011=\t\255\n\000\011>\011C\011H\001#\001$\011~\n\001\011\131\t\228\0063\011\135\011\140\011\156\011\177\t\230\001\141\011\199\011\203\t\247\004\158\001\144\011\211\001\146\011\214\005\230\005\231\011\215\011\218\011\224\000W\011\230\t\232\011\236\011\245\r\156\006<\n\030\012\r\012\019\004\158\003\223\012\023\005\220\014\148\b?\014C\012,\003\216\012B\012F\bC\004\159\004\160\004\161\012M\004\162\005\221\r\157\012Q\000W\005\223\012T\004\163\012Z\012`\012f\n&\012}\012\132\012\151\012\185\004\159\004\160\004\161\012\194\004\171\006>\012\203\006L\012\206\012\208\0063\004\163\n-\012\211\t\176\005\230\005\231\012\213\n\208\012\216\011F\006M\006\237\006\245\012\242\006\176\n\221\012\252\r\006\n!\r\012\004\172\005T\015\131\015z\004\180\006<\r\019\003\216\r\022\r\024\t\223\r\027\r\029\r!\005\232\r%\r&\r+\rU\r]\006V\006Y\r^\rl\rm\005\234\tz\r}\n\"\t\224\003\195\r|\012\134\r\166\r\223\r\252\014D\0145\005\171\014\r\t\223\t{\t|\005\155\014\022\014\023\006>\t\228\006L\t}\006Z\004\167\014 \t\230\014\"\n,\n2\n0\tz\t\224\014#\006\\\006M\006\237\007u\0143\006\176\0142\0146\002\016\n1\004\167\000J\t{\t|\0148\014@\t\228\n\227\t\159\014]\t}\nA\t\230\004z\014r\003\195\n\b\r\128\014w\014x\014\129\006V\006Y\005\171\nS\014\130\n\228\014\136\002\017\t\232\014\152\003\018\003\223\000J\014h\014\153\rM\rN\t\167\014\225\t\159\002\021\014\230\014\237\005\155\004{\004|\004}\014i\004\145\005\172\006Z\014\244\015*\015\132\t\174\004\127\t\176\015+\0155\005Z\003\019\006\\\004\176\0156\tz\003\018\n\240\015=\005\173\t\167\015P\t\162\015q\003D\015u\005\030\015\153\014j\014k\t{\t|\015\161\004\176\t[\003\018\015\162\t\174\t}\t\176\015\168\bg\000\199\004\231\004\166\015\169\003\019\016\171\001\144\015\172\015\182\003\216\t\163\t\\\t\162\003\149\005\172\015\183\015\210\003D\005\183\000J\015\218\004\177\004\166\003\019\t[\015\223\t\159\015\248\015\254\t`\016\002\016\011\016\015\005\173\t\254\tb\003D\t\173\t\188\t\186\005k\005l\t\163\t\\\016\020\016\135\016\159\016\163\005\167\t\255\n\000\004\185\t\187\016\170\016\174\004\131\t\167\n\001\016\175\002\142\016\181\t`\005\207\000\000\005k\005l\000\000\tb\000\000\t\173\t\185\t\186\000\000\t\174\005\183\t\176\005k\005l\000\000\005m\000W\bj\005n\005\208\t\187\000\000\005\207\n\030\000\000\000\000\t\162\000\000\003E\002\023\000\000\000\000\003\150\003\151\005\207\000\000\003\254\000\000\t[\005m\000\000\000\000\005n\005\208\000\000\000\000\003\018\003\178\000\199\bk\000\000\005m\br\n&\005n\005\208\t\163\t\\\004z\000\000\000\000\t\195\003F\003H\000\000\000\000\000\000\000\000\000\000\t\206\n-\000\000\t\176\000\000\004\150\t`\003\019\bt\000\000\000\000\t\199\tb\003K\t\173\t\210\t\186\000\000\n!\000\000\003D\004{\004|\004}\000\000\004\145\000\000\000\000\003F\t\187\t\223\000\000\004\127\000\000\000\000\004\151\004\130\000\000\004\158\000\000\000\000\t\254\0063\000\000\000\000\000\000\000\000\003F\n\"\t\224\004\158\003\182\004\149\000\000\003\183\b?\t\255\n\000\000\000\000\000\003\186\bC\000\000\000\000\n\001\004\251\0063\t\228\006<\003\018\004\159\004\160\004\161\t\230\004\171\n,\n/\n0\0063\000\000\000\000\004\163\004\159\004\160\004\161\000\000\004\171\000W\000\000\000\000\n1\000\000\006<\004\163\n\030\000\000\000\000\000\000\000\000\003\019\000\000\004\172\004\189\000\000\006<\004\180\000\000\000\000\000\000\006>\000\000\006L\003D\004\172\005T\000\000\000\000\004\180\000\000\000\000\003\187\000\000\000\000\004\131\n&\006M\006\237\012\142\001y\006\176\003N\000\000\000\000\006>\001z\006L\000\000\001{\000\000\000\000\003\195\n-\014H\t\176\000\000\006>\000\000\006L\005\171\006M\006\237\r\214\000\000\006\176\000\000\006V\006Y\000\000\n!\000\000\000\000\006M\006\237\014T\003F\006\176\000\000\000\000\000\000\000\000\t\223\000\000\004\167\000\000\000\000\000\000\000\000\000\000\005\155\006V\006Y\001y\000\000\002\031\004\167\006Z\000\000\001z\n\"\t\224\001{\006V\006Y\000\000\000\000\016\001\006\\\000\000\000\000\000\000\b\162\000\199\005\155\003\217\001$\000\000\004\150\t\228\016\019\006Z\000\000\000\000\000\000\t\230\005\155\n,\015\244\n0\000\000\003\018\006\\\006Z\003P\000\000\001\129\005\131\000\000\000\000\000\000\000\000\n1\005\172\006\\\000\000\000\000\001\130\004\151\004\130\001\164\001\132\001\133\000J\003\218\000\000\005Z\003\219\005\132\000\000\001y\003\019\005\173\000\000\000\000\000\000\001z\004\176\003F\001{\000\000\001\134\000\199\000\000\003D\000\000\000\000\000\000\004\251\004\176\000\000\000\000\000\000\000\000\000\000\002 \000\000\000\000\000\000\001\129\001y\000\000\000\000\000\000\b\165\001\165\001z\004\177\004\166\001{\001\130\000\000\000\000\005\183\001\132\001\133\000\000\000\000\000\000\004\177\004\166\000\000\000\000\000\000\000\000\001\152\000\000\000\000\003\018\000\000\000\000\000\000\000\000\000\000\001\134\000\199\b\166\004\185\001\137\b\171\000\000\000\000\000\000\003\195\000\000\015\200\t[\000\000\b\255\004\185\000\000\005\171\000\000\001y\000\000\001\152\011\158\000\000\003\019\001z\005\197\000\000\001{\001\139\b\173\t\\\001\129\t\001\000\000\000\000\003\195\003D\016\179\000\000\000\000\bg\000\199\001\130\005\171\000\000\000\000\001\132\001\133\t`\001\147\001\151\r\251\003\018\000\000\tb\000\000\001\137\000\000\n5\003R\000\000\001\129\000\000\000\000\000\000\000\000\001\134\000\199\000\000\000\000\001z\td\001\130\001{\000\000\001\171\001\132\001\133\000\000\000\000\001\210\001\139\003\019\001\141\000\000\000\000\000\000\000\000\001\144\000\000\001\146\000\000\003\223\003F\005\220\003D\001\134\000\199\000\000\005\172\000\000\000\000\001\147\001\168\000\000\000\000\000\000\000\000\005\221\r-\000\000\000\000\005\223\001\227\001\129\001y\000\000\000\000\005\173\000\000\001\165\001z\bj\001\153\001{\001\130\005\172\000\000\000\000\001\132\001\133\000\000\000\000\000\000\000\000\000\000\001\141\003\149\005\230\005\231\000\000\001\144\000\000\001\146\000\000\005\173\014\163\000\000\001\139\001\134\000\199\003\018\000\000\001\153\bk\000\000\000\000\br\001y\005\183\001\129\003\216\000W\000\000\001z\000\000\t\195\001{\005\232\001\147\001\151\001\212\001\180\000\000\012\025\001\132\001\217\001\218\001\139\005\234\003F\003\019\bt\000\000\000\000\t\199\005\183\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003D\001\134\000\199\000\000\000\000\001\147\001\151\000\000\000\000\001\141\000\000\014\167\001\137\000\000\001\144\000\000\001\146\001\129\001\154\000\000\000\000\001\183\000\000\001\165\000\000\000\000\003\150\003\151\001\130\001y\012x\012\129\001\132\001\133\000\000\001z\000\000\001\139\001{\001\141\000\000\003\178\000\199\000\000\001\144\003F\001\146\003\018\001\158\000\000\000\000\t\223\001\134\000\199\000\000\001y\000\000\003\018\001\147\001\168\001\129\001z\000\000\000\000\001{\000\000\001\165\000\000\000\000\000\000\t\224\001\130\000\000\001y\000\000\001\132\001\133\003\019\003\018\001z\000\000\000\000\001{\001\139\000\000\000\000\001\252\003\019\t\228\000\000\003D\000\000\001\141\000\000\t\230\001\134\000\199\001\144\015\247\001\146\003D\000\000\000\000\000\000\000\000\003\018\000\000\003\018\003\019\001\137\014\170\t\232\002\000\000\000\003\182\000\000\000\000\003\183\000\000\000\000\000\000\003D\000\000\003\186\000\000\001\129\000\000\000\000\002\031\000\000\000\000\001\165\003\217\001$\001\139\003\019\001\130\003\019\001\219\000\000\001\132\001\133\000\000\001\220\003F\000\000\000\000\000\000\003D\000\000\003D\001\129\001\137\000\000\005\131\001\147\001\168\001\165\000\000\000\000\001\134\000\199\001\130\000\000\000\000\000\000\001\132\001\133\000\000\001\129\000\000\003\218\003\018\000\000\003\219\005\132\000\000\001\139\000\000\000\000\001\130\000\000\003\018\003\187\001\132\001\133\001\134\000\199\000\000\001\141\003\018\000\000\000\000\000\000\001\144\000\000\001\146\000\000\001\147\001\168\014\172\000\000\003\019\000\000\001\134\000\199\001z\003\217\001$\001{\014\174\000\000\003\019\001z\000\000\003D\001{\001\137\003\024\000\000\003\019\000\000\000\000\001\210\000\000\003D\000\000\000\000\000\000\005\131\000\000\014\181\001\141\003D\003F\003\217\001$\001\144\000\000\001\146\000\000\000\000\001\139\001\137\003F\000\000\003\218\000\000\000\000\003\219\005\132\000\000\000\000\003,\000\000\001\222\001\224\005\131\014\183\003-\014\186\001\137\003.\001\147\001\168\003F\000\000\005\197\001\139\000\000\000\000\000\000\000\000\000\000\003\218\000\000\003,\003\219\005\132\000\000\000\000\000\000\003-\000\000\000\000\003.\001\139\000\000\000\000\001\147\001\168\000\000\003F\000\000\003F\000\000\001\129\001\141\000\000\000\000\000\000\000\000\001\144\001\129\001\146\000\000\000\000\001\147\001\151\000\000\b[\001\132\001\217\001\221\001\231\000\000\000\000\000\000\001\132\001\217\001\218\000\000\000\000\001\141\000\000\014\189\000\000\000\000\001\144\r\162\001\146\001\134\000\199\bd\003\223\014\191\005\220\000\000\001\134\000\199\000\000\001\141\005\197\014\193\000\000\000\000\001\144\000\000\001\146\0030\005\221\005\222\000\000\000\000\005\223\b\\\000\000\000\000\000\000\003F\0031\000\000\000\000\000\000\0033\0034\000\000\000\000\r(\003F\005\197\000\000\0030\000\000\000\000\000\000\000\000\003F\b\\\000\000\005\230\005\231\000\000\0031\002\233\000\199\000\000\0033\0034\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\216\000\000\000\000\000\000\002\233\000\199\003\223\005\232\005\220\000\000\001\139\000\000\000\000\000\000\000\000\000\000\000\000\001\139\005\234\001y\000\000\000\000\005\221\r-\000\000\001z\005\223\000\000\001{\005\219\000\000\001y\000\000\000\000\003\223\000\000\005\220\001z\0035\000\000\001{\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\221\005\222\005\230\005\231\005\223\000\000\000\000\000\000\000\000\000\000\000\000\0035\001y\0037\000\000\001\219\000\000\000\000\001z\000\000\005{\001{\001\219\001\232\000\000\003\216\000\000\001\220\000\000\000\000\005\230\005\231\005\232\000\000\003>\b_\0037\000\000\b\130\000\000\001y\000\000\000\000\005\234\000\000\000\000\001z\000\000\000\000\001{\000\000\000\000\000\000\003\216\000\000\000\000\000\000\003>\b_\000\000\005\232\000\000\000\000\000\000\000\000\001\129\000\000\000\000\0039\b\135\000\000\005\234\000\000\001\144\000\000\003<\001\130\001\129\000\000\000\000\001\132\001\133\000\000\001\165\000\000\000\000\001z\000\000\001\130\001{\000\000\0039\001\132\001\133\000\000\000\000\001\144\b\155\003<\000\000\001\134\000\199\000\000\000\000\000\000\000\000\000\000\000\000\001\129\000\000\000\000\000\000\001\134\000\199\001\165\003\149\000\000\000\000\000\000\001\130\000\000\000\000\000\000\001\132\001\133\000\000\000\000\bm\001y\000\000\000\000\000\000\000\000\000\000\001z\000\000\001\129\001{\000\000\000\000\000\000\000\000\001\165\001\134\000\199\000\000\000\000\001\130\000\000\000\000\005\204\001\132\001\133\000\000\000\000\000\000\000\000\001\137\000\000\001y\000\000\000\000\000\000\000\000\000\000\001z\000\000\000\000\001{\001\137\000\000\001\134\000\199\000\000\000\000\000\000\001\129\000\000\000\000\000\000\000\000\000\000\001\139\000\000\000\000\b\160\000\000\000\000\000\000\000\000\000\000\001\132\001\217\b3\001\139\000\000\000\000\000\000\003\150\003\151\001\137\000\000\003\254\001\147\002\r\000\000\000\000\000\000\000\000\000\000\000\000\001\134\000\199\003\178\000\199\001\147\001\168\000\000\bo\003\217\001$\000\000\000\000\000\000\001\129\001\139\000\000\003,\001\137\000\000\001\165\000\000\000\000\003-\000\000\001\130\003.\001\141\000\000\001\132\001\133\000\000\001\144\000\000\001\146\000\000\001\147\001\168\000\000\001\141\000\000\000\000\000\000\001\139\001\144\001\129\001\146\000\000\003\218\001\134\000\199\003\219\015!\000\000\000\000\000\000\001\130\000\000\004\158\000\000\001\132\001\133\000\000\000\000\001\147\001\168\000\000\000\000\000\000\000\000\001\141\000\000\000\000\000\000\b\205\001\144\003\182\001\146\003,\003\183\001\134\000\199\000\000\001\139\003-\003\186\000\000\003.\000\000\000\000\004\159\004\160\004\161\000\000\004\171\000\000\000\000\000\000\001\141\000\000\000\000\004\163\000\000\001\144\000\000\001\146\001\137\bm\000\000\000\000\000\000\000\000\000\000\0030\000\000\000\000\000\000\000\000\000\000\b\\\000\000\004\172\004\179\000\000\0031\004\180\000\000\000\000\0033\0034\003,\001\139\000\000\000\000\000\000\b\210\003-\001\137\001\219\003.\000\000\000\000\000\000\005{\005\197\003\187\000\000\000\000\002\233\000\199\000\000\000\000\001\147\001\168\000\000\000\000\000\000\001y\000\000\000\000\000\000\000\000\001\139\001z\000\000\000\000\001{\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0030\000\000\000\000\000\000\000\000\000\000\b\\\000\000\000\000\001\147\002\r\0031\001\141\t\146\001y\0033\0034\001\144\004\167\001\146\001z\000\000\000\000\001{\b\168\000\000\000\000\000\000\000\000\000\000\000\000\0035\000\000\000\000\004\187\002\233\000\199\003\223\000\000\005\220\t\154\000\000\000\000\001\141\000\000\000\000\000\000\000\000\001\144\000\000\001\146\001y\0030\005\221\000\000\000\000\0037\001z\b\\\000\000\001{\000\000\000\000\0031\000\000\000\000\000\000\0033\0034\014\160\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003>\b_\001\129\000\000\000\000\000\000\005\230\005\231\001\165\000\000\002\233\000\199\000\000\001\130\000\000\0035\000\000\001\132\001\133\000\000\000\000\003\217\001$\000\000\004\176\000\000\000\000\000\000\000\000\003\216\000\000\n\018\000\000\001\129\0039\000\000\000\000\001\134\000\199\001\144\0037\003<\000\000\005\131\001\130\000\000\000\000\000\000\001\132\001\133\000\000\000\000\000\000\000\000\004\177\004\166\000\000\000\000\000\000\000\000\003\218\003>\b_\003\219\005\132\000\000\000\000\0035\001\134\000\199\001\129\000\000\000\000\000\000\000\000\000\000\001\165\000\000\000\000\003\217\001$\001\130\000\000\000\000\004\185\001\132\001\133\001y\000\000\000\000\000\000\000\000\0037\001z\001\137\0039\001{\000\000\000\000\000\000\001\144\005\131\003<\000\000\000\000\001\134\000\199\000\000\000\000\000\000\000\000\000\000\000\000\003>\b_\000\000\005k\005l\003\218\001\139\000\000\003\219\005\132\000\000\001y\001\137\000\000\000\000\000\000\000\000\001z\000\000\000\000\001{\000\000\000\000\000\000\000\000\005\207\000\000\001\147\001\168\001}\000\000\000\000\000\000\000\000\0039\000\000\000\000\001\139\000\000\001\144\000\000\003<\005m\005\197\000\000\005n\005\208\000\000\000\000\001\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\147\001\151\000\000\001\141\000\000\000\000\000\000\000\000\001\144\000\000\001\146\001y\001\129\000\000\000\000\000\000\001\139\001z\000\000\000\000\001{\000\000\000\000\001\130\000\000\000\000\000\000\001\132\001\133\000\000\000\000\000\000\000\000\000\000\001\141\000\000\000\000\001\147\001\168\001\144\000\000\001\146\000\000\005\197\000\000\000\000\000\000\001\134\000\199\001\129\000\000\000\000\003\223\000\000\005\220\000\000\000\000\000\000\000\000\000\000\001\130\000\000\000\000\000\000\001\132\001\133\002\"\000\000\005\221\014\132\000\000\001\141\005\223\000\000\003\217\001$\001\144\000\000\001\146\000\000\0063\000\000\000\000\000\000\001\134\000\199\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\131\000\000\005\230\005\231\000\000\000\000\000\000\000\000\001\137\000\000\000\000\001\129\000\000\000\000\003\223\000\000\005\220\003\218\000\000\000\000\003\219\005\132\001\130\000\000\000\000\003\216\001\132\001\133\000\000\000\000\005\221\014z\005\232\001\139\005\223\003\217\001$\000\000\000\000\000\000\000\000\000\000\000\000\005\234\000\000\001\137\001\134\000\199\000\000\000\000\000\000\006>\000\000\006L\001\147\001\151\000\000\005\131\000\000\000\000\005\230\005\231\000\000\000\000\000\000\000\000\000\000\006M\006\175\000\000\001\139\006\176\003\217\001$\003\218\000\000\000\000\003\219\005\132\000\000\000\000\000\000\000\000\003\216\000\000\000\000\000\000\000\000\001\141\000\000\005\232\001\147\003s\001\144\005\131\001\146\000\000\006V\006Y\003v\000\000\005\234\000\000\001\137\000\000\000\000\000\000\000\000\000\000\000\000\001y\003\218\000\000\005\197\003\219\005\132\001z\000\000\000\000\001{\005\155\000\000\000\000\000\000\000\000\001\141\000\000\006Z\001\139\000\000\001\144\000\000\001\146\003\217\001$\000\000\000\000\000\000\006\\\001y\006\168\000\000\000\000\000\000\000\000\001z\000\000\000\000\001{\001\147\001\151\000\000\000\000\000\000\000\000\005\131\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\197\000\000\003\218\000\000\000\000\003\219\005\132\004\158\000\000\000\000\003\223\000\000\005\220\001\141\000\000\000\000\000\000\000\000\001\144\000\000\001\146\000\000\000\000\000\000\000\000\000\000\005\221\000\000\000\000\000\000\006\173\000\000\000\000\000\000\000\000\000\000\001\129\005\197\000\000\004\159\007\151\007\156\007\187\004\171\000\000\000\000\000\000\001\130\000\000\000\000\004\163\001\132\001\133\000\000\000\000\000\000\005\230\005\231\000\000\004\158\000\000\000\000\000\000\000\000\007b\001\129\000\000\003\223\000\000\005\220\004\172\001\134\000\199\000\000\007\196\000\000\001\130\000\000\000\000\003\216\001\132\001\133\000\000\005\221\007\n\000\000\005\232\005\223\000\000\000\000\001y\004\159\004\160\004\161\000\000\004\171\001z\005\234\005\197\001{\001\134\000\199\004\163\000\000\003\223\000\000\005\220\000\000\000\000\000\000\000\000\000\000\000\000\005\230\005\231\000\000\000\000\000\000\000\000\000\000\005\221\000\000\004\172\005T\006\173\007\213\004\180\000\000\001\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\216\000\000\000\000\001y\000\000\004\167\000\000\005\232\000\000\001z\000\000\000\000\001{\001y\005\230\005\231\000\000\001\139\005\234\001z\000\000\001\137\001{\000\000\000\000\000\000\001y\000\000\000\000\003\223\000\000\005\220\001z\000\000\000\000\001{\000\000\003\216\001\147\003\255\000\000\003\217\001$\000\000\005\232\005\221\001\139\000\000\000\000\006\173\001\129\000\000\000\000\000\000\000\000\005\234\000\000\004\167\000\000\000\000\007\199\001\130\000\000\005\131\000\000\001\132\001\133\001\147\b\141\000\000\000\000\000\000\001\141\000\000\b\144\005\230\005\231\001\144\000\000\001\146\003\218\r\026\000\000\003\219\005\132\001\134\000\199\001y\004\176\000\000\000\000\000\000\000\000\001z\000\000\000\000\001{\000\000\003\216\001\129\000\000\001\141\000\000\000\000\000\000\005\232\001\144\000\000\001\146\001\129\001\130\000\000\000\000\000\000\001\132\001\133\005\234\005Z\004\177\004\166\001\130\000\000\001\129\000\000\001\132\001\133\000\000\000\000\tF\000\000\000\000\000\000\000\000\001\130\001\134\000\199\000\000\001\132\001\133\000\000\004\176\000\000\001\137\000\000\001\134\000\199\000\000\000\000\004\185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\134\000\199\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\139\000\000\000\000\004\177\004\166\000\000\001y\000\000\000\000\005\197\000\000\000\000\001z\000\000\000\000\001{\001\129\000\000\000\000\000\000\000\000\001\147\b\141\000\000\001\137\000\000\000\000\001\130\b\176\000\000\000\000\001\132\001\133\004\185\001\137\001y\n\196\000\000\000\000\000\000\000\000\001z\000\000\000\000\001{\000\000\000\000\001\137\0032\001\139\000\000\001\134\000\199\000\000\003-\001\141\000\000\003.\000\000\001\139\001\144\000\000\001\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\147\b\191\001\139\003\217\001$\000\000\003\223\b\194\005\220\001y\001\147\b\191\000\000\000\000\000\000\001z\000\000\b\214\001{\000\000\000\000\000\000\005\221\001\147\003\255\005\131\006\173\000\000\000\000\000\000\000\000\014\202\001\129\000\000\001\141\000\000\000\000\000\000\001\137\001\144\000\000\001\146\003\218\001\130\001\141\003\219\005\132\001\132\001\133\001\144\000\000\001\146\005\230\005\231\000\000\000\000\000\000\001\141\000\000\000\000\000\000\001\129\001\144\001\139\001\146\000\000\000\000\001\134\000\199\000\000\000\000\000\000\001\130\000\000\0030\003\216\001\132\001\133\000\000\000\000\000\000\000\000\005\232\000\000\001\147\b\191\000\000\000\000\000\000\0033\0034\ty\000\000\005\234\000\000\000\000\001\134\000\199\000\000\000\000\003\217\001$\000\000\000\000\000\000\001\129\000\000\000\000\000\000\002\233\000\199\000\000\000\000\003\217\001$\000\000\001\130\000\000\001\141\000\000\001\132\001\133\005\131\001\144\001\137\001\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\131\000\000\000\000\005\197\003\218\001\134\000\199\003\219\005\132\000\000\000\000\000\000\000\000\000\000\001\139\003\217\001$\003\218\001\137\000\000\003\219\005\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\184\0035\0032\000\000\000\000\001\147\b\191\005\131\003-\000\000\000\000\003.\t\139\001\139\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\218\000\000\0037\003\219\005\132\000\000\000\000\000\000\001\137\000\000\001\147\b\141\000\000\000\000\000\000\001\141\003\223\t\253\005\220\000\000\001\144\000\000\001\146\000\000\000\000\000\000\003\217\001$\000\000\000\000\000\000\014\218\005\221\001\139\000\000\000\000\006\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\141\000\000\005\197\000\000\005\131\001\144\000\000\001\146\000\000\000\000\001\147\b\141\000\000\0039\000\000\005\197\000\000\n\011\005\230\005\231\003<\003\218\000\000\000\000\003\219\005\132\000\000\000\000\000\000\012\241\0030\000\000\000\000\000\000\000\000\000\000\005k\005l\000\000\000\000\000\000\003\216\012\251\000\000\001\141\0033\0034\000\000\005\232\001\144\000\000\001\146\005\197\000\000\000\000\000\000\000\000\000\000\005\207\005\234\000\000\005k\005l\000\000\000\000\002\233\000\199\000\000\000\000\003\223\000\000\005\220\000\000\000\000\000\000\005m\000\000\000\000\005n\005\208\000\000\000\000\003\223\005\207\005\220\005\221\000\000\000\000\000\000\006\173\000\000\000\000\000\000\000\000\000\000\003\149\000\000\000\000\005\221\000\000\005m\000\000\006\173\005n\005\208\000\000\000\000\000\000\000\000\000\000\000\000\003\217\001$\000\000\000\000\005\230\005\231\005\197\000\000\003\223\000\000\005\220\0035\000\000\000\000\000\000\000\000\000\000\005\230\005\231\006:\000\000\000\000\005\131\000\000\005\221\r*\000\000\003\216\005\223\000\000\000\000\000\000\000\000\000\000\005\232\000\000\0037\001\145\000\000\003\218\003\216\000\000\003\219\005\132\000\000\005\234\000\000\005\232\000\000\000\000\001y\000\000\000\000\000\000\005\230\005\231\001z\000\000\005\234\001{\0063\000\000\b\221\000\000\000\000\003\217\001$\003\150\003\151\000\000\000\000\003\254\000\000\003\223\000\000\005\220\000\000\003\216\000\000\000\000\000\000\000\000\003\178\000\199\005\232\0063\000\000\005\131\000\000\005\221\rQ\0039\000\000\005\223\000\000\005\234\000\000\000\000\003<\000\000\000\000\000\000\003\217\001$\003\218\000\000\000\000\003\219\005\132\000\000\000\000\000\000\001\145\000\000\000\000\000\000\015`\000\000\000\000\005\230\005\231\000\000\000\000\000\000\005\131\000\000\000\000\006>\000\000\006L\000\000\000\000\000\000\000\000\000\000\005\197\003\149\003\217\001$\000\000\000\000\003\218\003\216\006M\003\219\005\132\001\129\006[\000\000\005\232\001z\000\000\006>\001{\006L\003\182\000\000\001\130\003\183\005\131\005\234\001\132\001\133\000\000\003\186\000\000\000\000\000\000\006M\000\000\003\217\001$\006[\006V\006Y\000\000\003\218\000\000\000\000\003\219\005\132\001\134\000\199\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\131\000\000\000\000\000\000\005\155\000\000\006V\006Y\005\197\000\000\003\223\r{\005\220\000\000\000\000\015d\000\000\003\218\006\181\000\000\003\219\005\132\006\\\000\000\000\000\000\000\005\221\003\150\003\151\005\155\005\233\003\152\003\187\000\000\000\000\014?\r\150\000\000\000\000\005k\005l\000\000\003\178\000\199\000\000\005\197\001\137\006\\\001\129\000\000\000\000\000\000\000\000\006\182\000\000\000\000\005\230\005\231\000\000\000\000\000\000\005\207\000\000\001\132\001\217\012\168\000\000\005k\005l\000\000\000\000\001\139\000\000\000\000\000\000\003\223\000\000\005\220\005m\003\216\005\197\005n\005\208\001\134\000\199\000\000\0141\000\000\000\000\005\207\000\000\005\221\001\147\015a\000\000\006\173\000\000\005\234\000\000\000\000\000\000\006\183\006\184\005k\005l\006\185\005m\000\000\000\000\005n\005\208\000\000\003\223\005\197\005\220\003\182\006\220\000\199\003\183\000\000\003\149\005\230\005\231\000\000\003\186\005\207\001\141\000\000\005\221\015:\000\000\001\144\005\223\001\146\000\000\000\000\000\000\000\000\000\000\000\000\016\134\000\000\005m\000\000\003\216\005n\005\208\003\223\001y\005\220\000\000\005\232\000\000\000\000\001z\007\225\000\000\001{\005\230\005\231\000\000\000\000\005\234\005\221\000\000\001\139\001y\015e\000\000\000\000\000\000\000\000\001z\000\000\0063\001{\000\000\000\000\000\000\000\000\003\223\003\216\005\220\000\000\003\187\000\000\000\000\000\000\005\232\006\224\000\000\000\000\006\225\005\230\005\231\000\000\005\221\000\000\006\228\005\234\006\173\000\000\0063\003\150\003\151\000\000\000\000\003\254\000\000\001@\001$\000\000\000\000\000\000\000\000\001y\003\216\000\000\003\178\000\199\001\219\001z\000\000\005\232\001{\005{\005\230\005\231\000\000\000\000\000\000\000\000\000\000\000\000\005\234\000\000\000\000\000\000\0063\000\000\000\000\006>\000\000\006L\001\129\000\000\000\000\000\000\001A\003\216\001B\001E\000\000\000\000\000\000\001\130\005\232\006M\006\229\001\132\001\133\015\005\001\129\000\000\000\000\000\000\001y\005\234\000\000\006>\000\000\006L\001z\001\130\000\000\001{\000\000\001\132\001\133\001\134\000\199\000\000\000\000\000\000\000\000\006M\000\000\006V\006Y\014o\000\000\003\182\000\000\000\000\003\183\000\000\000\000\001\134\000\199\000\000\003\186\000\000\000\000\000\000\000\000\006>\000\000\006L\000\000\000\000\005\155\001\129\000\000\000\000\000\000\006V\006Y\006Z\000\000\000\000\000\000\006M\001\130\000\000\001y\014n\001\132\001\133\006\\\000\000\001z\000\000\000\000\001{\000\000\000\000\001\137\000\000\005\155\000\000\000\000\000\000\000\000\000\000\001F\006Z\001\134\000\199\000\000\000\000\000\000\006V\006Y\000\000\001\137\000\000\006\\\000\000\000\000\000\000\003\187\001\139\001\129\000\000\000\000\000\000\003,\000\000\000\000\000\000\000\000\000\000\003-\001\130\005\155\003.\000\000\001\132\001\133\001\139\000\000\006Z\001\147\001\167\000\000\000\000\000\000\000\000\014\138\000\000\000\000\000\000\006\\\000\000\000\000\000\000\000\000\001\134\000\199\000\000\001\147\002\011\001z\001\137\000\000\001{\000\000\000\000\000\000\000\000\000\000\003\223\001\210\003\228\000\000\000\000\001\141\000\000\000\000\000\000\001\129\001\144\000\000\001\146\003,\000\000\000\000\003\229\001\139\000\000\003-\001\130\004\158\003.\001\141\001\132\001\133\000\000\000\000\001\144\000\000\001\146\000\000\001z\003\031\001\224\001{\000\000\000\000\001\147\002\019\000\000\000\000\001\210\001\137\001\134\000\199\003\230\003\233\000\000\000\000\000\000\0030\000\000\004\159\t$\t)\000\000\004\171\000\000\000\000\000\000\000\000\0031\000\000\004\163\000\000\0033\0034\001\139\003\216\000\000\000\000\001\141\000\000\003&\001\224\000\000\001\144\000\000\001\146\000\000\001\129\000\000\000\000\004\172\000\000\002\233\000\199\tO\001\147\002L\000\000\001\231\000\000\000\000\000\000\001\132\001\217\001\218\000\000\000\000\001\137\000\000\000\000\001y\000\000\000\000\003\217\001$\0030\001z\000\000\000\000\001{\000\000\000\000\001\134\000\199\000\000\000\000\0031\000\000\001\129\001\141\0033\0034\001\139\000\000\001\144\005\131\001\146\000\000\000\000\001\231\000\000\000\000\000\000\001\132\001\217\001\218\000\000\003\217\001$\0035\002\233\000\199\003\218\001\147\002\215\003\219\005\132\000\000\000\000\001y\000\000\004\167\000\000\001\134\000\199\001z\000\000\000\000\001{\005\131\000\000\000\000\000\000\000\000\0037\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\218\001\141\000\000\003\219\005\132\000\000\001\144\000\000\001\146\003>\003B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\139\000\000\001\129\0035\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tR\001\130\000\000\000\000\000\000\001\132\001\133\000\000\000\000\000\000\000\000\000\000\000\000\0039\000\000\000\000\0037\000\000\001\144\000\000\003<\000\000\000\000\000\000\000\000\001\134\000\199\001y\004\176\001\139\000\000\000\000\005\197\001z\000\000\000\000\001{\003>\003u\001\129\001y\000\000\000\000\001\219\001\232\000\000\001z\000\000\001\220\001{\001\130\000\000\000\000\000\000\001\132\001\133\000\000\000\000\004\177\004\166\000\000\005k\005l\000\000\000\000\000\000\005\197\000\000\000\000\000\000\000\000\0039\000\000\000\000\001\134\000\199\001\144\000\000\003<\000\000\000\000\000\000\001\137\005\207\001\219\001\232\000\000\000\000\004\185\001\220\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\223\005m\005\220\000\000\005n\005\208\000\000\000\000\001\139\000\000\000\000\000\000\000\000\000\000\000\000\003\149\005\221\000\000\000\000\003,\r\170\000\000\000\000\000\000\001\129\003-\000\000\000\000\003.\001\147\003\163\000\000\001\137\000\000\003\223\001\130\005\220\001\129\000\000\001\132\001\133\000\000\001#\001$\000\000\000\000\005\230\005\231\001\130\000\000\005\221\000\000\001\132\001\133\r\169\000\000\000\000\001\139\000\000\001\134\000\199\000\000\000\000\001\141\000\000\000\000\000\000\000\000\001\144\003\216\001\146\000\000\001\134\000\199\000\000\000\000\005\232\000\000\001\147\003\166\005\230\005\231\014}\000\000\014C\000\000\003,\005\234\000\000\000\000\000\000\000\000\003-\001@\001$\003.\000\000\0063\003\150\003\151\005k\005l\003\185\003\216\000\000\000\000\000\000\000\000\000\000\000\000\005\232\000\000\001\141\003\178\000\199\0030\001\137\001\144\000\000\001\146\000\000\005\234\005\207\000\000\000\000\000\000\0031\001#\001$\001\137\0033\0034\001A\000\000\001B\001E\000\000\000\000\001y\005m\000\000\001\139\005n\005\208\001z\000\000\000\000\001{\000\000\000\000\002\233\000\199\003,\000\000\001\139\000\000\000\000\000\000\003-\000\000\000\000\003.\001\147\003\250\006>\000\000\006L\014u\000\000\014C\000\000\000\000\000\000\000\000\000\000\001\147\004\001\014D\000\000\000\000\006M\000\000\0030\000\000\r\151\000\000\003\182\000\000\000\000\003\183\000\000\000\000\000\000\0031\000\000\003\186\001\141\0033\0034\000\000\000\000\001\144\000\000\001\146\000\000\000\000\000\000\0035\000\000\001\141\006V\006Y\000\000\000\000\001\144\000\000\001\146\002\233\000\199\000\000\000\000\003,\000\000\000\000\000\000\000\000\000\000\003-\001F\000\000\003.\000\000\0037\005\155\001\129\0063\000\000\000\000\000\000\000\000\006Z\000\000\000\000\004\158\003\223\001\130\014h\000\000\0030\001\132\001\133\006\\\000\000\003>\004.\003\187\000\000\000\000\000\000\0031\014i\000\000\014D\0033\0034\000\000\003\217\001$\000\000\001\134\000\199\000\000\r\236\000\000\0035\004\159\004\160\004\161\000\000\004\171\000\000\000\000\000\000\002\233\000\199\000\000\004\163\0039\005\131\000\000\014j\014k\001\144\000\000\003<\003\223\000\000\003\228\000\000\0037\000\000\000\000\006>\000\000\006L\003\218\004\172\005T\003\219\005\132\004\180\003\229\000\000\003\216\000\000\000\000\000\000\0030\006M\000\000\003>\0046\r/\000\000\003\217\001$\001\137\000\000\0031\003\223\000\000\014h\0033\0034\000\000\000\000\000\000\000\000\000\000\000\000\0035\003\230\003\233\000\000\000\000\014i\005\131\000\000\006V\006Y\000\000\001\139\002\233\000\199\0039\000\000\000\000\003\217\001$\001\144\000\000\003<\000\000\003\218\003\216\0037\003\219\005\132\000\000\000\000\000\000\005\155\001\147\004\182\000\000\014j\014k\004\167\006Z\005\131\000\000\000\000\000\000\004\158\000\000\000\000\003>\005\007\000\000\006\\\003\217\001$\000\000\000\000\000\000\000\000\003\218\000\000\003\216\003\219\005\132\005\197\000\000\000\000\000\000\000\000\001\141\000\000\000\000\0035\000\000\001\144\005\131\001\146\000\000\004\159\004\160\004\161\000\000\004\171\0039\000\000\005k\005l\000\000\001\144\004\163\003<\000\000\003\218\000\000\000\000\003\219\005\132\0037\000\000\000\000\005W\000\000\000\000\004\158\000\000\000\000\000\000\005\207\000\000\004\172\005T\000\000\000\000\004\180\000\000\000\000\000\000\000\000\003>\005#\000\000\000\000\005\197\004\176\005m\000\000\000\000\005n\005\208\000\000\000\000\003\223\000\000\005\220\000\000\004\159\004\160\004\161\000\000\004\171\000\000\000\000\005k\005l\000\000\000\000\004\163\005\221\000\000\000\000\000\000\r\n\0039\004\177\004\166\005\197\000\000\001\144\000\000\003<\000\000\003\149\000\000\000\000\005\207\000\000\004\172\005T\000\000\000\000\004\180\000\000\000\000\000\000\000\000\000\000\000\000\005\230\005\231\000\000\004\167\005m\000\000\004\185\005n\005\208\000\000\000\000\005\197\003\223\000\000\005\220\000\000\000\000\000\000\000\000\007\229\000\000\000\000\000\000\003\216\000\000\000\000\000\000\005U\005\221\000\000\005\232\000\000\r\005\003\217\001$\000\000\000\000\000\000\000\000\000\000\000\000\005\234\000\000\0063\000\000\003\223\000\000\005\220\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\131\000\000\000\000\005\230\005\231\004\167\005\221\000\000\005Z\000\000\r\000\000\000\003\150\003\151\000\000\000\000\003\254\003\218\000\000\000\000\003\219\005\132\000\000\003\223\000\000\005\220\003\216\003\178\000\199\012\210\000\000\004\176\000\000\005\232\000\000\000\000\005\230\005\231\000\000\005\221\000\000\003\217\001$\012\255\005\234\0063\000\000\000\000\000\000\000\000\000\000\005k\005l\000\000\000\000\006>\000\000\006L\000\000\003\216\000\000\004\177\004\166\005\131\000\000\005Z\005\232\000\000\000\000\005\230\005\231\006M\000\000\005\207\000\000\012\248\000\000\005\234\000\000\000\000\003\218\000\000\000\000\003\219\005\132\000\000\000\000\000\000\004\176\000\000\005m\004\185\003\216\005n\005\208\000\000\000\000\000\000\000\000\005\232\003\182\006V\006Y\003\183\000\000\000\000\000\000\000\000\000\000\003\186\005\234\000\000\006>\005\197\006L\000\000\000\000\000\000\004\177\004\166\000\000\000\000\000\000\000\000\005\155\000\000\000\000\000\000\006M\005k\005l\006Z\012\198\000\000\000\000\005k\005l\000\000\000\000\000\000\000\000\000\000\006\\\000\000\000\000\000\000\000\000\000\000\004\185\000\000\000\000\005\207\000\000\000\000\003,\000\000\000\000\005\207\006V\006Y\003-\000\000\000\000\003.\000\000\000\000\000\000\000\000\005m\003\187\000\000\005n\005\208\000\000\005m\000\000\005\197\005n\005\208\000\000\003\223\005\155\005\220\001@\001$\000\000\0063\000\000\006Z\000\000\003\217\001$\000\000\000\000\003\149\000\000\005\221\000\000\001z\006\\\012\193\001{\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\131\000\000\000\000\005k\005l\000\000\000\000\000\000\000\000\000\000\001A\000\000\001B\001E\005\230\005\231\000\000\003\218\000\000\000\000\003\219\005\132\000\000\000\000\000\000\005\207\000\000\000\000\003\217\001$\000\000\003\223\000\000\005\220\000\000\000\000\000\000\003\216\0030\000\000\000\000\006>\005m\006L\005\232\005n\005\208\005\221\000\000\0031\005\131\012\192\0063\0033\0034\005\234\000\000\006M\0063\000\000\006\181\012\171\003\217\001$\000\000\003\150\003\151\003\218\000\000\003\188\003\219\005\132\000\000\002\233\000\199\000\000\001\129\005\230\005\231\000\000\003\178\000\199\000\000\000\000\005\131\000\000\000\000\006V\006Y\000\000\000\000\001\132\001\217\r\002\003\217\001$\000\000\000\000\000\000\000\000\003\216\003\218\000\000\000\000\003\219\005\132\001F\005\232\000\000\000\000\005\155\001\134\000\199\005\197\000\000\000\000\005\131\006Z\005\234\006>\000\000\006L\000\000\000\000\000\000\006>\000\000\006L\006\\\000\000\0035\000\000\000\000\003\218\000\000\006M\003\219\005\132\0063\012\166\000\000\006M\000\000\006\183\006\184\007m\000\000\006\227\003\217\001$\r\235\000\000\000\000\003\182\000\000\0037\003\183\000\000\006\220\000\199\000\000\000\000\003\186\005\197\000\000\006V\006Y\000\000\000\000\000\000\005\131\006V\006Y\003\223\000\000\003\228\003>\005\190\000\000\000\000\003\223\000\000\005\220\000\000\000\000\000\000\000\000\003\218\005\155\003\229\003\219\005\132\000\000\001\139\005\155\006Z\005\221\005\197\000\000\000\000\007\137\006Z\003\217\001$\000\000\006>\006\\\006L\000\000\000\000\0039\000\000\006\\\000\000\000\000\001\144\000\000\003<\000\000\003\230\003\233\006M\003\187\000\000\005\131\007l\005\230\005\231\000\000\005\197\003\223\006\224\005\220\000\000\006\225\000\000\003\217\001$\000\000\000\000\006\228\003\218\003\216\000\000\003\219\005\132\005\221\000\000\001\219\003\216\005\226\006V\006Y\005{\000\000\000\000\005\232\000\000\005\131\000\000\000\000\000\000\003\149\000\000\003\223\000\000\005\220\005\234\000\000\000\000\000\000\000\000\000\000\000\000\005\155\003\218\005\230\005\231\003\219\005\132\005\221\006Z\000\000\005\197\005\229\000\000\003\217\001$\000\000\000\000\000\000\000\000\006\\\000\000\000\000\000\000\003\223\007\232\005\220\003\216\006\229\000\000\000\000\000\000\000\000\000\000\005\232\000\000\005\131\000\000\005\230\005\231\005\221\000\000\003\217\001$\005\233\005\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\218\000\000\000\000\003\219\005\132\000\000\000\000\000\000\003\216\000\000\000\000\005\131\005\197\000\000\000\000\005\232\000\000\005\230\005\231\000\000\003\150\003\151\003\217\001$\003\254\003\223\005\234\005\220\003\218\000\000\000\000\003\219\005\132\000\000\000\000\003\178\000\199\000\000\000\000\000\000\003\216\005\221\000\000\000\000\005\131\005\235\005\197\005\232\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\234\000\000\000\000\003\218\000\000\000\000\003\219\005\132\000\000\000\000\000\000\000\000\000\000\005\230\005\231\000\000\000\000\000\000\000\000\000\000\000\000\003\223\000\000\005\220\000\000\000\000\000\000\000\000\000\000\000\000\003\217\001$\000\000\000\000\000\000\000\000\003\216\005\221\005\197\000\000\000\000\005\238\000\000\005\232\000\000\000\000\000\000\000\000\000\000\000\000\003\182\000\000\005\131\003\183\005\234\003\223\000\000\005\220\000\000\003\186\000\000\000\000\000\000\000\000\000\000\000\000\005\197\005\230\005\231\003\218\000\000\005\221\003\219\005\132\000\000\005\240\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\217\001$\006\181\000\000\000\000\000\000\003\216\000\000\000\000\000\000\000\000\000\000\000\000\005\232\000\000\005\197\000\000\005\230\005\231\000\000\000\000\003\223\005\131\005\220\005\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\217\001$\000\000\003\187\000\000\005\221\000\000\003\218\003\216\005\243\003\219\005\132\000\000\000\000\000\000\005\232\000\000\003\223\000\000\005\220\000\000\000\000\005\131\000\000\000\000\000\000\005\234\000\000\000\000\000\000\000\000\000\000\000\000\005\221\000\000\005\230\005\231\005\246\000\000\003\218\000\000\000\000\003\219\005\132\000\000\000\000\000\000\000\000\000\000\005\197\003\223\000\000\005\220\006\183\006\184\000\000\000\000\006\230\003\216\003\217\001$\000\000\000\000\005\230\005\231\005\232\005\221\000\000\006\220\000\199\005\249\000\000\003\217\001$\000\000\000\000\005\234\000\000\003\217\001$\000\000\005\131\000\000\000\000\000\000\000\000\003\216\000\000\000\000\000\000\000\000\003\217\001$\005\232\005\131\000\000\005\230\005\231\003\218\000\000\005\131\003\219\005\132\005\197\005\234\000\000\004\158\000\000\000\000\000\000\000\000\003\218\000\000\005\131\003\219\005\132\003\223\003\218\005\220\003\216\003\219\005\132\000\000\000\000\000\000\000\000\005\232\000\000\000\000\000\000\003\218\000\000\005\221\003\219\005\132\005\197\005\252\005\234\004\159\004\160\004\161\006\224\004\171\000\000\006\225\000\000\000\000\000\000\000\000\004\163\006\228\000\000\000\000\000\000\000\000\000\000\003\217\001$\000\000\000\000\000\000\000\000\005\230\005\231\000\000\000\000\003\217\001$\000\000\004\172\003\223\000\000\005\220\015h\015j\000\000\000\000\000\000\005\131\000\000\000\000\000\000\000\000\000\000\000\000\003\216\005\221\000\000\005\131\000\000\005\255\000\000\005\232\000\000\005\197\003\218\000\000\000\000\003\219\005\132\000\000\000\000\003\223\005\234\005\220\003\218\000\000\005\197\003\219\005\132\006\229\000\000\000\000\005\197\000\000\000\000\005\230\005\231\005\221\000\000\000\000\000\000\006\002\000\000\000\000\000\000\005\197\000\000\000\000\000\000\000\000\001@\001$\000\000\000\000\000\000\000\000\000\000\000\000\003\216\004\167\000\000\000\000\000\000\003\217\001$\005\232\000\000\005\230\005\231\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\234\000\000\000\000\000\000\003\223\000\000\005\220\000\000\000\000\005\131\000\000\000\000\000\000\001A\003\216\001B\001E\003\223\000\000\005\220\005\221\005\232\000\000\003\223\006\005\005\220\003\218\000\000\000\000\003\219\005\132\000\000\005\234\005\221\005\197\000\000\003\223\006\b\005\220\005\221\000\000\000\000\000\000\006\011\005\197\000\000\003\217\001$\000\000\000\000\005\230\005\231\005\221\000\000\000\000\000\000\006\014\000\000\000\000\000\000\000\000\000\000\000\000\005\230\005\231\000\000\004\176\000\000\005\131\005\230\005\231\000\000\000\000\003\216\000\000\000\000\000\000\000\000\000\000\000\000\005\232\000\000\005\230\005\231\000\000\003\218\003\216\000\000\003\219\005\132\000\000\005\234\003\216\005\232\003\217\001$\004\177\004\166\000\000\005\232\000\000\003\223\000\000\005\220\005\234\003\216\000\000\003\217\001$\001F\005\234\003\223\005\232\005\220\000\000\000\000\005\131\005\221\000\000\000\000\000\000\006\017\005\197\005\234\000\000\000\000\004\185\005\221\000\000\005\131\000\000\006\020\000\000\003\218\000\000\000\000\003\219\005\132\000\000\000\000\000\000\000\000\000\000\001@\001$\000\000\003\218\005\230\005\231\003\219\005\132\000\000\000\000\003\226\000\000\000\000\000\000\005\230\005\231\000\000\000\000\000\000\000\000\000\000\003\217\001$\000\000\000\000\000\000\000\000\003\216\000\000\003\217\001$\000\000\000\000\003\223\005\232\003\228\000\000\003\216\005\197\001A\000\000\001B\001E\005\131\005\232\005\234\003\223\000\000\005\220\003\229\000\000\005\131\000\000\000\000\000\000\005\234\000\000\000\000\000\000\000\000\003\218\000\000\005\221\003\219\005\132\000\000\006\023\000\000\003\218\000\000\000\000\003\219\005\132\000\000\000\000\000\000\000\000\000\000\000\000\003\230\003\233\000\000\000\000\000\000\003\217\001$\005\197\000\000\000\000\000\000\000\000\000\000\005\230\005\231\000\000\000\000\000\000\000\000\000\000\005\197\000\000\000\000\003\216\000\000\000\000\003\223\005\131\005\220\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\216\000\000\000\000\000\000\003\217\001$\005\221\005\232\003\218\000\000\006\026\003\219\005\132\000\000\000\000\000\000\000\000\000\000\005\234\000\000\001F\000\000\000\000\000\000\000\000\000\000\005\131\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\230\005\231\003\223\000\000\005\220\005\197\000\000\003\218\000\000\000\000\003\219\005\132\000\000\005\197\000\000\003\223\000\000\005\220\005\221\000\000\000\000\000\000\006 \003\216\000\000\000\000\000\000\000\000\006A\000\000\005\232\005\221\000\000\000\000\000\000\006\031\000\000\000\000\000\000\000\000\000\000\005\234\000\000\004\158\000\000\000\000\000\000\000\000\005\230\005\231\000\000\003\223\000\000\003\228\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\230\005\231\000\000\000\000\003\217\001$\003\229\005\197\000\000\006\181\003\216\003\223\000\000\005\220\004\159\004\160\004\161\005\232\004\171\003\223\000\000\005\220\000\000\003\216\000\000\004\163\005\131\005\221\005\234\000\000\005\232\006#\000\000\000\000\000\000\005\221\003\230\003\233\000\000\006&\000\000\005\234\005\197\003\218\000\000\004\172\003\219\005\132\000\000\r\191\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\230\005\231\003\216\000\000\000\000\005k\005l\000\000\005\230\005\231\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\223\000\000\005\220\000\000\000\000\000\000\003\216\000\000\000\000\000\000\005\207\000\000\000\000\005\232\003\216\000\000\005\221\000\000\006\183\006\184\006)\005\232\n\232\n\234\005\234\000\000\000\000\005m\000\000\000\000\005n\005\208\005\234\006\220\000\199\003\223\000\000\005\220\000\000\000\000\000\000\000\000\004\167\003\149\000\000\000\000\005\230\005\231\000\000\005k\005l\005\221\000\000\000\000\000\000\006,\000\000\001z\005k\005l\001{\000\000\000\000\000\000\000\000\005\197\000\000\000\000\000\000\003\216\003\149\005\207\000\000\000\000\000\000\000\000\005\232\005k\005l\000\000\005\207\005\230\005\231\000\000\000\000\000\000\000\000\005\234\005m\000\000\000\000\005n\005\208\000\000\000\000\000\000\000\000\005m\000\000\005\207\005n\005\208\000\000\000\000\003\216\r\205\006\224\000\000\000\000\006\225\000\000\005\232\000\000\000\000\000\000\006\228\005m\000\000\000\000\005n\005\208\000\000\005\234\0063\000\000\004\176\003\150\003\151\005k\005l\012x\012|\003\223\000\000\005\220\000\000\000\000\000\000\005k\005l\000\000\003\178\000\199\000\000\000\000\000\000\000\000\001\129\005\221\000\000\005\207\000\000\006.\003\150\003\151\004\177\004\166\003\254\000\000\000\000\005\207\000\000\001\132\001\217\015\233\000\000\000\000\005m\003\178\000\199\005n\005\208\000\000\000\000\000\000\006\229\000\000\005m\005\230\005\231\005n\005\208\001\134\000\199\0063\004\185\000\000\000\000\000\000\000\000\006>\000\000\006L\0063\000\000\000\000\005k\005l\000\000\000\000\000\000\003\216\000\000\000\000\000\000\000\000\006M\000\000\005\232\000\000\007U\000\000\0063\000\000\003\182\000\000\000\000\003\183\005\207\005\234\000\000\000\000\000\000\003\186\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001@\001$\005m\006V\006Y\005n\005\208\000\000\003\182\000\000\000\000\003\183\000\000\003\217\001$\000\000\000\000\003\186\006>\000\000\006L\000\000\000\000\000\000\000\000\000\000\005\155\006>\000\000\006L\0063\001\139\000\000\006Z\006M\005\131\000\000\000\000\006N\001A\0063\015\028\001E\006M\006\\\000\000\006>\006R\006L\000\000\003\187\000\000\003\218\000\000\000\000\003\219\005\132\000\000\000\000\000\000\000\000\000\000\006M\000\000\006V\006Y\006U\000\000\000\000\000\000\000\000\000\000\000\000\006V\006Y\000\000\000\000\003\187\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\219\005\155\000\000\000\000\000\000\005{\006V\006Y\006Z\000\000\005\155\006>\0063\006L\000\000\000\000\000\000\006Z\000\000\006\\\000\000\006>\000\000\006L\000\000\000\000\000\000\006M\006\\\005\155\000\000\006[\005k\005l\000\000\000\000\006Z\006M\000\000\000\000\000\000\006]\000\000\001@\001$\000\000\000\000\006\\\000\000\001F\000\000\000\000\000\000\000\000\005\207\000\000\000\000\006V\006Y\000\000\000\000\000\000\005\197\000\000\005k\005l\000\000\006V\006Y\000\000\000\000\005m\000\000\000\000\005n\005\208\000\000\000\000\000\000\006>\005\155\006L\001A\000\000\r\254\001E\005\207\006Z\000\000\000\000\005\155\000\000\000\000\000\000\000\000\006M\000\000\006Z\006\\\006`\005k\005l\000\000\005m\003\149\000\000\005n\005\208\006\\\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\223\000\000\003\228\000\000\000\000\000\000\005\207\000\000\000\000\006V\006Y\000\000\000\000\003\223\000\000\005\220\003\229\000\000\000\000\000\000\000\000\000\000\000\000\005m\000\000\000\000\005n\005\208\000\000\005\221\000\000\000\000\005\155\006c\005k\005l\000\000\000\000\000\000\006Z\000\000\000\000\005k\005l\000\000\000\000\003\230\003\233\000\000\000\000\006\\\0063\000\000\000\000\000\000\000\000\005\207\000\000\000\000\005\230\005\231\000\000\001F\000\000\005\207\000\000\005k\005l\000\000\003\216\000\000\003\150\003\151\005m\000\000\n\215\005n\005\208\000\000\000\000\000\000\005m\003\216\0063\005n\005\208\003\178\000\199\005\207\005\232\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\234\000\000\000\000\000\000\000\000\005m\000\000\000\000\005n\005\208\000\000\000\000\000\000\000\000\005k\005l\000\000\000\000\006>\0063\006L\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\223\000\000\003\228\000\000\000\000\006M\000\000\005\207\000\000\006e\005k\005l\000\000\000\000\000\000\000\000\003\229\000\000\000\000\000\000\000\000\006>\000\000\006L\005m\000\000\000\000\005n\005\208\000\000\003\182\000\000\005\207\003\183\000\000\006V\006Y\006M\000\000\003\186\0063\006h\005k\005l\000\000\000\000\003\230\003\233\0063\005m\000\000\000\000\005n\005\208\000\000\000\000\000\000\006>\005\155\006L\000\000\000\000\000\000\000\000\005\207\006Z\000\000\006V\006Y\003\216\000\000\000\000\0063\006M\000\000\000\000\006\\\006k\000\000\000\000\000\000\005m\000\000\000\000\005n\005\208\000\000\000\000\000\000\000\000\005\155\000\000\000\000\000\000\000\000\000\000\000\000\006Z\000\000\003\187\000\000\000\000\000\000\006V\006Y\000\000\000\000\006>\006\\\006L\000\000\000\000\000\000\000\000\000\000\006>\000\000\006L\000\000\000\000\0063\000\000\000\000\006M\000\000\000\000\005\155\006n\000\000\000\000\000\000\006M\000\000\006Z\000\000\006q\005k\005l\000\000\006>\000\000\006L\000\000\000\000\006\\\0063\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006V\006Y\006M\000\000\000\000\005\207\006t\000\000\006V\006Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005m\005\155\0063\005n\005\208\000\000\000\000\000\000\006Z\005\155\006V\006Y\006>\000\000\006L\000\000\006Z\000\000\000\000\006\\\000\000\000\000\005k\005l\000\000\000\000\000\000\006\\\006M\000\000\000\000\000\000\006w\005\155\005k\005l\000\000\006>\000\000\006L\006Z\000\000\000\000\000\000\005\207\000\000\000\000\000\000\000\000\000\000\000\000\006\\\000\000\006M\000\000\000\000\005\207\006z\006V\006Y\000\000\005m\000\000\000\000\005n\005\208\000\000\000\000\000\000\006>\000\000\006L\000\000\005m\000\000\000\000\005n\005\208\000\000\000\000\000\000\005\155\000\000\006V\006Y\006M\005k\005l\006Z\006}\000\000\000\000\005k\005l\000\000\000\000\0063\000\000\000\000\006\\\000\000\000\000\000\000\000\000\000\000\000\000\005\155\000\000\005\207\000\000\000\000\005k\005l\006Z\005\207\006V\006Y\000\000\003\149\000\000\000\000\000\000\000\000\000\000\006\\\005m\000\000\000\000\005n\005\208\000\000\005m\000\000\005\207\005n\005\208\000\000\000\000\005\155\000\000\000\000\000\000\000\000\000\000\000\000\006Z\000\000\000\000\000\000\000\000\005m\000\000\000\000\005n\005\208\000\000\006\\\0063\000\000\000\000\000\000\000\000\000\000\006>\000\000\006L\000\000\000\000\000\000\0063\000\000\000\000\005k\005l\006\181\000\000\000\000\000\000\000\000\006M\000\000\000\000\000\000\006\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005k\005l\000\000\005\207\000\000\000\000\000\000\000\000\000\000\000\000\003\150\003\151\000\000\000\000\n\243\000\000\000\000\000\000\006V\006Y\005m\000\000\005\207\005n\005\208\003\178\000\199\000\000\000\000\000\000\0063\000\000\000\000\006>\000\000\006L\0063\000\000\000\000\005m\000\000\005\155\005n\005\208\000\000\006>\000\000\006L\006Z\006M\000\000\005k\005l\006\131\000\000\0063\000\000\000\000\000\000\006\\\000\000\006M\000\000\000\000\000\000\006\134\006\183\006\184\000\000\000\000\011u\000\000\000\000\005\207\000\000\000\000\000\000\000\000\000\000\006V\006Y\006\220\000\199\000\000\000\000\000\000\005k\005l\000\000\000\000\005m\006V\006Y\005n\005\208\000\000\000\000\006>\003\182\006L\000\000\003\183\005\155\006>\000\000\006L\000\000\003\186\005\207\006Z\000\000\000\000\000\000\006M\005\155\000\000\0063\006\137\000\000\006M\006\\\006Z\006>\006\140\006L\005m\000\000\000\000\005n\005\208\000\000\000\000\006\\\000\000\000\000\0063\000\000\000\000\006M\000\000\000\000\000\000\006\143\006V\006Y\000\000\000\000\000\000\000\000\006V\006Y\000\000\000\000\000\000\006\224\000\000\000\000\006\225\005k\005l\000\000\000\000\000\000\006\228\000\000\000\000\005\155\003\187\006V\006Y\000\000\000\000\005\155\006Z\000\000\000\000\000\000\000\000\000\000\006Z\005\207\000\000\000\000\006>\006\\\006L\0063\000\000\000\000\000\000\006\\\005\155\005k\005l\000\000\000\000\000\000\005m\006Z\006M\005n\005\208\006>\006\149\006L\000\000\000\000\000\000\000\000\006\\\000\000\000\000\000\000\000\000\005\207\000\000\000\000\000\000\006M\000\000\000\000\0063\006\148\006\229\005k\005l\000\000\000\000\000\000\006V\006Y\005m\000\000\000\000\005n\005\208\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\207\000\000\006V\006Y\000\000\000\000\005\155\006>\000\000\006L\003,\000\000\000\000\006Z\000\000\000\000\003-\005m\000\000\003.\005n\005\208\000\000\006M\006\\\005\155\000\000\006\152\003\217\001$\000\000\000\000\006Z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003,\000\000\006>\006\\\006L\000\000\003-\0063\000\000\003.\005\131\000\000\000\000\006V\006Y\000\000\000\000\000\000\006M\000\000\000\000\000\000\006\155\000\000\000\000\000\000\000\000\003\218\000\000\000\000\003\219\005\132\000\000\000\000\000\000\000\000\005\155\000\000\000\000\000\000\000\000\0063\000\000\006Z\000\000\000\000\000\000\000\000\006V\006Y\000\000\000\000\000\000\000\000\006\\\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0030\000\000\000\000\000\000\000\000\005\155\000\000\0063\006>\000\000\006L\0031\006Z\000\000\000\000\0033\0034\000\000\000\000\000\000\003,\000\000\000\000\006\\\006M\000\000\003-\000\000\006\158\003.\0030\000\000\000\000\000\000\003,\002\233\000\199\000\000\000\000\000\000\003-\0031\006>\003.\006L\0033\0034\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006V\006Y\000\000\005\197\006M\000\000\000\000\000\000\006\161\000\000\000\000\002\233\000\199\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006>\000\000\006L\005\155\000\000\000\000\000\000\000\000\000\000\000\000\006Z\000\000\000\000\003,\006V\006Y\006M\000\000\0035\003-\006\164\006\\\003.\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\155\000\000\000\000\000\000\000\000\0030\0037\006Z\000\000\006V\006Y\0035\000\000\003\223\000\000\005\220\0031\000\000\006\\\0030\0033\0034\000\000\000\000\000\000\000\000\000\000\003>\006\178\005\221\0031\000\000\005\155\006\170\0033\0034\0037\000\000\000\000\006Z\002\233\000\199\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\\\005k\005l\000\000\002\233\000\199\000\000\003>\006\231\005\230\005\231\0039\000\000\000\000\000\000\000\000\001\144\000\000\003<\000\000\005k\005l\0030\005\207\000\000\000\000\003\149\000\000\000\000\000\000\000\000\000\000\003\216\0031\000\000\001@\001$\0033\0034\005\232\005m\0039\005\207\005n\005\208\000\000\001\144\0035\003<\000\000\005\234\000\000\000\000\005k\005l\000\000\000\000\002\233\000\199\005m\000\000\0035\005n\005\208\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0037\000\000\001A\005\207\001D\001E\005k\005l\000\000\000\000\000\000\000\000\000\000\000\000\0037\000\000\000\000\000\000\000\000\000\000\005m\003>\006\192\005n\005\208\000\000\000\000\000\000\005\207\000\000\000\000\000\000\000\000\000\000\000\000\003>\006\195\003\150\003\151\005k\005l\011|\0035\000\000\000\000\005m\000\000\000\000\005n\005\208\000\000\000\000\003\178\000\199\000\000\0039\000\000\000\000\005k\005l\001\144\005\207\003<\000\000\0063\000\000\000\000\0037\000\000\0039\000\000\005k\005l\003\149\001\144\000\000\003<\000\000\005m\000\000\005\207\005n\005\208\0063\000\000\000\000\000\000\000\000\003>\006\233\000\000\000\000\000\000\005\207\000\000\000\000\000\000\005m\001F\000\000\005n\005\208\000\000\000\000\000\000\000\000\000\000\000\000\014K\000\000\005m\000\000\000\000\005n\005\208\000\000\0063\000\000\000\000\000\000\000\000\000\000\0039\000\000\000\000\003\182\000\000\001\144\003\183\003<\000\000\006>\000\000\006L\003\186\000\000\000\000\005k\005l\000\000\000\000\0063\000\000\000\000\000\000\000\000\000\000\006M\000\000\000\000\006>\007\005\006L\000\000\000\000\000\000\003\150\003\151\000\000\005\207\003\254\000\000\005k\005l\000\000\003\223\006M\003\228\000\000\000\000\007\015\003\178\000\199\000\000\0063\000\000\005m\006V\006Y\005n\005\208\003\229\000\000\006>\005\207\006L\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0063\003\187\000\000\006V\006Y\000\000\006M\005\155\005m\000\000\007\021\005n\005\208\0063\006Z\006>\000\000\006L\003\230\003\233\000\000\000\000\000\000\003\149\000\000\006\\\005\155\000\000\000\000\000\000\000\000\006M\000\000\006Z\000\000\007\026\006V\006Y\004\158\000\000\000\000\003\216\000\000\000\000\006\\\000\000\000\000\000\000\006>\000\000\006L\003\182\000\000\000\000\003\183\000\000\000\000\000\000\014\252\005\155\003\186\006V\006Y\000\000\006M\000\000\006Z\006>\007!\006L\004\159\t$\t)\000\000\004\171\000\000\000\000\006\\\000\000\0063\006>\004\163\006L\006M\005\155\000\000\000\000\007(\000\000\005k\005l\006Z\000\000\000\000\006V\006Y\006M\000\000\000\000\000\000\007>\004\172\006\\\000\000\0063\tO\003\150\003\151\005k\005l\003\254\005\207\000\000\006V\006Y\000\000\000\000\005\155\000\000\000\000\003\187\003\178\000\199\000\000\006Z\004\158\006V\006Y\005m\000\000\005\207\005n\005\208\000\000\000\000\006\\\005\155\000\000\000\000\000\000\000\000\005k\005l\006Z\000\000\000\000\006>\005m\006L\005\155\005n\005\208\000\000\000\000\006\\\000\000\006Z\004\159\004\160\004\161\000\000\004\171\006M\005\207\000\000\000\000\007F\006\\\004\163\000\000\000\000\006>\004\167\006L\000\000\000\000\000\000\000\000\000\000\000\000\005m\000\000\000\000\005n\005\208\000\000\000\000\006M\004\232\005k\005l\007L\006V\006Y\003\182\000\000\000\000\003\183\000\000\005k\005l\000\000\000\000\003\186\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\207\000\000\000\000\000\000\005\155\000\000\006V\006Y\000\000\000\000\005\207\006Z\000\000\0063\000\000\000\000\t\131\005m\000\000\000\000\005n\005\208\006\\\004\158\000\000\000\000\000\000\005m\001y\005\155\005n\005\208\0063\000\000\001z\000\000\006Z\001{\000\000\000\000\000\000\000\000\003\217\001$\004\176\000\000\000\000\006\\\004\167\000\000\005k\005l\003\187\000\000\000\000\004\159\004\160\004\161\000\000\004\171\000\000\000\000\000\000\000\000\005\131\0063\004\163\000\000\000\000\000\000\000\000\000\000\005\207\000\000\004\177\004\166\000\000\000\000\000\000\000\000\006>\003\218\006L\000\000\003\219\005\132\004\172\005T\000\000\005m\004\180\000\000\005n\005\208\000\000\000\000\006M\000\000\000\000\006>\007Y\006L\000\000\000\000\004\185\000\000\000\000\000\000\005k\005l\000\000\000\000\000\000\0063\000\000\006M\000\000\000\000\000\000\007\\\000\000\000\000\000\000\0063\001\129\000\000\006V\006Y\000\000\000\000\005\207\004\176\006>\000\000\006L\001\130\000\000\000\000\000\000\001\132\001\133\000\000\000\000\000\000\000\000\006V\006Y\005m\006M\005\155\005n\005\208\007`\000\000\000\000\000\000\006Z\004\167\000\000\001\134\000\199\004\177\004\166\000\000\000\000\000\000\000\000\006\\\005\155\000\000\000\000\000\000\005k\005l\000\000\006Z\000\000\005\197\006V\006Y\006>\007\173\006L\000\000\000\000\0063\006\\\000\000\000\000\000\000\006>\004\185\006L\000\000\005\207\000\000\006M\000\000\000\000\000\000\007f\005\155\000\000\000\000\000\000\000\000\006M\000\000\006Z\000\000\007i\005m\001y\000\000\005n\005\208\001\137\005Z\001z\006\\\000\000\001{\000\000\000\000\000\000\000\000\006V\006Y\000\000\001y\000\000\000\000\000\000\000\000\000\000\001z\006V\006Y\001{\000\000\004\176\001\139\000\000\0063\003\223\000\000\005\220\000\000\000\000\005\155\000\000\004\158\006>\000\000\006L\000\000\006Z\000\000\000\000\005\155\005\221\000\000\001\147\007\153\007\139\000\000\006Z\006\\\006M\000\000\004\177\004\166\007\146\000\000\000\000\000\000\000\000\006\\\000\000\000\000\000\000\000\000\000\000\004\159\004\160\004\161\000\000\004\171\000\000\000\000\005\230\005\231\000\000\000\000\004\163\000\000\001\141\000\000\006V\006Y\004\185\001\144\000\000\001\146\000\000\000\000\000\000\0063\001\129\000\000\006>\000\000\006L\003\216\004\172\005T\005k\005l\004\180\001\130\005\232\005\155\000\000\001\132\001\133\001\129\006M\000\000\006Z\000\000\007\155\005\234\000\000\000\000\000\000\003\149\001\130\000\000\005\207\006\\\001\132\001\133\000\000\001\134\000\199\000\000\000\000\000\000\000\000\005k\005l\000\000\000\000\000\000\000\000\005m\006V\006Y\005n\005\208\001\134\000\199\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\023\005\207\000\000\000\000\006>\000\000\006L\000\000\000\000\005\155\000\000\000\000\000\000\000\000\000\000\004\167\006Z\000\000\005m\000\000\006M\005n\005\208\000\000\007\161\000\000\000\000\006\\\000\000\000\000\001\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\168\005k\005l\000\000\000\000\000\000\005k\005l\001\137\003\150\003\151\006V\006Y\003\254\000\000\000\000\001\139\000\000\000\000\000\000\000\000\000\000\000\000\005\207\003\178\000\199\000\000\000\000\005\207\000\000\000\000\000\000\000\000\001\139\005\155\000\000\005Z\001\147\007\184\000\000\005m\006Z\0063\005n\005\208\005m\000\000\000\000\005n\005\208\000\000\000\000\006\\\000\000\001\147\007\189\000\000\000\000\000\000\004\176\005k\005l\000\000\000\000\000\000\005k\005l\000\000\000\000\000\000\000\000\001\141\000\000\000\000\000\000\0063\001\144\000\000\001\146\000\000\000\000\000\000\005\207\000\000\000\000\000\000\000\000\005\207\001\141\004\177\004\166\000\000\000\000\001\144\000\000\001\146\000\000\003\182\000\000\005m\003\183\000\000\005n\005\208\005m\000\000\003\186\005n\005\208\006>\000\000\006L\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\185\000\000\000\000\000\000\000\000\000\000\006M\005k\005l\000\000\007\186\000\000\000\000\000\000\000\000\000\000\000\000\0063\000\000\005k\005l\000\000\0063\006>\000\000\006L\000\000\000\000\000\000\005\207\000\000\000\000\003\217\001$\000\000\000\000\006V\006Y\000\000\006M\000\000\005\207\000\000\007\191\000\000\000\000\005m\003\187\000\000\005n\005\208\000\000\000\000\000\000\005\131\000\000\000\000\000\000\005m\005\155\000\000\005n\005\208\000\000\000\000\000\000\006Z\000\000\000\000\006V\006Y\003\218\000\000\000\000\003\219\005\132\0063\006\\\000\000\000\000\000\000\0063\000\000\000\000\006>\000\000\006L\000\000\000\000\006>\000\000\006L\005\155\000\000\000\000\000\000\000\000\000\000\000\000\006Z\006M\000\000\000\000\000\000\007\194\006M\000\000\000\000\000\000\007\198\006\\\000\000\000\000\000\000\000\000\003\149\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005k\005l\000\000\006V\006Y\000\000\000\000\000\000\006V\006Y\000\000\000\000\003\217\001$\000\000\0063\006>\000\000\006L\000\000\000\000\006>\005\207\006L\000\000\000\000\005\155\0063\000\000\000\000\000\000\005\155\006M\006Z\005\131\000\000\007\206\006M\006Z\005m\005\197\007\210\005n\005\208\006\\\000\000\000\000\000\000\000\000\006\\\000\000\003\218\000\000\000\000\003\219\005\132\000\000\000\000\000\000\000\000\000\000\000\000\006V\006Y\000\000\000\000\000\000\006V\006Y\000\000\000\000\003\150\003\151\003\217\001$\011\181\000\000\000\000\005k\005l\000\000\000\000\006>\000\000\006L\005\155\003\178\000\199\000\000\000\000\005\155\000\000\006Z\000\000\006>\005\131\006L\006Z\006M\000\000\005\207\000\000\007\220\006\\\000\000\000\000\000\000\003\223\006\\\005\220\006M\000\000\003\218\000\000\007\240\003\219\005\132\005m\000\000\000\000\005n\005\208\000\000\005\221\001y\000\000\000\000\007\248\006V\006Y\001z\000\000\000\000\001{\000\000\0063\000\000\000\000\000\000\000\000\006V\006Y\000\000\000\000\000\000\000\000\000\000\005\197\000\000\000\000\000\000\005\155\000\000\005\230\005\231\000\000\000\000\000\000\006Z\003\182\000\000\000\000\003\183\005\155\005k\005l\000\000\000\000\003\186\006\\\006Z\000\000\000\000\000\000\000\000\000\000\003\216\000\000\000\000\000\000\000\000\006\\\000\000\005\232\000\000\000\000\005\207\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006>\005m\006L\000\000\005n\005\208\005\197\000\000\000\000\000\000\000\000\0063\003\223\000\000\005\220\000\000\006M\000\000\001\129\000\000\007\251\003,\000\000\000\000\000\000\000\000\003\187\003-\005\221\001\130\003.\000\000\b\005\001\132\001\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001@\001$\000\000\006V\006Y\000\000\000\000\000\000\000\000\000\000\001\134\000\199\000\000\000\000\000\000\005\230\005\231\000\000\000\000\000\000\000\000\003\217\001$\000\000\000\000\000\000\005\155\000\000\000\000\000\000\003\223\000\000\005\220\006Z\000\000\006>\000\000\006L\003\216\001A\000\000\003\222\001E\005\131\006\\\005\232\005\221\000\000\000\000\000\000\b\t\006M\003,\000\000\0063\b1\005\234\000\000\003-\000\000\003\218\003.\001y\003\219\005\132\000\000\000\000\001\137\001z\000\000\000\000\001{\000\000\000\000\0030\000\000\005\230\005\231\000\000\000\000\000\000\006V\006Y\000\000\000\000\0031\000\000\000\000\000\000\0033\0034\000\000\001\139\000\000\000\000\000\000\000\000\000\000\000\000\003\216\000\000\000\000\000\000\000\000\005\155\000\000\005\232\000\000\000\000\002\233\000\199\006Z\000\000\001\147\b\015\000\000\000\000\005\234\000\000\000\000\000\000\006>\006\\\006L\000\000\001y\000\000\000\000\000\000\000\000\000\000\001z\000\000\000\000\001{\001F\000\000\006M\000\000\000\000\000\000\b5\000\000\000\000\000\000\000\000\000\000\001\141\0030\000\000\000\000\001y\001\144\000\000\001\146\000\000\005\197\001z\001\129\0031\001{\000\000\000\000\0033\0034\000\000\0035\006V\006Y\001\130\000\000\000\000\000\000\001\132\001\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\233\000\199\000\000\000\000\000\000\000\000\000\000\005\155\0037\000\000\001\134\000\199\000\000\000\000\006Z\000\000\000\000\000\000\000\000\003\223\000\000\003\228\000\000\000\000\000\000\006\\\000\000\000\000\000\000\003>\bT\000\000\000\000\000\000\000\000\003\229\000\000\000\000\001\129\003,\003\223\000\000\005\220\000\000\000\000\003-\000\000\000\000\003.\001\130\000\000\000\000\003,\001\132\001\133\000\000\005\221\0035\003-\000\000\t\024\003.\000\000\0039\001\129\003\230\003\233\001\137\001\144\000\000\003<\000\000\000\000\001\134\000\199\001\130\000\000\000\000\000\000\001\132\001\133\000\000\0037\000\000\000\000\000\000\005\230\005\231\003\216\001y\000\000\000\000\001\139\000\000\000\000\001z\000\000\000\000\001{\001\134\000\199\000\000\001y\003>\b^\000\000\000\000\000\000\001z\003\216\000\000\001{\000\000\001\147\b|\000\000\005\232\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\234\000\000\000\000\001\137\000\000\000\000\000\000\000\000\0030\000\000\0039\000\000\003\149\000\000\000\000\001\144\000\000\003<\000\000\0031\001\141\0030\000\000\0033\0034\001\144\000\000\001\146\001\139\001\137\000\000\000\000\0031\000\000\000\000\000\000\0033\0034\003\217\001$\000\000\000\000\000\000\002\233\000\199\000\000\001y\000\000\000\000\001\147\b\143\000\000\001z\000\000\001\139\001{\002\233\000\199\001\129\000\000\005\131\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\130\000\000\001\129\000\000\001\132\001\133\001\147\b\146\003\218\000\000\000\000\003\219\005\132\001\130\001\141\000\000\004\158\001\132\001\133\001\144\000\000\001\146\000\000\000\000\001\134\000\199\003\150\003\151\000\000\000\000\011\220\0035\000\000\000\000\000\000\000\000\000\000\001\134\000\199\000\000\001\141\003\178\000\199\000\000\0035\001\144\000\000\001\146\004\159\t$\t)\000\000\004\171\003\217\001$\000\000\0037\000\000\000\000\004\163\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0037\000\000\000\000\000\000\001\129\000\000\005\131\000\000\003>\b\193\004\172\000\000\001\137\000\000\tO\001\130\000\000\000\000\000\000\001\132\001\133\003>\b\196\003\218\000\000\001\137\003\219\005\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\197\000\000\001\139\000\000\001\134\000\199\000\000\0039\000\000\000\000\003\182\000\000\001\144\003\183\003<\001\139\000\000\000\000\000\000\003\186\0039\000\000\000\000\001\147\t\011\001\144\000\000\003<\000\000\003\217\001$\000\000\000\000\000\000\000\000\000\000\001\147\t\019\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\167\000\000\000\000\000\000\000\000\005\131\000\000\000\000\000\000\000\000\004\158\001\141\000\000\000\000\000\000\001\137\001\144\000\000\001\146\000\000\000\000\003\223\003\218\005\220\001\141\003\219\005\132\000\000\000\000\001\144\000\000\001\146\000\000\003\187\000\000\000\000\000\000\005\221\005\197\000\000\001\139\t\027\004\159\004\160\004\161\000\000\004\171\000\000\004\158\000\000\003\149\000\000\000\000\004\163\000\000\t\178\000\000\000\000\000\000\000\000\000\000\001\147\t&\000\000\000\000\000\000\000\000\005\230\005\231\000\000\000\000\000\000\000\000\004\172\005T\000\000\000\000\004\180\000\000\001y\004\159\004\160\004\161\004\176\004\171\001z\000\000\001y\001{\000\000\003\216\004\163\000\000\001z\000\000\001\141\001{\005\232\000\000\000\000\001\144\000\000\001\146\000\000\000\000\003\223\000\000\005\220\005\234\000\000\000\000\004\172\005T\004\177\004\166\004\180\003\217\001$\005\197\000\000\000\000\005\221\000\000\000\000\000\000\t(\000\000\000\000\003\217\001$\000\000\000\000\000\000\003\150\003\151\000\000\000\000\011\228\005\131\000\000\000\000\000\000\000\000\004\185\004\167\000\000\000\000\000\000\003\178\000\199\005\131\005\230\005\231\000\000\000\000\003\218\000\000\000\000\003\219\005\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\218\t:\000\000\003\219\005\132\000\000\000\000\003\216\001\129\000\000\000\000\000\000\000\000\000\000\005\232\004\167\001\129\000\000\003\223\001\130\005\220\000\000\000\000\001\132\001\133\005\234\000\000\001\130\000\000\000\000\000\000\001\132\001\133\000\000\005\221\000\000\000\000\005Z\t.\t5\003\217\001$\000\000\001\134\000\199\000\000\000\000\000\000\000\000\000\000\000\000\001\134\000\199\000\000\003\182\000\000\000\000\003\183\000\000\000\000\004\176\000\000\005\131\003\186\005\230\005\231\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\217\001$\005Z\000\000\000\000\000\000\003\218\000\000\000\000\003\219\005\132\005\197\000\000\000\000\003\216\000\000\000\000\004\177\004\166\000\000\000\000\005\232\005\131\005\197\000\000\004\176\000\000\001\137\000\000\000\000\000\000\000\000\005\234\004\158\006\181\001\137\000\000\000\000\000\000\003\218\000\000\000\000\003\219\005\132\000\000\000\000\000\000\004\185\000\000\000\000\003\187\000\000\001\139\000\000\000\000\004\177\004\166\000\000\000\000\000\000\001\139\000\000\000\000\000\000\000\000\004\159\004\160\004\161\000\000\004\171\000\000\000\000\000\000\001\147\tC\000\000\004\163\000\000\003\223\000\000\005\220\001\147\tH\000\000\000\000\004\185\000\000\000\000\000\000\000\000\003\223\000\000\005\220\000\000\005\221\000\000\004\172\005T\tE\001y\004\180\000\000\005\197\000\000\000\000\001z\005\221\001\141\001{\004\158\tJ\000\000\001\144\000\000\001\146\001\141\000\000\006\183\006\184\000\000\001\144\012\011\001\146\000\000\005\230\005\231\000\000\000\000\000\000\000\000\000\000\000\000\006\220\000\199\000\000\005\197\005\230\005\231\000\000\000\000\000\000\004\159\004\160\004\161\000\000\004\171\000\000\003\216\000\000\000\000\000\000\000\000\004\163\000\000\005\232\000\000\000\000\000\000\000\000\003\216\000\000\000\000\000\000\000\000\000\000\005\234\005\232\004\167\000\000\003\223\000\000\005\220\004\172\005T\000\000\000\000\004\180\005\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\221\000\000\000\000\001y\tM\000\000\to\000\000\000\000\001z\001\129\000\000\001{\000\000\000\000\000\000\004\158\003\223\000\000\005\220\006\224\001\130\000\000\006\225\000\000\001\132\001\133\000\000\000\000\006\228\005\230\005\231\000\000\005\221\004\158\000\000\000\000\tQ\000\000\000\000\000\000\000\000\005Z\000\000\000\000\001\134\000\199\000\000\004\159\004\160\004\161\000\000\004\171\003\216\000\000\000\000\000\000\000\000\004\167\004\163\005\232\000\000\000\000\005\230\005\231\004\176\004\159\004\160\004\161\000\000\004\171\005\234\000\000\004\158\000\000\000\000\000\000\004\163\000\000\004\172\005T\000\000\tj\004\180\000\000\000\000\003\216\000\000\000\000\006\229\004\158\000\000\000\000\005\232\000\000\004\177\004\166\004\172\005T\001\129\000\000\004\180\001\137\000\000\005\234\004\159\004\160\004\161\000\000\004\171\001\130\000\000\000\000\000\000\001\132\001\133\004\163\000\000\005Z\000\000\000\000\000\000\004\159\004\160\004\161\004\185\004\171\001\139\000\000\000\000\000\000\000\000\000\000\004\163\001\134\000\199\004\172\005T\000\000\000\000\004\180\004\176\000\000\000\000\000\000\004\158\000\000\000\000\001\147\t\152\004\167\000\000\000\000\004\172\005T\000\000\000\000\004\180\000\000\000\000\000\000\005k\005l\000\000\000\000\000\000\000\000\000\000\004\167\000\000\000\000\004\177\004\166\000\000\t\243\000\000\000\000\004\159\004\160\004\161\000\000\004\171\001\141\005\207\000\000\000\000\000\000\001\144\004\163\001\146\000\000\001\137\t\238\005k\005l\000\000\000\000\000\000\000\000\000\000\005m\004\185\000\000\005n\005\208\000\000\000\000\004\167\004\172\005T\005Z\000\000\004\180\000\000\000\000\005\207\001\139\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\167\000\000\000\000\000\000\005Z\000\000\000\000\n=\005m\004\176\000\000\005n\005\208\001\147\n\024\000\000\000\000\000\000\000\000\000\000\000\000\001#\001$\000\000\nN\000\000\000\000\004\176\005k\005l\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\177\004\166\000\000\000\000\005Z\000\000\000\000\000\000\001\141\000\000\000\000\005\207\000\000\001\144\000\000\001\146\004\167\000\000\004\177\004\166\000\000\005Z\001%\000\000\014C\003\217\001$\004\176\005m\000\000\004\185\005n\005\208\0063\000\000\000\000\000\000\000\000\000\000\000\000\nJ\000\000\000\000\000\000\004\176\000\000\000\000\005\131\004\185\000\000\005k\005l\000\000\000\000\000\000\000\000\000\000\004\177\004\166\000\000\000\000\000\000\000\000\000\000\003\218\0063\000\000\003\219\005\132\000\000\000\000\000\000\005\207\000\000\004\177\004\166\005Z\000\000\000\000\000\000\000\000\000\000\000\000\005k\005l\000\000\000\000\004\185\000\000\005m\000\000\000\000\005n\005\208\000\000\000\000\000\000\000\000\000\000\004\176\006>\000\000\006L\000\000\004\185\005\207\000\000\000\000\000\000\000\000\000\000\005k\005l\000\000\000\000\000\000\006M\014D\000\000\000\000\nb\000\000\005m\000\000\0063\005n\005\208\000\000\000\000\004\177\004\166\000\000\006>\005\207\006L\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006V\006Y\006M\000\000\005m\000\000\nh\005n\005\208\000\000\000\000\000\000\000\000\004\185\005\197\000\000\001#\001$\000\000\000\000\000\000\000\000\000\000\005\155\000\000\000\000\000\000\005k\005l\000\000\006Z\000\000\006V\006Y\000\000\005k\005l\000\000\003\223\0063\014h\006\\\000\000\000\000\000\000\006>\000\000\006L\000\000\005\207\000\000\000\000\000\000\000\000\014i\005\155\015\157\005\207\014C\000\000\000\000\006M\006Z\000\000\000\000\nk\005m\000\000\000\000\005n\005\208\000\000\0063\006\\\005m\000\000\000\000\005n\005\208\000\000\000\000\003\223\000\000\005\220\014j\014k\000\000\000\000\000\000\000\000\000\000\006V\006Y\000\000\000\000\000\000\000\000\005\221\000\000\000\000\0063\nm\000\000\000\000\000\000\000\000\006>\003\216\006L\000\000\000\000\000\000\000\000\000\000\005\155\000\000\000\000\000\000\000\000\000\000\000\000\006Z\006M\000\000\000\000\000\000\no\005\230\005\231\000\000\000\000\000\000\006\\\000\000\005k\005l\000\000\000\000\000\000\006>\000\000\006L\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\216\014D\006V\006Y\000\000\006M\005\207\005\232\000\000\nr\000\000\000\000\0063\000\000\000\000\000\000\000\000\006>\005\234\006L\0063\000\000\000\000\005m\000\000\005\155\005n\005\208\000\000\000\000\000\000\000\000\006Z\006M\000\000\006V\006Y\nu\000\000\000\000\000\000\000\000\000\000\006\\\000\000\000\000\001y\000\000\000\000\005k\005l\000\000\001z\000\000\000\000\001{\000\000\000\000\005\155\000\000\000\000\000\000\000\000\006V\006Y\006Z\000\000\000\000\003\223\000\000\014h\005\207\000\000\000\000\005k\005l\006\\\000\000\000\000\006>\000\000\006L\000\000\000\000\014i\000\000\005\155\006>\005m\006L\000\000\005n\005\208\006Z\000\000\006M\005\207\000\000\000\000\nx\000\000\000\000\000\000\006M\006\\\000\000\000\000\n{\005k\005l\000\000\000\000\000\000\005m\014j\014k\005n\005\208\000\000\0063\000\000\000\000\000\000\000\000\000\000\006V\006Y\000\000\000\000\000\000\005\207\000\000\000\000\006V\006Y\000\000\000\000\003\216\000\000\000\000\005k\005l\001\129\000\000\000\000\000\000\000\000\005m\005\155\000\000\005n\005\208\000\000\001\130\000\000\006Z\005\155\001\132\001\133\000\000\000\000\000\000\005\207\006Z\000\000\000\000\006\\\000\000\000\000\000\000\000\000\000\000\005k\005l\006\\\000\000\000\000\001\134\000\199\005m\000\000\000\000\005n\005\208\0063\000\000\006>\000\000\006L\000\000\000\000\000\000\000\000\000\000\005\207\000\000\000\000\005k\005l\000\000\000\000\000\000\006M\000\000\000\000\000\000\n~\000\000\000\000\0063\000\000\005m\000\000\000\000\005n\005\208\000\000\000\000\000\000\005\207\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006V\006Y\001\137\000\000\005m\000\000\000\000\005n\005\208\000\000\000\000\0063\000\000\000\000\000\000\005k\005l\000\000\000\000\006>\000\000\006L\000\000\005\155\000\000\000\000\000\000\001\139\005k\005l\006Z\000\000\000\000\000\000\000\000\006M\000\000\005\207\000\000\n\129\000\000\006\\\000\000\0063\006>\000\000\006L\000\000\001\147\011J\005\207\000\000\000\000\000\000\005m\000\000\000\000\005n\005\208\000\000\006M\000\000\000\000\000\000\n\132\006V\006Y\005m\000\000\000\000\005n\005\208\000\000\000\000\000\000\0063\000\000\000\000\006>\000\000\006L\000\000\001\141\000\000\000\000\000\000\000\000\001\144\005\155\001\146\006V\006Y\000\000\000\000\006M\006Z\005k\005l\n\135\000\000\0063\000\000\000\000\000\000\000\000\000\000\006\\\000\000\000\000\000\000\006>\000\000\006L\005\155\000\000\000\000\000\000\000\000\005\207\000\000\006Z\000\000\000\000\000\000\006V\006Y\006M\000\000\000\000\000\000\n\138\006\\\000\000\005k\005l\005m\000\000\000\000\005n\005\208\000\000\000\000\006>\000\000\006L\000\000\000\000\005\155\000\000\000\000\0063\000\000\000\000\000\000\006Z\005\207\006V\006Y\006M\000\000\000\000\000\000\n\141\0063\000\000\006\\\000\000\006>\000\000\006L\000\000\000\000\005m\000\000\000\000\005n\005\208\000\000\000\000\005\155\000\000\000\000\000\000\006M\005k\005l\006Z\n\144\006V\006Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\\\000\000\005k\005l\000\000\000\000\000\000\000\000\000\000\005\207\000\000\000\000\000\000\000\000\005\155\000\000\006V\006Y\000\000\000\000\006>\006Z\006L\000\000\005\207\000\000\005m\000\000\000\000\005n\005\208\000\000\006\\\006>\0063\006L\006M\000\000\000\000\005\155\n\147\005m\000\000\000\000\005n\005\208\006Z\000\000\000\000\006M\000\000\000\000\000\000\n\150\000\000\000\000\000\000\006\\\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006V\006Y\000\000\000\000\000\000\0063\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006V\006Y\000\000\000\000\000\000\005k\005l\000\000\000\000\000\000\005\155\000\000\000\000\005k\005l\000\000\000\000\006Z\000\000\000\000\000\000\000\000\006>\005\155\006L\000\000\000\000\005\207\006\\\000\000\006Z\000\000\000\000\000\000\000\000\005\207\000\000\000\000\006M\000\000\000\000\006\\\n\153\0063\005m\000\000\000\000\005n\005\208\000\000\000\000\000\000\005m\000\000\000\000\005n\005\208\000\000\0063\006>\000\000\006L\000\000\000\000\000\000\000\000\000\000\000\000\006V\006Y\000\000\000\000\000\000\000\000\000\000\006M\000\000\000\000\000\000\n\156\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\155\000\000\000\000\005k\005l\000\000\000\000\006Z\000\000\000\000\000\000\000\000\000\000\000\000\006V\006Y\000\000\000\000\006\\\006>\000\000\006L\001@\001$\000\000\005\207\000\000\000\000\000\000\000\000\000\000\005k\005l\000\000\006>\006M\006L\005\155\000\000\n\162\005k\005l\005m\000\000\006Z\005n\005\208\000\000\000\000\0063\006M\000\000\000\000\005\207\n\161\006\\\000\000\0063\000\000\000\000\000\000\001A\005\207\003\235\001E\006V\006Y\000\000\000\000\000\000\005m\000\000\000\000\005n\005\208\000\000\000\000\000\000\000\000\005m\006V\006Y\005n\005\208\000\000\000\000\000\000\000\000\005\155\000\000\000\000\000\000\005k\005l\000\000\006Z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\155\000\000\000\000\006\\\000\000\000\000\000\000\006Z\000\000\000\000\000\000\005\207\000\000\006>\000\000\006L\001@\001$\006\\\000\000\000\000\006>\000\000\006L\000\000\000\000\000\000\000\000\005m\006M\000\000\005n\005\208\n\165\000\000\0063\000\000\006M\000\000\000\000\000\000\n\168\000\000\000\000\005k\005l\000\000\000\000\000\000\000\000\000\000\000\000\005k\005l\001F\001A\000\000\003\240\001E\006V\006Y\000\000\000\000\0063\000\000\000\000\005\207\006V\006Y\000\000\000\000\000\000\0063\000\000\005\207\000\000\000\000\005k\005l\000\000\000\000\000\000\005\155\005m\000\000\000\000\005n\005\208\000\000\006Z\005\155\005m\000\000\000\000\005n\005\208\000\000\006Z\000\000\005\207\006\\\000\000\006>\000\000\006L\000\000\000\000\000\000\006\\\000\000\000\000\000\000\000\000\000\000\005k\005l\005m\000\000\006M\005n\005\208\003\223\n\171\003\228\0063\000\000\000\000\000\000\000\000\004z\006>\000\000\006L\000\000\000\000\000\000\005\207\003\229\000\000\006>\000\000\006L\000\000\000\000\000\000\000\000\006M\000\000\006V\006Y\n\174\001F\000\000\005m\000\000\006M\005n\005\208\000\000\n\177\000\000\004{\004|\004}\000\000\004\145\000\000\003\230\003\233\000\000\000\000\005\155\004\127\000\000\000\000\000\000\006V\006Y\006Z\0063\000\000\000\000\005k\005l\000\000\006V\006Y\0063\000\000\006\\\003\216\006>\004\146\006L\000\000\000\000\005<\000\000\000\000\005\155\000\000\000\000\000\000\000\000\005\207\000\000\006Z\006M\005\155\000\000\000\000\n\185\0063\000\000\000\000\006Z\000\000\006\\\003\223\000\000\003\228\005m\000\000\000\000\005n\005\208\006\\\000\000\000\000\000\000\005k\005l\000\000\000\000\003\229\000\000\000\000\006V\006Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006>\000\000\006L\0063\000\000\000\000\005\207\000\000\006>\000\000\006L\000\000\000\000\000\000\005\155\000\000\006M\004\131\003\230\003\233\n\188\006Z\000\000\005m\006M\000\000\005n\005\208\n\191\000\000\001y\000\000\006\\\006>\000\000\006L\001z\000\000\000\000\001{\000\000\003\216\000\000\000\000\000\000\000\000\006V\006Y\000\000\006M\000\000\000\000\000\000\n\194\006V\006Y\000\000\000\000\000\000\001y\000\000\000\000\000\000\000\000\000\000\001z\000\000\000\000\001{\005\155\006>\0063\006L\000\000\000\000\000\000\006Z\005\155\000\000\006V\006Y\000\000\000\000\000\000\006Z\000\000\006M\006\\\000\000\000\000\n\200\000\000\000\000\003\217\001$\006\\\000\000\000\000\000\000\000\000\004\150\000\000\005\155\000\000\001y\000\000\000\000\000\000\000\000\006Z\001z\000\000\000\000\001{\000\000\005\131\006V\006Y\000\000\0063\006\\\000\000\000\000\000\000\000\000\000\000\001\129\000\000\000\000\000\000\004\151\004\130\003\218\000\000\000\000\003\219\005\132\001\130\006>\005\155\006L\001\132\001\133\000\000\000\000\000\000\006Z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006M\001\129\000\000\006\\\n\203\000\000\004\251\001\134\000\199\000\000\000\000\000\000\001\130\000\000\000\000\000\000\001\132\001\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006V\006Y\006>\000\000\006L\000\000\001\134\000\199\000\000\000\000\000\000\005k\005l\000\000\000\000\000\000\001\129\000\000\006M\000\000\000\000\000\000\011l\005\155\000\000\000\000\000\000\001\130\000\000\001y\006Z\001\132\001\133\005\207\001\137\001z\000\000\000\000\001{\000\000\000\000\006\\\000\000\000\000\005\197\000\000\000\000\000\000\006V\006Y\005m\001\134\000\199\005n\005\208\000\000\000\000\000\000\000\000\001\139\003,\000\000\000\000\001\137\000\000\000\000\003-\000\000\000\000\003.\000\000\005\155\000\000\000\000\000\000\000\000\000\000\000\000\006Z\000\000\001\147\011\128\000\000\000\000\000\000\000\000\000\000\000\000\001\139\006\\\001y\000\000\000\000\000\000\000\000\000\000\001z\000\000\000\000\001{\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\137\001\147\011\226\003\223\000\000\005\220\001\141\000\000\000\000\000\000\000\000\001\144\000\000\001\146\000\000\000\000\000\000\001\129\000\000\005\221\000\000\000\000\000\000\012\005\000\000\001\139\005\156\005l\001\130\000\000\000\000\000\000\001\132\001\133\000\000\001\141\000\000\000\000\0063\000\000\001\144\000\000\001\146\000\000\006\181\000\000\001\147\011\232\0030\005\230\005\231\000\000\001\134\000\199\000\000\000\000\000\000\000\000\000\000\0031\000\000\000\000\000\000\0033\0034\005\157\000\000\012\245\005\159\003\217\001$\000\000\003\216\000\000\000\000\000\000\000\000\000\000\001\129\005\232\001\141\000\000\000\000\002\233\000\199\001\144\000\000\001\146\000\000\001\130\005\234\005\131\000\000\001\132\001\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005k\005l\000\000\006>\000\000\006L\003\218\001\137\000\000\003\219\005\132\001\134\000\199\000\000\000\000\000\000\000\000\000\000\000\000\006M\000\000\000\000\005\207\012\170\000\000\006\183\006\184\000\000\000\000\0120\000\000\000\000\001\139\004z\000\000\003\217\001$\000\000\0035\005m\006\220\000\199\005n\005\208\000\000\000\000\000\000\000\000\000\000\006V\006Y\000\000\000\000\001\147\012\015\000\000\000\000\005\131\000\000\005\160\000\000\000\000\000\000\0037\000\000\004{\004|\004}\001\137\004\145\000\000\000\000\005\155\000\000\003\218\000\000\004\127\003\219\005\132\006Z\000\000\000\000\000\000\000\000\003>\012V\000\000\001\141\000\000\000\000\006\\\000\000\001\144\001\139\001\146\000\000\004\146\003\217\001$\000\000\005/\000\000\005\197\000\000\000\000\000\000\000\000\003\217\001$\000\000\000\000\000\000\000\000\006\224\001\147\012\\\006\225\000\000\0039\005\131\000\000\000\000\006\228\001\144\000\000\003<\006>\000\000\012\162\005\131\000\000\000\000\000\000\000\000\000\000\0063\003\218\000\000\000\000\003\219\005\132\000\000\012\163\000\000\000\000\000\000\003\218\000\000\001\141\003\219\005\132\000\000\000\000\001\144\000\000\001\146\000\000\000\000\003\217\001$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\131\000\000\003\223\005\197\005\220\012\164\012\165\000\000\000\000\000\000\000\000\000\000\000\000\005\131\000\000\006\229\000\000\000\000\005\221\005k\005l\000\000\012\175\000\000\005k\005l\000\000\000\000\005\155\000\000\003\218\000\000\000\000\003\219\005\132\006>\000\000\006L\000\000\000\000\000\000\005\207\000\000\000\000\000\000\000\000\005\207\000\000\005\230\005\231\000\000\006M\003\217\001$\000\000\012\178\000\000\000\000\005m\000\000\000\000\005n\005\208\005m\004\158\005\197\005n\005\208\000\000\000\000\003\223\003\216\005\220\000\000\000\000\005\197\000\000\000\000\005\232\000\000\000\000\006V\006Y\004\150\000\000\000\000\005\221\000\000\000\000\005\234\012\182\003\218\000\000\000\000\003\219\015 \004\159\004\160\004\161\000\000\004\171\000\000\000\000\000\000\005\155\000\000\000\000\004\163\000\000\000\000\000\000\006Z\000\000\004\151\004\130\000\000\005\230\005\231\000\000\000\000\000\000\000\000\006\\\000\000\000\000\000\000\005\197\004\172\005T\005k\005l\004\180\003\223\000\000\005\220\000\000\000\000\000\000\000\000\003\216\000\000\000\000\003\223\004\251\005\220\000\000\005\232\000\000\005\221\000\000\000\000\005\207\012\188\000\000\0063\000\000\000\000\005\234\005\221\0063\000\000\000\000\012\191\003\217\001$\000\000\000\000\000\000\005m\000\000\000\000\005n\005\208\000\000\000\000\000\000\000\000\000\000\005\230\005\231\000\000\000\000\000\000\000\000\000\000\005\131\000\000\005\197\005\230\005\231\000\000\000\000\000\000\003\223\000\000\005\220\000\000\000\000\004\167\000\000\000\000\003\216\003\218\000\000\000\000\003\219\005\132\000\000\005\232\005\221\000\000\003\216\000\000\012\195\000\000\000\000\000\000\000\000\005\232\005\234\000\000\006>\012\205\006L\000\000\000\000\006>\000\000\006L\005\234\000\000\000\000\000\000\000\000\000\000\003\217\001$\006M\000\000\005\230\005\231\012\232\006M\000\000\003\217\001$\012\237\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\223\000\000\005\220\005\131\005Z\000\000\000\000\000\000\003\216\000\000\0063\000\000\005\131\006V\006Y\005\232\005\221\004\158\006V\006Y\003\218\000\000\000\000\003\219\005\132\000\000\005\234\004\176\000\000\003\218\000\000\000\000\003\219\005\132\000\000\000\000\005\155\000\000\000\000\000\000\000\000\005\155\000\000\006Z\005\197\000\000\005\230\005\231\006Z\004\159\004\160\004\161\000\000\004\171\006\\\000\000\000\000\004\177\004\166\006\\\004\163\000\000\000\000\000\000\000\000\000\000\000\000\003\217\001$\003\216\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006>\000\000\006L\004\172\005T\000\000\000\000\004\180\000\000\000\000\004\185\000\000\005\131\000\000\000\000\000\000\006M\000\000\000\000\000\000\012\247\000\000\000\000\005k\005l\000\000\000\000\000\000\000\000\003\218\000\000\000\000\003\219\005\132\003\223\000\000\005\220\000\000\000\000\005\197\000\000\000\000\000\000\000\000\000\000\005\207\006V\006Y\005\197\000\000\005\221\003\217\001$\000\000\r\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005m\000\000\000\000\005n\005\208\000\000\000\000\005\155\000\000\000\000\000\000\005\131\004\167\000\000\006Z\000\000\000\000\000\000\005\230\005\231\000\000\000\000\000\000\003\217\001$\006\\\000\000\000\000\003\218\000\000\000\000\003\219\005\132\000\000\000\000\000\000\r\021\000\000\000\000\000\000\000\000\003\216\000\000\000\000\003\223\005\131\005\220\000\000\005\232\000\000\000\000\000\000\000\000\003\223\000\000\005\220\000\000\000\000\000\000\005\234\005\221\000\000\003\218\005\197\r\007\003\219\005\132\000\000\000\000\005\221\000\000\000\000\005Z\r\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\230\005\231\000\000\000\000\000\000\004\176\0063\000\000\000\000\005\230\005\231\000\000\000\000\000\000\000\000\003\217\001$\000\000\000\000\000\000\000\000\000\000\000\000\003\216\003\217\001$\000\000\000\000\000\000\000\000\005\232\000\000\003\216\000\000\005\197\004\177\004\166\005\131\000\000\005\232\003\223\005\234\005\220\005\156\005l\000\000\005\131\000\000\001#\001$\005\234\000\000\005k\005l\003\218\000\000\005\221\003\219\005\132\000\000\r#\000\000\000\000\003\218\000\000\004\185\003\219\005\132\005\197\000\000\000\000\000\000\000\000\006>\005\207\006L\000\000\000\000\000\000\000\000\000\000\000\000\005\157\000\000\012\221\005\159\005\230\005\231\015\166\006M\014C\005m\000\000\r2\005n\005\208\000\000\000\000\000\000\000\000\000\000\003\223\000\000\005\220\000\000\000\000\000\000\000\000\000\000\003\216\000\000\000\000\000\000\000\000\005k\005l\005\232\005\221\000\000\006V\006Y\r\154\003\217\001$\000\000\000\000\000\000\005\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\223\005\207\005\220\000\000\000\000\000\000\000\000\005\155\000\000\005\131\000\000\000\000\005\230\005\231\006Z\005\197\005\221\000\000\005m\000\000\r\193\005n\005\208\000\000\005\197\006\\\003\218\000\000\000\000\003\219\005\132\000\000\000\000\000\000\000\000\003\216\000\000\000\000\003\217\001$\000\000\000\000\005\232\005\160\000\000\000\000\005\230\005\231\014D\000\000\000\000\000\000\0063\005\234\000\000\000\000\000\000\003\217\001$\000\000\005\131\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\216\000\000\000\000\000\000\000\000\000\000\000\000\005\232\003\218\000\000\005\131\003\219\005\132\003\223\000\000\005\220\000\000\000\000\005\234\000\000\000\000\000\000\003\223\000\000\005\220\000\000\000\000\003\218\000\000\005\221\003\219\005\132\000\000\r\244\000\000\000\000\000\000\000\000\005\221\000\000\004\158\006>\r\246\012\162\000\000\0063\003\223\000\000\014h\000\000\006>\000\000\006L\005\197\000\000\000\000\000\000\012\163\000\000\005\230\005\231\000\000\014i\003\217\001$\000\000\006M\000\000\005\230\005\231\014\007\000\000\004\159\t$\t)\000\000\004\171\000\000\000\000\000\000\000\000\000\000\003\216\004\163\000\000\005\131\000\000\012\164\012\165\005\232\000\000\003\216\014j\014k\000\000\000\000\006V\006Y\005\232\000\000\005\234\000\000\003\218\004\172\005\197\003\219\005\132\tO\000\000\005\234\005\155\000\000\006>\000\000\006L\003\216\000\000\000\000\000\000\005\155\003\223\000\000\005\220\005\197\000\000\000\000\006Z\000\000\006M\000\000\000\000\000\000\014;\003\217\001$\000\000\005\221\006\\\000\000\000\000\015\001\003\217\001$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\131\000\000\000\000\006V\006Y\000\000\000\000\000\000\005\131\000\000\000\000\005\230\005\231\000\000\000\000\000\000\003\223\003\218\005\220\004\167\003\219\005\132\000\000\000\000\000\000\003\218\005\155\000\000\003\219\005\132\000\000\000\000\005\221\006Z\003\216\003\223\015\003\005\220\000\000\000\000\000\000\005\232\000\000\005\197\006\\\000\000\000\000\000\000\003\217\001$\000\000\005\221\005\234\000\000\000\000\015\189\003\217\001$\000\000\000\000\000\000\000\000\005\230\005\231\000\000\000\000\000\000\000\000\000\000\000\000\005\131\000\000\000\000\000\000\t\181\000\000\000\000\000\000\005\131\000\000\000\000\005\230\005\231\000\000\000\000\003\216\000\000\003\218\000\000\000\000\003\219\005\132\005\232\000\000\000\000\003\218\000\000\000\000\003\219\005\132\000\000\000\000\004\176\005\234\003\216\000\000\003\217\001$\000\000\000\000\003\223\005\232\005\220\005\197\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\197\005\234\000\000\000\000\000\000\005\221\000\000\005\131\000\000\015\191\000\000\004\177\004\166\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\217\001$\000\000\003\218\000\000\000\000\003\219\005\132\000\000\000\000\000\000\000\000\000\000\000\000\005\230\005\231\000\000\000\000\000\000\000\000\004\185\000\000\005\131\000\000\000\000\000\000\000\000\001y\000\000\000\000\000\000\000\000\000\000\001z\000\000\000\000\001{\003\216\003\223\003\218\005\220\005\197\003\219\005\132\005\232\000\000\003\223\000\000\005\220\005\197\000\000\000\000\000\000\000\000\005\221\005\234\000\000\000\000\015\195\000\000\000\000\000\000\005\221\000\000\000\000\000\000\015\206\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\230\005\231\000\000\000\000\000\000\000\000\000\000\000\000\005\230\005\231\000\000\000\000\000\000\000\000\000\000\005\197\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\216\003\223\004\158\005\220\000\000\000\000\000\000\005\232\003\216\003\223\000\000\005\220\000\000\000\000\000\000\005\232\001\129\005\221\005\234\000\000\000\000\015\217\000\000\000\000\000\000\005\221\005\234\001\130\005\197\015\219\000\000\001\132\001\133\000\000\004\159\004\160\004\161\000\000\004\171\000\000\004\158\000\000\000\000\000\000\000\000\004\163\000\000\005\230\005\231\000\000\000\000\001\134\000\199\000\000\000\000\005\230\005\231\004\158\000\000\003\223\000\000\005\220\000\000\000\000\000\000\004\172\005T\000\000\000\000\004\180\003\216\000\000\004\159\004\160\004\161\005\221\004\171\005\232\003\216\015\231\000\000\000\000\000\000\004\163\000\000\005\232\000\000\000\000\005\234\004\159\004\160\004\161\000\000\004\171\000\000\003\223\005\234\005\220\000\000\000\000\004\163\000\000\000\000\004\172\005T\005\230\005\231\004\180\001\137\003\217\001$\005\221\000\000\000\000\000\000\015\235\000\000\000\000\000\000\000\000\004\172\005T\000\000\000\000\004\180\000\000\000\000\000\000\003\216\000\000\000\000\005\131\000\000\001\139\000\000\005\232\004\167\003\217\001$\000\000\000\000\005\230\005\231\000\000\000\000\000\000\005\234\000\000\003\218\000\000\000\000\003\219\005\132\000\000\001\147\015\225\000\000\000\000\000\000\005\131\015\253\003\217\001$\000\000\003\216\000\000\000\000\000\000\000\000\000\000\000\000\005\232\000\000\000\000\004\167\000\000\003\218\000\000\000\000\003\219\005\132\000\000\005\234\005\131\000\000\000\000\000\000\000\000\001\141\003\217\001$\004\167\000\000\001\144\000\000\001\146\005Z\000\000\016\014\000\000\003\218\000\000\000\000\003\219\005\132\000\000\000\000\000\000\000\000\000\000\000\000\005\131\000\000\000\000\000\000\016\n\000\000\000\000\000\000\004\176\000\000\000\000\000\000\000\000\000\000\003\217\001$\000\000\003\218\000\000\000\000\003\219\005\132\000\000\005Z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\197\000\000\000\000\005\131\000\000\004\177\004\166\005Z\000\000\000\000\000\000\000\000\000\000\004\176\000\000\003\217\001$\000\000\000\000\000\000\003\218\000\000\000\000\003\219\005\132\000\000\000\000\000\000\005\197\000\000\004\176\000\000\000\000\000\000\000\000\004\185\000\000\005\131\000\000\000\000\000\000\000\000\000\000\004\177\004\166\000\000\000\000\000\000\000\000\003\217\001$\000\000\005\197\000\000\003\218\000\000\000\000\003\219\005\132\000\000\004\177\004\166\000\000\000\000\000\000\000\000\000\000\003\223\000\000\005\220\000\000\005\131\000\000\004\185\000\000\006\181\000\000\000\000\000\000\000\000\005\197\000\000\000\000\005\221\000\000\003\217\001$\016\"\003\218\000\000\004\185\003\219\005\132\000\000\000\000\003\223\000\000\005\220\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\131\000\000\000\000\000\000\005\221\000\000\005\230\005\231\016(\005\197\000\000\000\000\003\223\000\000\005\220\000\000\000\000\003\218\000\000\000\000\003\219\005\132\000\000\000\000\000\000\000\000\003\217\001$\005\221\003\216\000\000\000\000\016+\000\000\005\230\005\231\005\232\000\000\000\000\000\000\003\223\000\000\005\220\005\197\000\000\000\000\000\000\005\234\005\131\000\000\000\000\006\183\006\184\000\000\000\000\012X\005\221\003\216\005\230\005\231\016-\000\000\000\000\000\000\005\232\003\218\006\220\000\199\003\219\005\132\000\000\000\000\000\000\000\000\000\000\005\234\003\223\005\197\005\220\000\000\000\000\003\216\000\000\000\000\000\000\000\000\005\230\005\231\005\232\003\217\001$\000\000\005\221\000\000\000\000\000\000\016/\000\000\000\000\005\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\216\003\223\005\131\005\220\005\197\000\000\000\000\005\232\000\000\000\000\000\000\000\000\000\000\005\230\005\231\000\000\000\000\005\221\005\234\003\218\001y\0162\003\219\005\132\000\000\000\000\001z\000\000\000\000\001{\006\224\000\000\000\000\006\225\000\000\003\223\003\216\005\220\000\000\006\228\000\000\003\217\001$\005\232\000\000\000\000\000\000\005\230\005\231\000\000\000\000\005\221\005\197\000\000\005\234\0165\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\131\000\000\000\000\000\000\000\000\000\000\000\000\003\216\003\223\000\000\005\220\000\000\000\000\003\149\005\232\000\000\000\000\003\218\005\230\005\231\003\219\005\132\000\000\000\000\005\221\005\234\000\000\000\000\0168\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\229\000\000\000\000\003\217\001$\003\216\000\000\000\000\003\217\001$\000\000\000\000\005\232\000\000\000\000\000\000\005\197\001\129\005\230\005\231\003\223\000\000\005\220\005\234\000\000\005\131\000\000\000\000\001\130\000\000\005\131\000\000\001\132\001\133\000\000\000\000\005\221\000\000\000\000\000\000\016;\003\216\003\218\000\000\000\000\003\219\005\132\003\218\005\232\000\000\003\219\005\132\001\134\000\199\000\000\000\000\000\000\000\000\000\000\005\234\003\150\003\151\003\217\001$\r\130\000\000\005\230\005\231\000\000\000\000\000\000\003\217\001$\000\000\000\000\003\178\000\199\005\197\000\000\000\000\000\000\000\000\000\000\003\223\005\131\005\220\000\000\000\000\000\000\003\216\000\000\000\000\000\000\005\131\000\000\000\000\005\232\000\000\000\000\005\221\000\000\003\218\000\000\016>\003\219\005\132\000\000\005\234\000\000\001\137\003\218\000\000\000\000\003\219\005\132\000\000\000\000\000\000\000\000\003\217\001$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\230\005\231\000\000\003\217\001$\001\139\000\000\000\000\000\000\005\197\000\000\000\000\005\131\000\000\005\197\003\223\000\000\005\220\000\000\003\182\000\000\000\000\003\183\003\216\000\000\005\131\001\147\016\183\003\186\003\218\005\232\005\221\003\219\005\132\000\000\016A\000\000\000\000\000\000\000\000\000\000\005\234\003\218\000\000\000\000\003\219\005\132\000\000\000\000\000\000\000\000\003\217\001$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\141\005\230\005\231\000\000\000\000\001\144\000\000\001\146\005\197\000\000\000\000\000\000\000\000\005\131\000\000\000\000\003\223\005\197\005\220\000\000\000\000\003\223\000\000\005\220\003\216\000\000\000\000\000\000\003\187\000\000\003\218\005\232\005\221\003\219\005\132\000\000\016D\005\221\000\000\000\000\000\000\016G\005\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\181\000\000\000\000\003\217\001$\000\000\005\230\005\231\000\000\005\197\000\000\005\230\005\231\000\000\000\000\003\217\001$\000\000\000\000\003\223\000\000\005\220\005\197\000\000\000\000\005\131\000\000\000\000\003\223\003\216\005\220\000\000\000\000\000\000\003\216\005\221\005\232\005\131\000\000\016J\000\000\005\232\003\218\000\000\005\221\003\219\005\132\005\234\016M\000\000\000\000\000\000\005\234\000\000\003\218\000\000\000\000\003\219\005\132\000\000\000\000\000\000\000\000\000\000\000\000\005\230\005\231\000\000\000\000\000\000\005\197\000\000\000\000\000\000\005\230\005\231\003\223\000\000\005\220\000\000\000\000\000\000\000\000\006\183\006\184\003\217\001$\015\015\003\216\003\223\000\000\005\220\005\221\000\000\000\000\005\232\016P\003\216\006\220\000\199\000\000\000\000\000\000\000\000\005\232\005\221\005\234\005\131\000\000\016S\000\000\000\000\000\000\000\000\000\000\005\234\000\000\000\000\000\000\000\000\000\000\000\000\005\230\005\231\003\218\000\000\000\000\003\219\005\132\000\000\000\000\000\000\000\000\000\000\000\000\005\230\005\231\003\223\005\197\005\220\000\000\000\000\000\000\000\000\000\000\003\216\000\000\003\217\001$\000\000\005\197\000\000\005\232\005\221\000\000\003\217\001$\016V\003\216\000\000\003\217\001$\000\000\005\234\000\000\005\232\000\000\000\000\000\000\005\131\000\000\006\224\000\000\000\000\006\225\000\000\005\234\005\131\000\000\000\000\006\228\000\000\005\131\005\230\005\231\000\000\003\218\000\000\000\000\003\219\005\132\000\000\000\000\000\000\003\218\000\000\000\000\003\219\005\132\003\218\000\000\000\000\003\219\005\132\000\000\003\223\003\216\005\220\000\000\000\000\000\000\000\000\000\000\005\232\000\000\000\000\000\000\003\223\000\000\005\220\005\197\005\221\000\000\000\000\005\234\016Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\221\000\000\000\000\000\000\016\\\000\000\000\000\006\229\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\230\005\231\000\000\000\000\003\217\001$\000\000\000\000\000\000\000\000\000\000\000\000\005\230\005\231\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\217\001$\003\216\000\000\004\158\005\131\000\000\003\217\001$\005\232\005\197\000\000\000\000\000\000\003\216\003\223\000\000\005\220\005\197\000\000\005\234\005\232\003\218\005\197\000\000\003\219\005\132\000\000\000\000\005\131\000\000\005\221\005\234\000\000\000\000\016b\004\159\007\151\007\156\003\218\004\171\000\000\003\219\003\220\000\000\000\000\003\218\004\163\000\000\003\219\005\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\230\005\231\000\000\000\000\000\000\000\000\004\172\000\000\000\000\000\000\007\196\003\217\001$\000\000\000\000\000\000\003\223\000\000\005\220\000\000\000\000\000\000\000\000\003\216\003\223\000\000\005\220\000\000\000\000\003\223\005\232\005\220\005\221\005\131\000\000\000\000\016a\000\000\000\000\000\000\005\221\005\234\000\000\000\000\016e\005\221\000\000\005k\005l\016h\003\218\000\000\000\000\003\219\005\132\000\000\000\000\005\197\000\000\000\000\000\000\000\000\005\230\005\231\000\000\000\000\000\000\000\000\000\000\005\207\005\230\005\231\000\000\000\000\005\197\005\230\005\231\004\167\000\000\003\217\001$\005\197\000\000\000\000\000\000\003\216\005m\000\000\000\000\005n\005\208\000\000\005\232\003\216\000\000\000\000\000\000\000\000\003\216\000\000\005\232\005\131\000\000\005\234\000\000\005\232\000\000\000\000\000\000\000\000\000\000\005\234\005k\005l\000\000\000\000\005\234\000\000\003\218\000\000\000\000\003\219\005\132\000\000\003\223\000\000\005\220\000\000\000\000\000\000\000\000\000\000\011D\000\000\005\207\000\000\003\217\001$\000\000\000\000\005\221\003\223\000\000\005\220\016k\000\000\005\197\000\000\003\223\000\000\005\220\005m\000\000\000\000\005n\005\208\000\000\005\221\005\131\000\000\004\176\000\000\000\000\000\000\005\221\004z\000\000\000\000\016n\000\000\005\230\005\231\000\000\000\000\000\000\003\218\000\000\000\000\003\219\005\132\000\000\000\000\0063\000\000\003\217\001$\000\000\005\230\005\231\000\000\004\177\004\166\000\000\003\216\005\230\005\231\000\000\004{\004|\004}\005\232\004\145\000\000\000\000\000\000\000\000\005\131\000\000\004\127\000\000\003\216\005\234\000\000\003\223\005\197\005\220\000\000\003\216\000\000\000\000\004\185\000\000\000\000\003\218\005\232\000\000\003\219\005\132\004\146\005\221\000\000\000\000\005)\016t\000\000\005\234\003\217\001$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\217\001$\0063\000\000\006>\000\000\006L\000\000\000\000\000\000\000\000\000\000\000\000\005\131\005\230\005\231\000\000\000\000\000\000\000\000\006M\000\000\005\131\000\000\016{\000\000\005\197\000\000\000\000\000\000\003\218\000\000\000\000\003\219\005\132\000\000\003\223\003\216\005\220\003\218\000\000\000\000\003\219\005\132\005\232\000\000\000\000\000\000\000\000\000\000\006V\006Y\005\221\001y\004\131\005\234\016~\000\000\000\000\001z\000\000\000\000\001{\000\000\000\000\000\000\000\000\000\000\000\000\006>\000\000\006L\000\000\005\155\005\197\000\000\000\000\000\000\000\000\000\000\006Z\000\000\005\230\005\231\000\000\006M\000\000\000\000\000\000\016\129\000\000\006\\\000\000\003\223\000\000\005\220\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\216\000\000\000\000\000\000\005\221\000\000\000\000\005\232\016\132\000\000\006V\006Y\000\000\000\000\001y\000\000\000\000\000\000\005\234\000\000\001z\005\197\000\000\001{\000\000\000\000\000\000\000\000\000\000\000\000\005\197\000\000\004\150\005\155\005\230\005\231\003\223\000\000\005\220\000\000\006Z\000\000\000\000\000\000\001\129\000\000\000\000\000\000\000\000\000\000\000\000\006\\\005\221\000\000\000\000\001\130\016\138\003\216\000\000\001\132\001\133\000\000\004\151\004\130\005\232\000\000\000\000\003,\000\000\000\000\000\000\000\000\000\000\003-\000\000\005\234\003.\000\000\000\000\001\134\000\199\000\000\005\230\005\231\000\000\000\000\000\000\000\000\003\223\000\000\005\220\000\000\004\251\000\000\000\000\000\000\000\000\003\223\000\000\005\220\003,\000\000\000\000\000\000\005\221\003\216\003-\000\000\016\141\003.\001\129\000\000\005\232\005\221\000\000\000\000\000\000\016\203\003,\000\000\000\000\001\130\004\158\005\234\003-\001\132\001\133\003.\000\000\000\000\000\000\000\000\000\000\000\000\005\230\005\231\001\137\000\000\000\000\000\000\000\000\000\000\000\000\005\230\005\231\001\134\000\199\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\159\007\151\007\156\003\216\004\171\000\000\000\000\001\139\000\000\0030\005\232\004\163\003\216\000\000\000\000\000\000\000\000\000\000\000\000\005\232\0031\005\234\000\000\000\000\0033\0034\000\000\000\000\001\143\000\000\005\234\004\172\000\000\000\000\000\000\007\196\000\000\000\000\000\000\000\000\000\000\000\000\0030\000\000\002\233\000\199\000\000\000\000\001\137\004\158\000\000\000\000\000\000\0031\000\000\004\158\000\000\0033\0034\000\000\0030\000\000\001\141\000\000\000\000\000\000\000\000\001\144\000\000\001\146\000\000\0031\000\000\001\139\004\158\0033\0034\002\233\000\199\000\000\000\000\004\159\007\151\007\156\000\000\004\171\000\000\004\159\004\160\004\161\000\000\004\171\004\163\000\000\001\163\002\233\000\199\000\000\004\163\000\000\000\000\0035\004\167\000\000\000\000\000\000\004\159\004\160\004\161\000\000\004\171\000\000\004\172\000\000\000\000\000\000\007\196\004\163\004\172\000\000\000\000\000\000\005\015\000\000\000\000\000\000\0037\000\000\001\141\004\158\000\000\000\000\000\000\001\144\0035\001\146\000\000\004\172\000\000\000\000\000\000\004\217\000\000\000\000\000\000\000\000\000\000\003=\000\000\000\000\000\000\000\000\0035\000\000\000\000\000\000\000\000\011`\000\000\0037\000\000\004\159\004\160\004\161\000\000\004\171\000\000\004\158\000\000\000\000\000\000\000\000\004\163\000\000\000\000\000\000\000\000\0037\000\000\000\000\0038\0039\000\000\004\167\000\000\004\176\001\144\000\000\003<\004\167\004\158\000\000\004\172\000\000\000\000\000\000\004\184\000\000\003;\004\159\004\160\004\161\000\000\004\171\000\000\000\000\000\000\000\000\004\167\000\000\004\163\000\000\000\000\000\000\0039\004\177\004\166\000\000\004z\001\144\000\000\003<\004\159\004\160\004\161\000\000\004\171\000\000\000\000\000\000\004\172\000\000\0039\004\163\004\194\000\000\000\000\001\144\011c\003<\000\000\004\158\000\000\000\000\000\000\004\185\004\158\000\000\000\000\000\000\004{\004|\004}\004\172\004\145\000\000\000\000\004\198\000\000\000\000\000\000\004\127\000\000\004\167\000\000\000\000\004\176\000\000\000\000\000\000\000\000\000\000\004\176\004\159\004\160\004\161\000\000\004\171\004\159\004\160\004\161\004\146\004\171\000\000\004\163\005\n\000\000\000\000\000\000\004\163\000\000\004\176\000\000\000\000\000\000\004\158\004\177\004\166\000\000\000\000\000\000\004\167\004\177\004\166\004\172\000\000\000\000\004\158\005J\004\172\000\000\000\000\000\000\005\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\177\004\166\004z\004\167\000\000\004\185\004\159\004\160\004\161\000\000\004\171\004\185\000\000\000\000\004\158\000\000\000\000\004\163\004\159\004\160\004\161\000\000\004\171\000\000\000\000\004\176\000\000\000\000\004\158\004\163\004\185\004\131\000\000\000\000\004{\004|\004}\004\172\004\145\000\000\000\000\007\246\000\000\000\000\000\000\004\127\004\159\004\160\004\161\004\172\004\171\000\000\000\000\b\003\004\167\004\177\004\166\004\163\000\000\004\167\004\159\004\160\004\161\004\176\004\171\004\146\004\158\000\000\000\000\t\169\000\000\004\163\000\000\000\000\000\000\000\000\000\000\004\172\000\000\000\000\000\000\n(\000\000\000\000\000\000\004\185\004\176\000\000\003\217\001$\000\000\004\172\004\158\004\177\004\166\r \000\000\000\000\004\159\004\160\004\161\000\000\004\171\000\000\000\000\000\000\000\000\000\000\004\167\004\163\000\000\000\000\000\000\000\000\004\150\000\000\004\177\004\166\000\000\000\000\004\167\000\000\000\000\004\185\004\159\004\160\004\161\003\218\004\171\004\172\003\219\003\237\000\000\014\012\000\000\004\163\004\131\004\176\000\000\000\000\000\000\000\000\004\176\000\000\004\151\004\130\004\185\000\000\004\167\000\000\003\217\001$\000\000\000\000\000\000\004\172\000\000\000\000\000\000\015\215\000\000\000\000\004\167\000\000\000\000\000\000\000\000\004\177\004\166\003\217\001$\000\000\004\177\004\166\004\251\005k\005l\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\218\000\000\004\176\003\219\004\017\000\000\000\000\004\158\004\185\000\000\000\000\004\167\000\000\004\185\004\176\000\000\000\000\000\000\000\000\003\218\000\000\004\158\003\219\004\019\000\000\005m\000\000\000\000\005n\r.\004\150\000\000\004\177\004\166\005\197\004z\000\000\004\167\000\000\004\159\004\160\004\161\004\176\004\171\004\177\004\166\000\000\000\000\000\000\004\158\004\163\000\000\000\000\004\159\004\160\004\161\004\176\004\171\000\000\000\000\004\151\004\130\004\185\000\000\004\163\000\000\000\000\004{\004|\004}\004\175\004\145\004\177\004\166\004\185\000\000\000\000\000\000\004\127\000\000\000\000\004\159\004\160\004\161\004\186\004\171\004\177\004\166\000\000\000\000\004\251\000\000\004\163\000\000\004\176\000\000\005\197\004z\004\252\000\000\000\000\003\223\004\185\005\220\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0057\000\000\000\000\005\197\004\185\005\221\000\000\000\000\004\176\0063\000\000\000\000\004\177\004\166\000\000\000\000\000\000\004{\004|\004}\000\000\004\145\000\000\003\217\001$\000\000\000\000\000\000\004\127\004\167\000\000\000\000\000\000\000\000\000\000\005\230\005\231\000\000\004\177\004\166\005k\005l\004\185\004\167\000\000\000\000\000\000\000\000\0059\000\000\000\000\003\223\000\000\005\220\000\000\000\000\000\000\004\131\003\216\000\000\000\000\000\000\003\218\000\000\000\000\003\219\005c\005\221\004\185\000\000\003\223\004\167\005\220\000\000\000\000\000\000\006>\000\000\006L\005m\000\000\000\000\005n\005o\000\000\000\000\005\221\000\000\005k\005l\000\000\000\000\006M\000\000\005k\005l\000\000\005\230\005\231\000\000\000\000\000\000\000\000\000\000\000\000\005\156\005l\000\000\000\000\000\000\000\000\000\000\004\176\000\000\000\000\000\000\005\230\005\231\000\000\004\131\003\216\000\000\006V\006Y\000\000\000\000\004\176\005m\000\000\000\000\005n\005\139\000\000\005m\000\000\000\000\005n\005\141\000\000\003\216\004\150\000\000\004\177\004\166\005\157\005\155\005\158\005\159\001@\001$\000\000\000\000\000\000\000\000\004\176\000\000\004\177\004\166\005\197\000\000\000\000\000\000\000\000\000\000\000\000\001@\001$\000\000\000\000\000\000\004\151\004\130\004\185\005k\005l\0063\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\177\004\166\004\185\001A\000\000\006D\001E\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\251\000\000\004\150\000\000\001A\000\000\006I\001E\000\000\000\000\000\000\000\000\005m\000\000\004\185\005n\007\204\000\000\000\000\000\000\000\000\005k\005l\0063\000\000\003\223\000\000\005\220\000\000\0063\000\000\000\000\004\151\004\130\000\000\000\000\005k\005l\000\000\000\000\005\160\005\221\006>\000\000\006L\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006M\000\000\005m\000\000\004\251\005n\007\238\000\000\000\000\000\000\000\000\000\000\000\000\005\230\005\231\000\000\000\000\005m\005k\005l\005n\b\011\000\000\000\000\000\000\001F\000\000\005k\005l\000\000\006V\006Y\006>\000\000\006L\000\000\003\216\000\000\006>\000\000\006L\000\000\001F\000\000\003\217\001$\000\000\000\000\006M\006>\0063\012\162\000\000\005\155\006M\000\000\000\000\005m\000\000\000\000\005n\tT\000\000\000\000\000\000\012\163\005m\000\000\000\000\005n\t\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006V\006Y\000\000\003\217\001$\003\218\006V\006Y\003\219\t\214\000\000\000\000\000\000\000\000\003\223\000\000\003\228\012\164\012\165\000\000\0063\000\000\000\000\005\155\005k\005l\000\000\000\000\000\000\005\155\003\229\003\223\000\000\003\228\000\000\0063\000\000\005k\005l\006>\005\155\006L\003\218\000\000\000\000\003\219\n\005\003\229\000\000\000\000\000\000\000\000\005\156\005l\000\000\006M\000\000\000\000\000\000\000\000\003\230\003\233\000\000\005m\000\000\000\000\005n\nd\000\000\000\000\000\000\000\000\000\000\005k\005l\0063\005m\003\230\003\233\005n\012\197\000\000\000\000\003\216\0063\006V\006Y\006>\000\000\006L\000\000\005\157\000\000\012\223\005\159\000\000\000\000\000\000\000\000\000\000\003\216\005\197\006>\006M\006L\000\000\000\000\000\000\005\155\000\000\000\000\000\000\005m\005\156\005l\005n\012\225\000\000\006M\000\000\000\000\000\000\003\217\001$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006V\006Y\000\000\000\000\000\000\005\197\000\000\000\000\000\000\006>\000\000\006L\000\000\000\000\004\158\006V\006Y\000\000\006>\005\157\006L\012\230\005\159\005\155\000\000\006M\0063\004z\003\218\000\000\000\000\003\219\r\t\000\000\006M\003\223\000\000\005\220\005\155\0063\000\000\003\217\001$\000\000\000\000\000\000\004\159\004\160\004\161\000\000\004\171\005\221\000\000\000\000\005\160\006V\006Y\004\163\000\000\004{\004|\004}\000\000\004\145\006V\006Y\000\000\000\000\000\000\000\000\004\127\000\000\003\223\000\000\005\220\0063\000\000\r\186\005\155\000\000\003\218\005\230\005\231\003\219\014\000\000\000\000\000\005\155\005\221\000\000\r\188\001@\001$\006>\000\000\006L\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\216\000\000\006>\000\000\006L\006M\000\000\000\000\003\217\001$\000\000\005\160\000\000\000\000\005\230\005\231\000\000\006>\006M\012\162\005\197\000\000\000\000\000\000\000\000\000\000\001A\000\000\r\239\001E\000\000\000\000\000\000\012\163\000\000\006V\006Y\003\216\006>\000\000\006L\000\000\000\000\000\000\004\167\000\000\000\000\003\218\006V\006Y\003\219\015L\000\000\000\000\006M\000\000\000\000\004\131\005\155\001@\001$\000\000\000\000\012\164\012\165\000\000\005k\005l\000\000\000\000\000\000\005\155\005\197\000\000\003\217\001$\000\000\000\000\006>\000\000\012\162\000\000\000\000\000\000\006V\006Y\005\155\003\223\000\000\005\220\000\000\000\000\000\000\000\000\012\163\000\000\000\000\000\000\001A\000\000\014\005\001E\000\000\005\221\000\000\005m\000\000\005\155\005n\015T\000\000\000\000\000\000\003\218\000\000\000\000\003\219\015o\000\000\000\000\000\000\000\000\001F\000\000\012\164\012\165\000\000\004\176\000\000\000\000\003\217\001$\000\000\005\230\005\231\000\000\003\217\001$\000\000\003\223\004\150\005\220\000\000\005\197\000\000\000\000\000\000\005\155\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\221\003\216\004\177\004\166\000\000\000\000\000\000\000\000\000\000\003\217\001$\000\000\000\000\000\000\003\218\004\151\004\130\003\219\015\198\000\000\003\218\000\000\000\000\003\219\015\204\000\000\000\000\000\000\000\000\000\000\005\230\005\231\004\185\000\000\003\223\000\000\003\228\000\000\000\000\001F\000\000\000\000\000\000\003\217\001$\004\251\0063\000\000\003\218\000\000\003\229\003\219\015\221\003\216\005\197\003\223\000\000\005\220\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\221\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\230\003\233\003\218\000\000\000\000\003\219\016$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\230\005\231\003\216\000\000\000\000\003\223\000\000\003\228\000\000\005\197\000\000\000\000\006>\000\000\006L\005\197\000\000\000\000\000\000\000\000\003\223\003\229\005\220\003\216\000\000\000\000\000\000\000\000\006M\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\221\000\000\000\000\000\000\000\000\000\000\000\000\005\197\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\230\003\233\000\000\000\000\000\000\000\000\000\000\006V\006Y\000\000\000\000\000\000\000\000\000\000\000\000\005\230\005\231\000\000\000\000\000\000\000\000\000\000\000\000\003\216\000\000\003\223\005\197\005\220\000\000\000\000\005\155\003\223\000\000\005\220\000\000\000\000\000\000\000\000\003\216\000\000\000\000\005\221\000\000\000\000\000\000\000\000\000\000\005\221\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\223\000\000\005\220\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\230\005\231\000\000\000\000\005\221\000\000\005\230\005\231\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\223\003\216\005\220\000\000\000\000\000\000\000\000\003\216\000\000\000\000\000\000\000\000\005\230\005\231\000\000\000\000\005\221\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\216\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\230\005\231\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\216"))
  
  and semantic_action =
    [|
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_lbl_pattern = Obj.magic _2 in
        let _1 : 'tv_option_DOTDOTDOT_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv__lbl_pattern_list = let _1 = 
# 4946 "reason_parser.mly"
    ( let dotdotdot = match _1 with
      | Some _ -> Some (mklocation _startpos__1_ _endpos__2_)
      | None -> None
      in
      (dotdotdot, _2)
    )
# 1837 "reason_parser.ml"
         in
        
# 3882 "reason_parser.mly"
                                                       ( ([_1], Closed) )
# 1842 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _2 : unit = Obj.magic _2 in
        let _2_inlined1 : 'tv_lbl_pattern = Obj.magic _2_inlined1 in
        let _1 : 'tv_option_DOTDOTDOT_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv__lbl_pattern_list = let _1 =
          let (_endpos__2_, _2) = (_endpos__2_inlined1_, _2_inlined1) in
          
# 4946 "reason_parser.mly"
    ( let dotdotdot = match _1 with
      | Some _ -> Some (mklocation _startpos__1_ _endpos__2_)
      | None -> None
      in
      (dotdotdot, _2)
    )
# 1888 "reason_parser.ml"
          
        in
        
# 3883 "reason_parser.mly"
                                                       ( ([_1], Closed) )
# 1894 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2_inlined1;
                MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
                MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_option_COMMA_ = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _2_inlined1 : 'tv_lbl_pattern = Obj.magic _2_inlined1 in
        let _1 : 'tv_option_DOTDOTDOT_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv__lbl_pattern_list = let _1 =
          let (_endpos__2_, _2) = (_endpos__2_inlined1_, _2_inlined1) in
          
# 4946 "reason_parser.mly"
    ( let dotdotdot = match _1 with
      | Some _ -> Some (mklocation _startpos__1_ _endpos__2_)
      | None -> None
      in
      (dotdotdot, _2)
    )
# 1954 "reason_parser.ml"
          
        in
        
# 3884 "reason_parser.mly"
                                                       ( ([_1], Open)   )
# 1960 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _3 : 'tv__lbl_pattern_list = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _2_inlined1 : 'tv_lbl_pattern = Obj.magic _2_inlined1 in
        let _1 : 'tv_option_DOTDOTDOT_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv__lbl_pattern_list = let _1 =
          let (_endpos__2_, _2) = (_endpos__2_inlined1_, _2_inlined1) in
          
# 4946 "reason_parser.mly"
    ( let dotdotdot = match _1 with
      | Some _ -> Some (mklocation _startpos__1_ _endpos__2_)
      | None -> None
      in
      (dotdotdot, _2)
    )
# 2013 "reason_parser.ml"
          
        in
        
# 3886 "reason_parser.mly"
    ( let (fields, closed) = _3 in _1 :: fields, closed )
# 2019 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_additive = 
# 4770 "reason_parser.mly"
                  ( "+"  )
# 2044 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_additive = 
# 4771 "reason_parser.mly"
                  ( "+." )
# 2069 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _3 : 'tv_class_declaration_details = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_and_class_declaration = let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 2101 "reason_parser.ml"
         in
        let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 1990 "reason_parser.mly"
  ( let (ident, binding, virt, params) = _3 in
    let loc = mklocation _symbolstartpos _endpos in
    Ci.mk ident binding ~virt ~params ~attrs:_1 ~loc
  )
# 2115 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_class_declaration_details = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_and_class_declaration = let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 2155 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 2160 "reason_parser.ml"
          
        in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 1990 "reason_parser.mly"
  ( let (ident, binding, virt, params) = _3 in
    let loc = mklocation _symbolstartpos _endpos in
    Ci.mk ident binding ~virt ~params ~attrs:_1 ~loc
  )
# 2174 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _3 : 'tv_class_description_details = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_and_class_description = let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 2206 "reason_parser.ml"
         in
        let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 2394 "reason_parser.mly"
  ( let (ident, binding, virt, params) = _3 in
    let loc = mklocation _symbolstartpos _endpos in
    Ci.mk ident binding ~virt ~params ~attrs:_1 ~loc
  )
# 2220 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_class_description_details = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_and_class_description = let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 2260 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 2265 "reason_parser.ml"
          
        in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 2394 "reason_parser.mly"
  ( let (ident, binding, virt, params) = _3 in
    let loc = mklocation _symbolstartpos _endpos in
    Ci.mk ident binding ~virt ~params ~attrs:_1 ~loc
  )
# 2279 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _3 : 'tv_class_type_declaration_details = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_and_class_type_declaration = let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 2311 "reason_parser.ml"
         in
        let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 2424 "reason_parser.mly"
  ( let (ident, instance_type, virt, params) = _3 in
    let loc = mklocation _symbolstartpos _endpos in
    Ci.mk ident instance_type ~virt ~params ~attrs:_1 ~loc
  )
# 2325 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_class_type_declaration_details = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_and_class_type_declaration = let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 2365 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 2370 "reason_parser.ml"
          
        in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 2424 "reason_parser.mly"
  ( let (ident, instance_type, virt, params) = _3 in
    let loc = mklocation _symbolstartpos _endpos in
    Ci.mk ident instance_type ~virt ~params ~attrs:_1 ~loc
  )
# 2384 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_module_binding_body = Obj.magic _4 in
        let x : (
# 1220 "reason_parser.mly"
       (string)
# 2418 "reason_parser.ml"
        ) = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_and_module_bindings = let _3 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 2430 "reason_parser.ml"
          
        in
        let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 2436 "reason_parser.ml"
         in
        let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
        let _endpos = _endpos__4_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 1762 "reason_parser.mly"
  ( Mb.mk _3 _4 ~attrs:_1 ~loc:(mklocation _symbolstartpos _endpos) )
# 2447 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_module_binding_body = Obj.magic _4 in
        let x : (
# 1220 "reason_parser.mly"
       (string)
# 2487 "reason_parser.ml"
        ) = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_and_module_bindings = let _3 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 2500 "reason_parser.ml"
          
        in
        let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 2507 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 2512 "reason_parser.ml"
          
        in
        let _endpos = _endpos__4_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 1762 "reason_parser.mly"
  ( Mb.mk _3 _4 ~attrs:_1 ~loc:(mklocation _symbolstartpos _endpos) )
# 2523 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_module_type_body_COLON_ = Obj.magic _4 in
        let x : (
# 1220 "reason_parser.mly"
       (string)
# 2557 "reason_parser.ml"
        ) = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_and_module_rec_declaration = let _3 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 2569 "reason_parser.ml"
          
        in
        let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 2575 "reason_parser.ml"
         in
        let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
        let _endpos = _endpos__4_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 1983 "reason_parser.mly"
  ( Md.mk _3 _4 ~attrs:_1 ~loc:(mklocation _symbolstartpos _endpos) )
# 2586 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_module_type_body_COLON_ = Obj.magic _4 in
        let x : (
# 1220 "reason_parser.mly"
       (string)
# 2626 "reason_parser.ml"
        ) = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_and_module_rec_declaration = let _3 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 2639 "reason_parser.ml"
          
        in
        let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 2646 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 2651 "reason_parser.ml"
          
        in
        let _endpos = _endpos__4_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 1983 "reason_parser.mly"
  ( Md.mk _3 _4 ~attrs:_1 ~loc:(mklocation _symbolstartpos _endpos) )
# 2662 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_and_type_declaration = 
# 3945 "reason_parser.mly"
    ( [] )
# 2680 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _3 : 'tv_type_declaration_details = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_and_type_declaration = let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 2712 "reason_parser.ml"
         in
        let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 3947 "reason_parser.mly"
    ( let (ident, params, cstrs, kind, priv, manifest), endpos, and_types = _3 in
      let loc = mklocation _symbolstartpos endpos in
      Type.mk ident ~params ~cstrs ~kind ~priv ?manifest ~attrs:_1 ~loc
      :: and_types
    )
# 2726 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_type_declaration_details = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_and_type_declaration = let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 2766 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 2771 "reason_parser.ml"
          
        in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 3947 "reason_parser.mly"
    ( let (ident, params, cstrs, kind, priv, manifest), endpos, and_types = _3 in
      let loc = mklocation _symbolstartpos endpos in
      Type.mk ident ~params ~cstrs ~kind ~priv ?manifest ~attrs:_1 ~loc
      :: and_types
    )
# 2785 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_protected_type = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_arrow_type_parameter = 
# 4370 "reason_parser.mly"
                    ( (Nolabel, _1) )
# 2810 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_protected_type = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : (
# 1173 "reason_parser.mly"
       (string)
# 2851 "reason_parser.ml"
        ) = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_arrow_type_parameter = 
# 4372 "reason_parser.mly"
    ( (Labelled _2, _4) )
# 2860 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_labelled_arrow_type_parameter_optional = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_arrow_type_parameter = 
# 4373 "reason_parser.mly"
                                           ( _1 )
# 2885 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_option_COMMA_ = Obj.magic _2 in
        let _1_inlined1 : 'tv_lseparated_nonempty_list_aux_COMMA_uncurried_arrow_type_parameter_ = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_arrow_type_parameters = let _2 =
          let _1 = _1_inlined1 in
          let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 2933 "reason_parser.ml"
           in
          
# 4386 "reason_parser.mly"
                                                                             (_1)
# 2938 "reason_parser.ml"
          
        in
        
# 4389 "reason_parser.mly"
                                                 ( _2 )
# 2944 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_core_type2 = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_arrow_type_parameters = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_arrowed_simple_core_type = 
# 4357 "reason_parser.mly"
    ( List.fold_right mktyp_arrow _2 _4 )
# 2990 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_core_type2 = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_labelled_arrow_type_parameter_optional = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_arrowed_simple_core_type = let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 3032 "reason_parser.ml"
          
        in
        
# 4359 "reason_parser.mly"
    ( mktyp_arrow (_1, false) _3 )
# 3038 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_core_type2 = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_basic_core_type = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_arrowed_simple_core_type = 
# 4361 "reason_parser.mly"
    ( mktyp (Ptyp_arrow (Nolabel, _1, _3)) )
# 3077 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : 'tv_single_attr_id = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_attr_id = let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 3105 "reason_parser.ml"
          
        in
        
# 4829 "reason_parser.mly"
                           ( _1 )
# 3111 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_attr_id = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_single_attr_id = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_attr_id = let _endpos = _endpos__3_ in
        let _symbolstartpos = _startpos__1_ in
        
# 4830 "reason_parser.mly"
                               ( mkloc (_1 ^ "." ^ _3.txt) (mklocation _symbolstartpos _endpos) )
# 3152 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_payload = Obj.magic _3 in
        let _2 : 'tv_attr_id = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_attribute = 
# 4834 "reason_parser.mly"
                                        ( (_2, _3) )
# 3198 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : (
# 1228 "reason_parser.mly"
       (string)
# 3219 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_attribute = let _endpos = _endpos__1_ in
        let _symbolstartpos = _startpos__1_ in
        
# 4835 "reason_parser.mly"
              ( doc_attr _1 (mklocation _symbolstartpos _endpos) )
# 3229 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_list_attributed_ext_constructor_either_extension_constructor_declaration_extension_constructor_rebind___ = Obj.magic _2 in
        let _1 : 'tv_either_extension_constructor_declaration_extension_constructor_rebind_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_attributed_ext_constructors_either_extension_constructor_declaration_extension_constructor_rebind__ = 
# 4155 "reason_parser.mly"
                                     ( _1 :: _2 )
# 3261 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_nonempty_list_attributed_ext_constructor_either_extension_constructor_declaration_extension_constructor_rebind___ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_attributed_ext_constructors_either_extension_constructor_declaration_extension_constructor_rebind__ = 
# 4156 "reason_parser.mly"
                                   ( _1 )
# 3286 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_list_attributed_ext_constructor_extension_constructor_declaration__ = Obj.magic _2 in
        let _1 : 'tv_extension_constructor_declaration = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_attributed_ext_constructors_extension_constructor_declaration_ = 
# 4155 "reason_parser.mly"
                                     ( _1 :: _2 )
# 3318 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_nonempty_list_attributed_ext_constructor_extension_constructor_declaration__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_attributed_ext_constructors_extension_constructor_declaration_ = 
# 4156 "reason_parser.mly"
                                   ( _1 )
# 3343 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _3 : 'tv_constructor_declaration = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_bar_constructor_declaration = let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 3375 "reason_parser.ml"
         in
        
# 4052 "reason_parser.mly"
  ( {_3 with pcd_attributes = _1 @ _3.pcd_attributes} )
# 3380 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_constructor_declaration = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_bar_constructor_declaration = let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 3420 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 3425 "reason_parser.ml"
          
        in
        
# 4052 "reason_parser.mly"
  ( {_3 with pcd_attributes = _1 @ _3.pcd_attributes} )
# 3431 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _3 : 'tv_row_field = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_bar_row_field = let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 3463 "reason_parser.ml"
         in
        
# 4537 "reason_parser.mly"
  ( match _3 with
    | Rtag (name, attrs, amp, typs) ->
        Rtag (name, _1 @ attrs, amp, typs)
    | Rinherit typ ->
        Rinherit {typ with ptyp_attributes = _1 @ typ.ptyp_attributes}
  )
# 3473 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_row_field = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_bar_row_field = let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 3513 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 3518 "reason_parser.ml"
          
        in
        
# 4537 "reason_parser.mly"
  ( match _3 with
    | Rtag (name, attrs, amp, typs) ->
        Rtag (name, _1 @ attrs, amp, typs)
    | Rinherit typ ->
        Rinherit {typ with ptyp_attributes = _1 @ typ.ptyp_attributes}
  )
# 3529 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_type_parameters = Obj.magic _2 in
        let _1 : 'tv_type_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_basic_core_type = let _1 =
          let x = 
# 4461 "reason_parser.mly"
    ( mktyp(Ptyp_constr(_1, _2)) )
# 3562 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4912 "reason_parser.mly"
  ( {x with ptyp_loc = {x.ptyp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 3570 "reason_parser.ml"
          
        in
        
# 4482 "reason_parser.mly"
    (_1)
# 3576 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_type_parameters = Obj.magic _3 in
        let x : 'tv_class_longident = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_basic_core_type = let _1 =
          let x =
            let _2 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 3620 "reason_parser.ml"
              
            in
            
# 4463 "reason_parser.mly"
    ( mktyp(Ptyp_class(_2, _3)) )
# 3626 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4912 "reason_parser.mly"
  ( {x with ptyp_loc = {x.ptyp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 3635 "reason_parser.ml"
          
        in
        
# 4482 "reason_parser.mly"
    (_1)
# 3641 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_ident = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_basic_core_type = let _1 =
          let x = 
# 4465 "reason_parser.mly"
    ( mktyp(Ptyp_var _2) )
# 3674 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4912 "reason_parser.mly"
  ( {x with ptyp_loc = {x.ptyp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 3682 "reason_parser.ml"
          
        in
        
# 4482 "reason_parser.mly"
    (_1)
# 3688 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : 'tv_class_longident = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_basic_core_type = let _1 =
          let x =
            let _2 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 3725 "reason_parser.ml"
              
            in
            
# 4467 "reason_parser.mly"
    ( mktyp(Ptyp_class(_2, [])) )
# 3731 "reason_parser.ml"
            
          in
          let _startpos_x_ = _startpos__1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4912 "reason_parser.mly"
  ( {x with ptyp_loc = {x.ptyp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 3740 "reason_parser.ml"
          
        in
        
# 4482 "reason_parser.mly"
    (_1)
# 3746 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_basic_core_type = let _1 =
          let x = 
# 4469 "reason_parser.mly"
    ( mktyp(Ptyp_any) )
# 3772 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4912 "reason_parser.mly"
  ( {x with ptyp_loc = {x.ptyp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 3780 "reason_parser.ml"
          
        in
        
# 4482 "reason_parser.mly"
    (_1)
# 3786 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_type_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_basic_core_type = let _1 =
          let x = 
# 4471 "reason_parser.mly"
    ( mktyp(Ptyp_constr(_1, [])) )
# 3812 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4912 "reason_parser.mly"
  ( {x with ptyp_loc = {x.ptyp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 3820 "reason_parser.ml"
          
        in
        
# 4482 "reason_parser.mly"
    (_1)
# 3826 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_object_record_type = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_basic_core_type = let _1 =
          let x = 
# 4473 "reason_parser.mly"
    ( _1 )
# 3852 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4912 "reason_parser.mly"
  ( {x with ptyp_loc = {x.ptyp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 3860 "reason_parser.ml"
          
        in
        
# 4482 "reason_parser.mly"
    (_1)
# 3866 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_row_field_list = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_basic_core_type = let _1 =
          let x = 
# 4475 "reason_parser.mly"
    ( mktyp(Ptyp_variant (_2, Closed, None)) )
# 3906 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4912 "reason_parser.mly"
  ( {x with ptyp_loc = {x.ptyp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 3914 "reason_parser.ml"
          
        in
        
# 4482 "reason_parser.mly"
    (_1)
# 3920 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_loption_row_field_list_ = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_basic_core_type = let _1 =
          let x = 
# 4477 "reason_parser.mly"
    ( mktyp(Ptyp_variant (_2, Open, None)) )
# 3960 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4912 "reason_parser.mly"
  ( {x with ptyp_loc = {x.ptyp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 3968 "reason_parser.ml"
          
        in
        
# 4482 "reason_parser.mly"
    (_1)
# 3974 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_loption_preceded_GREATER_nonempty_list_name_tag___ = Obj.magic _3 in
        let _2 : 'tv_row_field_list = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_basic_core_type = let _1 =
          let x = 
# 4479 "reason_parser.mly"
    ( mktyp(Ptyp_variant (_2, Closed, Some _3)) )
# 4021 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__4_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4912 "reason_parser.mly"
  ( {x with ptyp_loc = {x.ptyp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 4029 "reason_parser.ml"
          
        in
        
# 4482 "reason_parser.mly"
    (_1)
# 4035 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_extension = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_basic_core_type = let _1 =
          let x = 
# 4481 "reason_parser.mly"
    ( mktyp(Ptyp_extension _1) )
# 4061 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4912 "reason_parser.mly"
  ( {x with ptyp_loc = {x.ptyp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 4069 "reason_parser.ml"
          
        in
        
# 4482 "reason_parser.mly"
    (_1)
# 4075 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_boption_AMPERSAND_ = 
# 133 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( false )
# 4093 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_boption_AMPERSAND_ = 
# 135 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( true )
# 4118 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_seq_expr = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_braced_expr = let _1 =
          let x = 
# 2467 "reason_parser.mly"
    ( add_brace_attr _2 )
# 4158 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 4166 "reason_parser.ml"
          
        in
        
# 2495 "reason_parser.mly"
  (_1)
# 4172 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let x : 'tv_seq_expr = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_braced_expr = let _1 =
          let x =
            let _2 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 4216 "reason_parser.ml"
              
            in
            
# 2469 "reason_parser.mly"
    ( syntax_error_exp _2.loc "SyntaxError in block" )
# 4222 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 4231 "reason_parser.ml"
          
        in
        
# 2495 "reason_parser.mly"
  (_1)
# 4237 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_option_COMMA_ = Obj.magic _4 in
        let _3 : 'tv_expr_optional_constraint = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_braced_expr = let _1 =
          let x =
            let _endpos = _endpos__5_ in
            let _symbolstartpos = _startpos__1_ in
            
# 2471 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      let msg = "Record construction must have at least one field explicitly set" in
      syntax_error_exp loc msg
    )
# 4297 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__5_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 4306 "reason_parser.ml"
          
        in
        
# 2495 "reason_parser.mly"
  (_1)
# 4312 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : unit = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_expr_optional_constraint = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_braced_expr = let _1 =
          let x = 
# 2476 "reason_parser.mly"
    ( let loc = mklocation _startpos__4_ _endpos__4_ in
      raise_record_trailing_semi_error loc )
# 4367 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__5_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 4375 "reason_parser.ml"
          
        in
        
# 2495 "reason_parser.mly"
  (_1)
# 4381 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_record_expr = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_braced_expr = let _1 =
          let x = 
# 2479 "reason_parser.mly"
    ( let (exten, fields) = _2 in mkexp (Pexp_record(fields, exten)) )
# 4421 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 4429 "reason_parser.ml"
          
        in
        
# 2495 "reason_parser.mly"
  (_1)
# 4435 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _2 : 'tv_record_expr = Obj.magic _2 in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_braced_expr = let _1 =
          let x =
            let _3 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 4480 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 4489 "reason_parser.ml"
              
            in
            
# 2481 "reason_parser.mly"
    ( unclosed_exp (with_txt _1 "{") (with_txt _3 "}"))
# 4495 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos_x_inlined1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 4504 "reason_parser.ml"
          
        in
        
# 2495 "reason_parser.mly"
  (_1)
# 4510 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_record_expr_with_string_keys = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_braced_expr = let _1 =
          let x =
            let _endpos = _endpos__3_ in
            let _symbolstartpos = _startpos__1_ in
            
# 2483 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      let (exten, fields) = _2 in
      mkexp ~loc (Pexp_extension (mkloc ("bs.obj") loc,
             PStr [mkstrexp (mkexp ~loc (Pexp_record(fields, exten))) []]))
    )
# 4557 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 4566 "reason_parser.ml"
          
        in
        
# 2495 "reason_parser.mly"
  (_1)
# 4572 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _2 : 'tv_record_expr_with_string_keys = Obj.magic _2 in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_braced_expr = let _1 =
          let x =
            let _3 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 4617 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 4626 "reason_parser.ml"
              
            in
            
# 2489 "reason_parser.mly"
    ( unclosed_exp (with_txt _1 "{") (with_txt _3 "}"))
# 4632 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos_x_inlined1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 4641 "reason_parser.ml"
          
        in
        
# 2495 "reason_parser.mly"
  (_1)
# 4647 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_object_body = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_braced_expr = let _1 =
          let x = 
# 2492 "reason_parser.mly"
    ( mkexp (Pexp_object _2) )
# 4687 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 4695 "reason_parser.ml"
          
        in
        
# 2495 "reason_parser.mly"
  (_1)
# 4701 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _2 : 'tv_object_body = Obj.magic _2 in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_braced_expr = let _1 =
          let x =
            let _3 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 4746 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 4755 "reason_parser.ml"
              
            in
            
# 2494 "reason_parser.mly"
    ( unclosed_exp (with_txt _1 "{") (with_txt _3 "}") )
# 4761 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos_x_inlined1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 4770 "reason_parser.ml"
          
        in
        
# 2495 "reason_parser.mly"
  (_1)
# 4776 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_class_instance_type = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_class_constructor_type = 
# 2298 "reason_parser.mly"
                        ( _1 )
# 4801 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_class_constructor_type = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_arrow_type_parameters = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_class_constructor_type = 
# 2300 "reason_parser.mly"
    ( List.fold_right mkcty_arrow _1 _3 )
# 4840 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_either_preceded_EQUAL_class_expr__class_body_expr_ = Obj.magic _2 in
        let _1 : 'tv_option_preceded_COLON_class_constructor_type__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_class_declaration_body = let _endpos = _endpos__2_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 2013 "reason_parser.mly"
  ( match _1 with
    | None -> _2
    | Some ct -> Cl.constraint_ ~loc:(mklocation _symbolstartpos _endpos) _2 ct
  )
# 4880 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_class_declaration_body = Obj.magic _5 in
        let x : (
# 1173 "reason_parser.mly"
       (string)
# 4914 "reason_parser.ml"
        ) = Obj.magic x in
        let _1 : 'tv_virtual_flag = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_class_declaration_details = let _4 = 
# 124 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( None )
# 4923 "reason_parser.ml"
         in
        let _3 = 
# 124 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( None )
# 4928 "reason_parser.ml"
         in
        let _2 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 4936 "reason_parser.ml"
          
        in
        
# 1999 "reason_parser.mly"
  (
    let tree = match _4 with
    | None -> []
    | Some (lpl, _uncurried) -> lpl
    in
    let body = List.fold_right mkclass_fun tree _5 in
    let params = match _3 with None -> [] | Some x -> x in
    (_2, body, _1, params)
  )
# 4950 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = x;
                MenhirLib.EngineTypes.startp = _startpos_x_;
                MenhirLib.EngineTypes.endp = _endpos_x_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_class_declaration_body = Obj.magic _5 in
        let _2 : unit = Obj.magic _2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let x : (
# 1173 "reason_parser.mly"
       (string)
# 4998 "reason_parser.ml"
        ) = Obj.magic x in
        let _1 : 'tv_virtual_flag = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_class_declaration_details = let _4 =
          let (_startpos__1_, _1) = (_startpos__1_inlined1_, _1_inlined1) in
          let x =
            let _endpos = _endpos__2_ in
            let _startpos = _startpos__1_ in
            
# 2626 "reason_parser.mly"
                  (
    let loc = mklocation _startpos _endpos in
    ([mkloc (Term (Nolabel, None, mkpat_constructor_unit loc loc)) loc], false)
  )
# 5015 "reason_parser.ml"
            
          in
          
# 126 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 5021 "reason_parser.ml"
          
        in
        let _3 = 
# 124 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( None )
# 5027 "reason_parser.ml"
         in
        let _2 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 5035 "reason_parser.ml"
          
        in
        
# 1999 "reason_parser.mly"
  (
    let tree = match _4 with
    | None -> []
    | Some (lpl, _uncurried) -> lpl
    in
    let body = List.fold_right mkclass_fun tree _5 in
    let params = match _3 with None -> [] | Some x -> x in
    (_2, body, _1, params)
  )
# 5049 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _1_inlined2;
                MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
                MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _1_inlined1;
                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = x;
                    MenhirLib.EngineTypes.startp = _startpos_x_;
                    MenhirLib.EngineTypes.endp = _endpos_x_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _menhir_s;
                      MenhirLib.EngineTypes.semv = _1;
                      MenhirLib.EngineTypes.startp = _startpos__1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_;
                      MenhirLib.EngineTypes.next = _menhir_stack;
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_class_declaration_body = Obj.magic _5 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_option_COMMA_ = Obj.magic _2 in
        let _1_inlined2 : 'tv_lseparated_nonempty_list_aux_COMMA_labeled_pattern_ = Obj.magic _1_inlined2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let x : (
# 1173 "reason_parser.mly"
       (string)
# 5111 "reason_parser.ml"
        ) = Obj.magic x in
        let _1 : 'tv_virtual_flag = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_class_declaration_details = let _4 =
          let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in
          let x =
            let _1 =
              let _1 =
                let x =
                  let _1 = _1_inlined1 in
                  let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 5127 "reason_parser.ml"
                   in
                  
# 2623 "reason_parser.mly"
                                                          ( _1 )
# 5132 "reason_parser.ml"
                  
                in
                
# 200 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 5138 "reason_parser.ml"
                
              in
              
# 4978 "reason_parser.mly"
                                                       ( _1 )
# 5144 "reason_parser.ml"
              
            in
            
# 2630 "reason_parser.mly"
                                               (
    (_1, false)
  )
# 5152 "reason_parser.ml"
            
          in
          
# 126 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 5158 "reason_parser.ml"
          
        in
        let _3 = 
# 124 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( None )
# 5164 "reason_parser.ml"
         in
        let _2 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 5172 "reason_parser.ml"
          
        in
        
# 1999 "reason_parser.mly"
  (
    let tree = match _4 with
    | None -> []
    | Some (lpl, _uncurried) -> lpl
    in
    let body = List.fold_right mkclass_fun tree _5 in
    let params = match _3 with None -> [] | Some x -> x in
    (_2, body, _1, params)
  )
# 5186 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _1_inlined1;
                MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _1;
                    MenhirLib.EngineTypes.startp = _startpos__1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_class_declaration_body = Obj.magic _5 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let x : (
# 1173 "reason_parser.mly"
       (string)
# 5241 "reason_parser.ml"
        ) = Obj.magic x in
        let _1 : 'tv_virtual_flag = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_class_declaration_details = let _4 =
          let (_startpos__1_, _1) = (_startpos__1_inlined1_, _1_inlined1) in
          let x =
            let _endpos = _endpos__3_ in
            let _startpos = _startpos__1_ in
            
# 2633 "reason_parser.mly"
                      (
      let loc = mklocation _startpos _endpos in
      ([mkloc (Term (Nolabel, None, mkpat_constructor_unit loc loc)) loc], true)
  )
# 5258 "reason_parser.ml"
            
          in
          
# 126 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 5264 "reason_parser.ml"
          
        in
        let _3 = 
# 124 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( None )
# 5270 "reason_parser.ml"
         in
        let _2 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 5278 "reason_parser.ml"
          
        in
        
# 1999 "reason_parser.mly"
  (
    let tree = match _4 with
    | None -> []
    | Some (lpl, _uncurried) -> lpl
    in
    let body = List.fold_right mkclass_fun tree _5 in
    let params = match _3 with None -> [] | Some x -> x in
    (_2, body, _1, params)
  )
# 5292 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _1_inlined2;
                MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
                MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _2;
                  MenhirLib.EngineTypes.startp = _startpos__2_;
                  MenhirLib.EngineTypes.endp = _endpos__2_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _1_inlined1;
                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = x;
                      MenhirLib.EngineTypes.startp = _startpos_x_;
                      MenhirLib.EngineTypes.endp = _endpos_x_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _menhir_s;
                        MenhirLib.EngineTypes.semv = _1;
                        MenhirLib.EngineTypes.startp = _startpos__1_;
                        MenhirLib.EngineTypes.endp = _endpos__1_;
                        MenhirLib.EngineTypes.next = _menhir_stack;
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_class_declaration_body = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _2_inlined1 : 'tv_option_COMMA_ = Obj.magic _2_inlined1 in
        let _1_inlined2 : 'tv_lseparated_nonempty_list_aux_COMMA_labeled_pattern_ = Obj.magic _1_inlined2 in
        let _2 : unit = Obj.magic _2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let x : (
# 1173 "reason_parser.mly"
       (string)
# 5361 "reason_parser.ml"
        ) = Obj.magic x in
        let _1 : 'tv_virtual_flag = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_class_declaration_details = let _4 =
          let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in
          let x =
            let _3 =
              let (_2, _1) = (_2_inlined1, _1_inlined1) in
              let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 5375 "reason_parser.ml"
               in
              
# 2623 "reason_parser.mly"
                                                          ( _1 )
# 5380 "reason_parser.ml"
              
            in
            
# 2637 "reason_parser.mly"
                                                  (
    let () = List.iter (fun p ->
        match p.txt with
        | Term (Labelled _, _, _)
        | Term (Optional _, _, _)  ->
            raise Reason_syntax_util.(
              Error(p.loc, (Syntax_error "Uncurried function definition with labelled arguments is not supported at the moment."))
            )
        | _ -> ()
      ) _3 in
    (_3, true)
  )
# 5397 "reason_parser.ml"
            
          in
          
# 126 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 5403 "reason_parser.ml"
          
        in
        let _3 = 
# 124 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( None )
# 5409 "reason_parser.ml"
         in
        let _2 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 5417 "reason_parser.ml"
          
        in
        
# 1999 "reason_parser.mly"
  (
    let tree = match _4 with
    | None -> []
    | Some (lpl, _uncurried) -> lpl
    in
    let body = List.fold_right mkclass_fun tree _5 in
    let params = match _3 with None -> [] | Some x -> x in
    (_2, body, _1, params)
  )
# 5431 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _1_inlined2;
                MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
                MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _1_inlined1;
                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = x;
                    MenhirLib.EngineTypes.startp = _startpos_x_;
                    MenhirLib.EngineTypes.endp = _endpos_x_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _menhir_s;
                      MenhirLib.EngineTypes.semv = _1;
                      MenhirLib.EngineTypes.startp = _startpos__1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_;
                      MenhirLib.EngineTypes.next = _menhir_stack;
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_class_declaration_body = Obj.magic _5 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_option_COMMA_ = Obj.magic _2 in
        let _1_inlined2 : 'tv_lseparated_nonempty_list_aux_COMMA_type_parameter_ = Obj.magic _1_inlined2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let x : (
# 1173 "reason_parser.mly"
       (string)
# 5493 "reason_parser.ml"
        ) = Obj.magic x in
        let _1 : 'tv_virtual_flag = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_class_declaration_details = let _4 = 
# 124 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( None )
# 5502 "reason_parser.ml"
         in
        let _3 =
          let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in
          let x =
            let _1 =
              let _1 =
                let x =
                  let _1 = _1_inlined1 in
                  let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 5514 "reason_parser.ml"
                   in
                  
# 2401 "reason_parser.mly"
                                                             (_1)
# 5519 "reason_parser.ml"
                  
                in
                
# 200 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 5525 "reason_parser.ml"
                
              in
              
# 4978 "reason_parser.mly"
                                                       ( _1 )
# 5531 "reason_parser.ml"
              
            in
            
# 2405 "reason_parser.mly"
  ( _1 )
# 5537 "reason_parser.ml"
            
          in
          
# 126 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 5543 "reason_parser.ml"
          
        in
        let _2 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 5552 "reason_parser.ml"
          
        in
        
# 1999 "reason_parser.mly"
  (
    let tree = match _4 with
    | None -> []
    | Some (lpl, _uncurried) -> lpl
    in
    let body = List.fold_right mkclass_fun tree _5 in
    let params = match _3 with None -> [] | Some x -> x in
    (_2, body, _1, params)
  )
# 5566 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined3;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined3_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _3;
                MenhirLib.EngineTypes.startp = _startpos__3_;
                MenhirLib.EngineTypes.endp = _endpos__3_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _2;
                  MenhirLib.EngineTypes.startp = _startpos__2_;
                  MenhirLib.EngineTypes.endp = _endpos__2_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _1_inlined2;
                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _1_inlined1;
                      MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _;
                        MenhirLib.EngineTypes.semv = x;
                        MenhirLib.EngineTypes.startp = _startpos_x_;
                        MenhirLib.EngineTypes.endp = _endpos_x_;
                        MenhirLib.EngineTypes.next = {
                          MenhirLib.EngineTypes.state = _menhir_s;
                          MenhirLib.EngineTypes.semv = _1;
                          MenhirLib.EngineTypes.startp = _startpos__1_;
                          MenhirLib.EngineTypes.endp = _endpos__1_;
                          MenhirLib.EngineTypes.next = _menhir_stack;
                        };
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_class_declaration_body = Obj.magic _5 in
        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
        let _1_inlined3 : unit = Obj.magic _1_inlined3 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_option_COMMA_ = Obj.magic _2 in
        let _1_inlined2 : 'tv_lseparated_nonempty_list_aux_COMMA_type_parameter_ = Obj.magic _1_inlined2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let x : (
# 1173 "reason_parser.mly"
       (string)
# 5642 "reason_parser.ml"
        ) = Obj.magic x in
        let _1 : 'tv_virtual_flag = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_class_declaration_details = let _4 =
          let (_endpos__2_, _startpos__1_, _2, _1) = (_endpos__2_inlined1_, _startpos__1_inlined3_, _2_inlined1, _1_inlined3) in
          let x =
            let _endpos = _endpos__2_ in
            let _startpos = _startpos__1_ in
            
# 2626 "reason_parser.mly"
                  (
    let loc = mklocation _startpos _endpos in
    ([mkloc (Term (Nolabel, None, mkpat_constructor_unit loc loc)) loc], false)
  )
# 5659 "reason_parser.ml"
            
          in
          
# 126 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 5665 "reason_parser.ml"
          
        in
        let _3 =
          let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in
          let x =
            let _1 =
              let _1 =
                let x =
                  let _1 = _1_inlined1 in
                  let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 5678 "reason_parser.ml"
                   in
                  
# 2401 "reason_parser.mly"
                                                             (_1)
# 5683 "reason_parser.ml"
                  
                in
                
# 200 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 5689 "reason_parser.ml"
                
              in
              
# 4978 "reason_parser.mly"
                                                       ( _1 )
# 5695 "reason_parser.ml"
              
            in
            
# 2405 "reason_parser.mly"
  ( _1 )
# 5701 "reason_parser.ml"
            
          in
          
# 126 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 5707 "reason_parser.ml"
          
        in
        let _2 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 5716 "reason_parser.ml"
          
        in
        
# 1999 "reason_parser.mly"
  (
    let tree = match _4 with
    | None -> []
    | Some (lpl, _uncurried) -> lpl
    in
    let body = List.fold_right mkclass_fun tree _5 in
    let params = match _3 with None -> [] | Some x -> x in
    (_2, body, _1, params)
  )
# 5730 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _1_inlined4;
                MenhirLib.EngineTypes.startp = _startpos__1_inlined4_;
                MenhirLib.EngineTypes.endp = _endpos__1_inlined4_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _1_inlined3;
                  MenhirLib.EngineTypes.startp = _startpos__1_inlined3_;
                  MenhirLib.EngineTypes.endp = _endpos__1_inlined3_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _3;
                    MenhirLib.EngineTypes.startp = _startpos__3_;
                    MenhirLib.EngineTypes.endp = _endpos__3_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _2;
                      MenhirLib.EngineTypes.startp = _startpos__2_;
                      MenhirLib.EngineTypes.endp = _endpos__2_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _;
                        MenhirLib.EngineTypes.semv = _1_inlined2;
                        MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
                        MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
                        MenhirLib.EngineTypes.next = {
                          MenhirLib.EngineTypes.state = _;
                          MenhirLib.EngineTypes.semv = _1_inlined1;
                          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                          MenhirLib.EngineTypes.next = {
                            MenhirLib.EngineTypes.state = _;
                            MenhirLib.EngineTypes.semv = x;
                            MenhirLib.EngineTypes.startp = _startpos_x_;
                            MenhirLib.EngineTypes.endp = _endpos_x_;
                            MenhirLib.EngineTypes.next = {
                              MenhirLib.EngineTypes.state = _menhir_s;
                              MenhirLib.EngineTypes.semv = _1;
                              MenhirLib.EngineTypes.startp = _startpos__1_;
                              MenhirLib.EngineTypes.endp = _endpos__1_;
                              MenhirLib.EngineTypes.next = _menhir_stack;
                            };
                          };
                        };
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_class_declaration_body = Obj.magic _5 in
        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
        let _2_inlined1 : 'tv_option_COMMA_ = Obj.magic _2_inlined1 in
        let _1_inlined4 : 'tv_lseparated_nonempty_list_aux_COMMA_labeled_pattern_ = Obj.magic _1_inlined4 in
        let _1_inlined3 : unit = Obj.magic _1_inlined3 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_option_COMMA_ = Obj.magic _2 in
        let _1_inlined2 : 'tv_lseparated_nonempty_list_aux_COMMA_type_parameter_ = Obj.magic _1_inlined2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let x : (
# 1173 "reason_parser.mly"
       (string)
# 5820 "reason_parser.ml"
        ) = Obj.magic x in
        let _1 : 'tv_virtual_flag = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_class_declaration_details = let _4 =
          let (_3, _2, _1_inlined1, _1) = (_3_inlined1, _2_inlined1, _1_inlined4, _1_inlined3) in
          let x =
            let _1 =
              let _1 =
                let x =
                  let _1 = _1_inlined1 in
                  let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 5836 "reason_parser.ml"
                   in
                  
# 2623 "reason_parser.mly"
                                                          ( _1 )
# 5841 "reason_parser.ml"
                  
                in
                
# 200 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 5847 "reason_parser.ml"
                
              in
              
# 4978 "reason_parser.mly"
                                                       ( _1 )
# 5853 "reason_parser.ml"
              
            in
            
# 2630 "reason_parser.mly"
                                               (
    (_1, false)
  )
# 5861 "reason_parser.ml"
            
          in
          
# 126 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 5867 "reason_parser.ml"
          
        in
        let _3 =
          let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in
          let x =
            let _1 =
              let _1 =
                let x =
                  let _1 = _1_inlined1 in
                  let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 5880 "reason_parser.ml"
                   in
                  
# 2401 "reason_parser.mly"
                                                             (_1)
# 5885 "reason_parser.ml"
                  
                in
                
# 200 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 5891 "reason_parser.ml"
                
              in
              
# 4978 "reason_parser.mly"
                                                       ( _1 )
# 5897 "reason_parser.ml"
              
            in
            
# 2405 "reason_parser.mly"
  ( _1 )
# 5903 "reason_parser.ml"
            
          in
          
# 126 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 5909 "reason_parser.ml"
          
        in
        let _2 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 5918 "reason_parser.ml"
          
        in
        
# 1999 "reason_parser.mly"
  (
    let tree = match _4 with
    | None -> []
    | Some (lpl, _uncurried) -> lpl
    in
    let body = List.fold_right mkclass_fun tree _5 in
    let params = match _3 with None -> [] | Some x -> x in
    (_2, body, _1, params)
  )
# 5932 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _1_inlined3;
                MenhirLib.EngineTypes.startp = _startpos__1_inlined3_;
                MenhirLib.EngineTypes.endp = _endpos__1_inlined3_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _3;
                  MenhirLib.EngineTypes.startp = _startpos__3_;
                  MenhirLib.EngineTypes.endp = _endpos__3_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _2;
                    MenhirLib.EngineTypes.startp = _startpos__2_;
                    MenhirLib.EngineTypes.endp = _endpos__2_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _1_inlined2;
                      MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
                      MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _;
                        MenhirLib.EngineTypes.semv = _1_inlined1;
                        MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                        MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                        MenhirLib.EngineTypes.next = {
                          MenhirLib.EngineTypes.state = _;
                          MenhirLib.EngineTypes.semv = x;
                          MenhirLib.EngineTypes.startp = _startpos_x_;
                          MenhirLib.EngineTypes.endp = _endpos_x_;
                          MenhirLib.EngineTypes.next = {
                            MenhirLib.EngineTypes.state = _menhir_s;
                            MenhirLib.EngineTypes.semv = _1;
                            MenhirLib.EngineTypes.startp = _startpos__1_;
                            MenhirLib.EngineTypes.endp = _endpos__1_;
                            MenhirLib.EngineTypes.next = _menhir_stack;
                          };
                        };
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_class_declaration_body = Obj.magic _5 in
        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
        let _1_inlined3 : unit = Obj.magic _1_inlined3 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_option_COMMA_ = Obj.magic _2 in
        let _1_inlined2 : 'tv_lseparated_nonempty_list_aux_COMMA_type_parameter_ = Obj.magic _1_inlined2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let x : (
# 1173 "reason_parser.mly"
       (string)
# 6015 "reason_parser.ml"
        ) = Obj.magic x in
        let _1 : 'tv_virtual_flag = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_class_declaration_details = let _4 =
          let (_endpos__3_, _startpos__1_, _3, _2, _1) = (_endpos__3_inlined1_, _startpos__1_inlined3_, _3_inlined1, _2_inlined1, _1_inlined3) in
          let x =
            let _endpos = _endpos__3_ in
            let _startpos = _startpos__1_ in
            
# 2633 "reason_parser.mly"
                      (
      let loc = mklocation _startpos _endpos in
      ([mkloc (Term (Nolabel, None, mkpat_constructor_unit loc loc)) loc], true)
  )
# 6032 "reason_parser.ml"
            
          in
          
# 126 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 6038 "reason_parser.ml"
          
        in
        let _3 =
          let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in
          let x =
            let _1 =
              let _1 =
                let x =
                  let _1 = _1_inlined1 in
                  let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 6051 "reason_parser.ml"
                   in
                  
# 2401 "reason_parser.mly"
                                                             (_1)
# 6056 "reason_parser.ml"
                  
                in
                
# 200 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 6062 "reason_parser.ml"
                
              in
              
# 4978 "reason_parser.mly"
                                                       ( _1 )
# 6068 "reason_parser.ml"
              
            in
            
# 2405 "reason_parser.mly"
  ( _1 )
# 6074 "reason_parser.ml"
            
          in
          
# 126 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 6080 "reason_parser.ml"
          
        in
        let _2 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 6089 "reason_parser.ml"
          
        in
        
# 1999 "reason_parser.mly"
  (
    let tree = match _4 with
    | None -> []
    | Some (lpl, _uncurried) -> lpl
    in
    let body = List.fold_right mkclass_fun tree _5 in
    let params = match _3 with None -> [] | Some x -> x in
    (_2, body, _1, params)
  )
# 6103 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2_inlined2;
              MenhirLib.EngineTypes.startp = _startpos__2_inlined2_;
              MenhirLib.EngineTypes.endp = _endpos__2_inlined2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _1_inlined4;
                MenhirLib.EngineTypes.startp = _startpos__1_inlined4_;
                MenhirLib.EngineTypes.endp = _endpos__1_inlined4_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _2_inlined1;
                  MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
                  MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _1_inlined3;
                    MenhirLib.EngineTypes.startp = _startpos__1_inlined3_;
                    MenhirLib.EngineTypes.endp = _endpos__1_inlined3_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _3;
                      MenhirLib.EngineTypes.startp = _startpos__3_;
                      MenhirLib.EngineTypes.endp = _endpos__3_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _;
                        MenhirLib.EngineTypes.semv = _2;
                        MenhirLib.EngineTypes.startp = _startpos__2_;
                        MenhirLib.EngineTypes.endp = _endpos__2_;
                        MenhirLib.EngineTypes.next = {
                          MenhirLib.EngineTypes.state = _;
                          MenhirLib.EngineTypes.semv = _1_inlined2;
                          MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
                          MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
                          MenhirLib.EngineTypes.next = {
                            MenhirLib.EngineTypes.state = _;
                            MenhirLib.EngineTypes.semv = _1_inlined1;
                            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                            MenhirLib.EngineTypes.next = {
                              MenhirLib.EngineTypes.state = _;
                              MenhirLib.EngineTypes.semv = x;
                              MenhirLib.EngineTypes.startp = _startpos_x_;
                              MenhirLib.EngineTypes.endp = _endpos_x_;
                              MenhirLib.EngineTypes.next = {
                                MenhirLib.EngineTypes.state = _menhir_s;
                                MenhirLib.EngineTypes.semv = _1;
                                MenhirLib.EngineTypes.startp = _startpos__1_;
                                MenhirLib.EngineTypes.endp = _endpos__1_;
                                MenhirLib.EngineTypes.next = _menhir_stack;
                              };
                            };
                          };
                        };
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_class_declaration_body = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _2_inlined2 : 'tv_option_COMMA_ = Obj.magic _2_inlined2 in
        let _1_inlined4 : 'tv_lseparated_nonempty_list_aux_COMMA_labeled_pattern_ = Obj.magic _1_inlined4 in
        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
        let _1_inlined3 : unit = Obj.magic _1_inlined3 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_option_COMMA_ = Obj.magic _2 in
        let _1_inlined2 : 'tv_lseparated_nonempty_list_aux_COMMA_type_parameter_ = Obj.magic _1_inlined2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let x : (
# 1173 "reason_parser.mly"
       (string)
# 6200 "reason_parser.ml"
        ) = Obj.magic x in
        let _1 : 'tv_virtual_flag = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_class_declaration_details = let _4 =
          let (_2_inlined1, _1_inlined1, _2, _1) = (_2_inlined2, _1_inlined4, _2_inlined1, _1_inlined3) in
          let x =
            let _3 =
              let (_2, _1) = (_2_inlined1, _1_inlined1) in
              let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 6214 "reason_parser.ml"
               in
              
# 2623 "reason_parser.mly"
                                                          ( _1 )
# 6219 "reason_parser.ml"
              
            in
            
# 2637 "reason_parser.mly"
                                                  (
    let () = List.iter (fun p ->
        match p.txt with
        | Term (Labelled _, _, _)
        | Term (Optional _, _, _)  ->
            raise Reason_syntax_util.(
              Error(p.loc, (Syntax_error "Uncurried function definition with labelled arguments is not supported at the moment."))
            )
        | _ -> ()
      ) _3 in
    (_3, true)
  )
# 6236 "reason_parser.ml"
            
          in
          
# 126 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 6242 "reason_parser.ml"
          
        in
        let _3 =
          let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in
          let x =
            let _1 =
              let _1 =
                let x =
                  let _1 = _1_inlined1 in
                  let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 6255 "reason_parser.ml"
                   in
                  
# 2401 "reason_parser.mly"
                                                             (_1)
# 6260 "reason_parser.ml"
                  
                in
                
# 200 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 6266 "reason_parser.ml"
                
              in
              
# 4978 "reason_parser.mly"
                                                       ( _1 )
# 6272 "reason_parser.ml"
              
            in
            
# 2405 "reason_parser.mly"
  ( _1 )
# 6278 "reason_parser.ml"
            
          in
          
# 126 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 6284 "reason_parser.ml"
          
        in
        let _2 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 6293 "reason_parser.ml"
          
        in
        
# 1999 "reason_parser.mly"
  (
    let tree = match _4 with
    | None -> []
    | Some (lpl, _uncurried) -> lpl
    in
    let body = List.fold_right mkclass_fun tree _5 in
    let params = match _3 with None -> [] | Some x -> x in
    (_2, body, _1, params)
  )
# 6307 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = x;
                MenhirLib.EngineTypes.startp = _startpos_x_;
                MenhirLib.EngineTypes.endp = _endpos_x_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_class_constructor_type = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_loption_class_type_parameters_ = Obj.magic _3 in
        let x : (
# 1173 "reason_parser.mly"
       (string)
# 6355 "reason_parser.ml"
        ) = Obj.magic x in
        let _1 : 'tv_virtual_flag = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_class_description_details = let _2 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 6367 "reason_parser.ml"
          
        in
        
# 2410 "reason_parser.mly"
  ( (_2, _5, _1, _3) )
# 6373 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_list_and_class_description_ = Obj.magic _4 in
        let _3 : 'tv_class_description_details = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_class_descriptions = let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 6412 "reason_parser.ml"
         in
        let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
        let _endpos = _endpos__4_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 2386 "reason_parser.mly"
  ( let (ident, binding, virt, params) = _3 in
    let loc = mklocation _symbolstartpos _endpos in
    (Ci.mk ident binding ~virt ~params ~attrs:_1 ~loc :: _4)
  )
# 6426 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_list_and_class_description_ = Obj.magic _4 in
        let _3 : 'tv_class_description_details = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_class_descriptions = let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 6473 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 6478 "reason_parser.ml"
          
        in
        let _endpos = _endpos__4_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 2386 "reason_parser.mly"
  ( let (ident, binding, virt, params) = _3 in
    let loc = mklocation _symbolstartpos _endpos in
    (Ci.mk ident binding ~virt ~params ~attrs:_1 ~loc :: _4)
  )
# 6492 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_class_simple_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_class_expr = let _1 =
          let x = 
# 2051 "reason_parser.mly"
    ( _1 )
# 6518 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4924 "reason_parser.mly"
  ( {x with pcl_loc = {x.pcl_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 6526 "reason_parser.ml"
          
        in
        
# 2082 "reason_parser.mly"
    (_1)
# 6532 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _1_inlined1;
                MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_class_expr = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_either_ES6_FUN_FUN_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_class_expr = let _1 =
          let x =
            let _2 =
              let (_startpos__1_, _1) = (_startpos__1_inlined1_, _1_inlined1) in
              let _endpos = _endpos__2_ in
              let _startpos = _startpos__1_ in
              
# 2626 "reason_parser.mly"
                  (
    let loc = mklocation _startpos _endpos in
    ([mkloc (Term (Nolabel, None, mkpat_constructor_unit loc loc)) loc], false)
  )
# 6594 "reason_parser.ml"
              
            in
            
# 2053 "reason_parser.mly"
    ( let (lp, _) = _2 in
      List.fold_right mkclass_fun lp _4 )
# 6601 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__4_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4924 "reason_parser.mly"
  ( {x with pcl_loc = {x.pcl_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 6610 "reason_parser.ml"
          
        in
        
# 2082 "reason_parser.mly"
    (_1)
# 6616 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _1_inlined2;
                  MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
                  MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _1_inlined1;
                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _menhir_s;
                      MenhirLib.EngineTypes.semv = _1;
                      MenhirLib.EngineTypes.startp = _startpos__1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_;
                      MenhirLib.EngineTypes.next = _menhir_stack;
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_class_expr = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
        let _2 : 'tv_option_COMMA_ = Obj.magic _2 in
        let _1_inlined2 : 'tv_lseparated_nonempty_list_aux_COMMA_labeled_pattern_ = Obj.magic _1_inlined2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_either_ES6_FUN_FUN_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_class_expr = let _1 =
          let x =
            let _2 =
              let (_3, _1_inlined1, _1) = (_3_inlined1, _1_inlined2, _1_inlined1) in
              let _1 =
                let _1 =
                  let x =
                    let _1 = _1_inlined1 in
                    let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 6691 "reason_parser.ml"
                     in
                    
# 2623 "reason_parser.mly"
                                                          ( _1 )
# 6696 "reason_parser.ml"
                    
                  in
                  
# 200 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 6702 "reason_parser.ml"
                  
                in
                
# 4978 "reason_parser.mly"
                                                       ( _1 )
# 6708 "reason_parser.ml"
                
              in
              
# 2630 "reason_parser.mly"
                                               (
    (_1, false)
  )
# 6716 "reason_parser.ml"
              
            in
            
# 2053 "reason_parser.mly"
    ( let (lp, _) = _2 in
      List.fold_right mkclass_fun lp _4 )
# 6723 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__4_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4924 "reason_parser.mly"
  ( {x with pcl_loc = {x.pcl_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 6732 "reason_parser.ml"
          
        in
        
# 2082 "reason_parser.mly"
    (_1)
# 6738 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _1_inlined1;
                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _1;
                    MenhirLib.EngineTypes.startp = _startpos__1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_class_expr = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
        let _2 : unit = Obj.magic _2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_either_ES6_FUN_FUN_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_class_expr = let _1 =
          let x =
            let _2 =
              let (_endpos__3_, _startpos__1_, _3, _1) = (_endpos__3_inlined1_, _startpos__1_inlined1_, _3_inlined1, _1_inlined1) in
              let _endpos = _endpos__3_ in
              let _startpos = _startpos__1_ in
              
# 2633 "reason_parser.mly"
                      (
      let loc = mklocation _startpos _endpos in
      ([mkloc (Term (Nolabel, None, mkpat_constructor_unit loc loc)) loc], true)
  )
# 6807 "reason_parser.ml"
              
            in
            
# 2053 "reason_parser.mly"
    ( let (lp, _) = _2 in
      List.fold_right mkclass_fun lp _4 )
# 6814 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__4_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4924 "reason_parser.mly"
  ( {x with pcl_loc = {x.pcl_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 6823 "reason_parser.ml"
          
        in
        
# 2082 "reason_parser.mly"
    (_1)
# 6829 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _4_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__4_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__4_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2_inlined1;
                MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
                MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _1_inlined2;
                  MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
                  MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _2;
                    MenhirLib.EngineTypes.startp = _startpos__2_;
                    MenhirLib.EngineTypes.endp = _endpos__2_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _1_inlined1;
                      MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _menhir_s;
                        MenhirLib.EngineTypes.semv = _1;
                        MenhirLib.EngineTypes.startp = _startpos__1_;
                        MenhirLib.EngineTypes.endp = _endpos__1_;
                        MenhirLib.EngineTypes.next = _menhir_stack;
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_class_expr = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _4_inlined1 : unit = Obj.magic _4_inlined1 in
        let _2_inlined1 : 'tv_option_COMMA_ = Obj.magic _2_inlined1 in
        let _1_inlined2 : 'tv_lseparated_nonempty_list_aux_COMMA_labeled_pattern_ = Obj.magic _1_inlined2 in
        let _2 : unit = Obj.magic _2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_either_ES6_FUN_FUN_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_class_expr = let _1 =
          let x =
            let _2 =
              let (_4, _1_inlined1, _1) = (_4_inlined1, _1_inlined2, _1_inlined1) in
              let _3 =
                let (_2, _1) = (_2_inlined1, _1_inlined1) in
                let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 6909 "reason_parser.ml"
                 in
                
# 2623 "reason_parser.mly"
                                                          ( _1 )
# 6914 "reason_parser.ml"
                
              in
              
# 2637 "reason_parser.mly"
                                                  (
    let () = List.iter (fun p ->
        match p.txt with
        | Term (Labelled _, _, _)
        | Term (Optional _, _, _)  ->
            raise Reason_syntax_util.(
              Error(p.loc, (Syntax_error "Uncurried function definition with labelled arguments is not supported at the moment."))
            )
        | _ -> ()
      ) _3 in
    (_3, true)
  )
# 6931 "reason_parser.ml"
              
            in
            
# 2053 "reason_parser.mly"
    ( let (lp, _) = _2 in
      List.fold_right mkclass_fun lp _4 )
# 6938 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__4_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4924 "reason_parser.mly"
  ( {x with pcl_loc = {x.pcl_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 6947 "reason_parser.ml"
          
        in
        
# 2082 "reason_parser.mly"
    (_1)
# 6953 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_labeled_arguments = Obj.magic _2 in
        let _1 : 'tv_class_simple_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_class_expr = let _1 =
          let x = 
# 2063 "reason_parser.mly"
    ( mkclass(Pcl_apply(_1, _2)) )
# 6986 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4924 "reason_parser.mly"
  ( {x with pcl_loc = {x.pcl_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 6994 "reason_parser.ml"
          
        in
        
# 2082 "reason_parser.mly"
    (_1)
# 7000 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_class_expr = Obj.magic _2 in
        let _1 : 'tv_attribute = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_class_expr = let _1 =
          let x = 
# 2065 "reason_parser.mly"
    ( {_2 with pcl_attributes = _1 :: _2.pcl_attributes} )
# 7033 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4924 "reason_parser.mly"
  ( {x with pcl_loc = {x.pcl_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 7041 "reason_parser.ml"
          
        in
        
# 2082 "reason_parser.mly"
    (_1)
# 7047 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_loption_type_parameters_ = Obj.magic _3 in
        let x : 'tv_class_longident = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_class_expr = let _1 =
          let x =
            let _2 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 7091 "reason_parser.ml"
              
            in
            
# 2079 "reason_parser.mly"
    ( mkclass(Pcl_constr(_2, _3)) )
# 7097 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4924 "reason_parser.mly"
  ( {x with pcl_loc = {x.pcl_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 7106 "reason_parser.ml"
          
        in
        
# 2082 "reason_parser.mly"
    (_1)
# 7112 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_extension = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_class_expr = let _1 =
          let x = 
# 2081 "reason_parser.mly"
    ( mkclass(Pcl_extension _1) )
# 7138 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4924 "reason_parser.mly"
  ( {x with pcl_loc = {x.pcl_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 7146 "reason_parser.ml"
          
        in
        
# 2082 "reason_parser.mly"
    (_1)
# 7152 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_class_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_class_expr_lets_and_rest = let _1 =
          let x = 
# 2021 "reason_parser.mly"
               ( _1 )
# 7178 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = if _startpos_x_ != _endpos_x_ then
            _startpos_x_
          else
            _endpos in
          
# 4924 "reason_parser.mly"
  ( {x with pcl_loc = {x.pcl_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 7189 "reason_parser.ml"
          
        in
        
# 2025 "reason_parser.mly"
    (_1)
# 7195 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_class_expr_lets_and_rest = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_let_bindings = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_class_expr_lets_and_rest = let _1 =
          let x = 
# 2023 "reason_parser.mly"
    ( class_of_let_bindings _1 _3 )
# 7235 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = if _startpos_x_ != _endpos_x_ then
            _startpos_x_
          else
            _endpos in
          
# 4924 "reason_parser.mly"
  ( {x with pcl_loc = {x.pcl_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 7246 "reason_parser.ml"
          
        in
        
# 2025 "reason_parser.mly"
    (_1)
# 7252 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_object_body = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_class_expr_lets_and_rest = let _1 =
          let x = 
# 2024 "reason_parser.mly"
                ( mkclass (Pcl_structure _1) )
# 7278 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = if _startpos_x_ != _endpos_x_ then
            _startpos_x_
          else
            _endpos in
          
# 4924 "reason_parser.mly"
  ( {x with pcl_loc = {x.pcl_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 7289 "reason_parser.ml"
          
        in
        
# 2025 "reason_parser.mly"
    (_1)
# 7295 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_option_preceded_AS_LIDENT__ = Obj.magic _5 in
        let _4 : 'tv_class_expr = Obj.magic _4 in
        let _3 : 'tv_override_flag = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_class_field = let _1 =
          let x =
            let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 7343 "reason_parser.ml"
             in
            
# 2107 "reason_parser.mly"
      ( mkcf_attrs (Pcf_inherit (_3, _4, _5)) _1 )
# 7348 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__5_, _startpos__2_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4928 "reason_parser.mly"
   ( {x with pcf_loc = {x.pcf_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 7357 "reason_parser.ml"
          
        in
        
# 2118 "reason_parser.mly"
      ( [_1] )
# 7363 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_option_preceded_AS_LIDENT__ = Obj.magic _5 in
        let _4 : 'tv_class_expr = Obj.magic _4 in
        let _3 : 'tv_override_flag = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_class_field = let _1 =
          let x =
            let _1 =
              let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 7419 "reason_parser.ml"
               in
              
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 7424 "reason_parser.ml"
              
            in
            
# 2107 "reason_parser.mly"
      ( mkcf_attrs (Pcf_inherit (_3, _4, _5)) _1 )
# 7430 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__5_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4928 "reason_parser.mly"
   ( {x with pcf_loc = {x.pcf_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 7439 "reason_parser.ml"
          
        in
        
# 2118 "reason_parser.mly"
      ( [_1] )
# 7445 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _3 : 'tv_value = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_class_field = let _1 =
          let x =
            let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 7479 "reason_parser.ml"
             in
            
# 2109 "reason_parser.mly"
      ( mkcf_attrs (Pcf_val _3) _1 )
# 7484 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__2_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4928 "reason_parser.mly"
   ( {x with pcf_loc = {x.pcf_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 7493 "reason_parser.ml"
          
        in
        
# 2118 "reason_parser.mly"
      ( [_1] )
# 7499 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_value = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_class_field = let _1 =
          let x =
            let _1 =
              let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 7541 "reason_parser.ml"
               in
              
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 7546 "reason_parser.ml"
              
            in
            
# 2109 "reason_parser.mly"
      ( mkcf_attrs (Pcf_val _3) _1 )
# 7552 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4928 "reason_parser.mly"
   ( {x with pcf_loc = {x.pcf_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 7561 "reason_parser.ml"
          
        in
        
# 2118 "reason_parser.mly"
      ( [_1] )
# 7567 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _3 : 'tv_method_ = Obj.magic _3 in
        let _2 : 'tv_either___anonymous_12___anonymous_13_ = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_class_field = let _1 =
          let x =
            let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 7601 "reason_parser.ml"
             in
            
# 2111 "reason_parser.mly"
      ( let (a, b) = _3 in mkcf_attrs (Pcf_method (a, _2, b)) _1 )
# 7606 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__2_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4928 "reason_parser.mly"
   ( {x with pcf_loc = {x.pcf_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 7615 "reason_parser.ml"
          
        in
        
# 2118 "reason_parser.mly"
      ( [_1] )
# 7621 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_method_ = Obj.magic _3 in
        let _2 : 'tv_either___anonymous_12___anonymous_13_ = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_class_field = let _1 =
          let x =
            let _1 =
              let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 7663 "reason_parser.ml"
               in
              
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 7668 "reason_parser.ml"
              
            in
            
# 2111 "reason_parser.mly"
      ( let (a, b) = _3 in mkcf_attrs (Pcf_method (a, _2, b)) _1 )
# 7674 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4928 "reason_parser.mly"
   ( {x with pcf_loc = {x.pcf_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 7683 "reason_parser.ml"
          
        in
        
# 2118 "reason_parser.mly"
      ( [_1] )
# 7689 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _3 : 'tv_constrain_field = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_class_field = let _1 =
          let x =
            let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 7723 "reason_parser.ml"
             in
            
# 2113 "reason_parser.mly"
      ( mkcf_attrs (Pcf_constraint _3) _1 )
# 7728 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__2_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4928 "reason_parser.mly"
   ( {x with pcf_loc = {x.pcf_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 7737 "reason_parser.ml"
          
        in
        
# 2118 "reason_parser.mly"
      ( [_1] )
# 7743 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_constrain_field = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_class_field = let _1 =
          let x =
            let _1 =
              let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 7785 "reason_parser.ml"
               in
              
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 7790 "reason_parser.ml"
              
            in
            
# 2113 "reason_parser.mly"
      ( mkcf_attrs (Pcf_constraint _3) _1 )
# 7796 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4928 "reason_parser.mly"
   ( {x with pcf_loc = {x.pcf_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 7805 "reason_parser.ml"
          
        in
        
# 2118 "reason_parser.mly"
      ( [_1] )
# 7811 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _1 : 'tv_simple_expr_call = Obj.magic _1 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_class_field = let _1 =
          let x =
            let _3 =
              let x =
                let _endpos = _endpos__1_ in
                let _startpos = _startpos__1_ in
                
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 7849 "reason_parser.ml"
                
              in
              let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 7858 "reason_parser.ml"
              
            in
            let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 7864 "reason_parser.ml"
             in
            
# 2115 "reason_parser.mly"
      ( mkcf_attrs (Pcf_initializer _3) _1 )
# 7869 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__2_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4928 "reason_parser.mly"
   ( {x with pcf_loc = {x.pcf_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 7878 "reason_parser.ml"
          
        in
        
# 2118 "reason_parser.mly"
      ( [_1] )
# 7884 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _1_inlined1;
          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _1_inlined1 : 'tv_simple_expr_call = Obj.magic _1_inlined1 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_inlined1_ in
        let _v : 'tv_class_field = let _1 =
          let x =
            let _3 =
              let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
              let x =
                let _endpos = _endpos__1_ in
                let _startpos = _startpos__1_ in
                
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 7930 "reason_parser.ml"
                
              in
              let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 7939 "reason_parser.ml"
              
            in
            let _1 =
              let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 7946 "reason_parser.ml"
               in
              
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 7951 "reason_parser.ml"
              
            in
            
# 2115 "reason_parser.mly"
      ( mkcf_attrs (Pcf_initializer _3) _1 )
# 7957 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_inlined1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4928 "reason_parser.mly"
   ( {x with pcf_loc = {x.pcf_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 7966 "reason_parser.ml"
          
        in
        
# 2118 "reason_parser.mly"
      ( [_1] )
# 7972 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _2 : 'tv_item_extension = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_class_field = let _1 =
          let x =
            let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 7999 "reason_parser.ml"
             in
            
# 2117 "reason_parser.mly"
      ( mkcf_attrs (Pcf_extension _2) _1 )
# 8004 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__2_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4928 "reason_parser.mly"
   ( {x with pcf_loc = {x.pcf_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 8013 "reason_parser.ml"
          
        in
        
# 2118 "reason_parser.mly"
      ( [_1] )
# 8019 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_item_extension = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_class_field = let _1 =
          let x =
            let _1 =
              let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 8054 "reason_parser.ml"
               in
              
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 8059 "reason_parser.ml"
              
            in
            
# 2117 "reason_parser.mly"
      ( mkcf_attrs (Pcf_extension _2) _1 )
# 8065 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4928 "reason_parser.mly"
   ( {x with pcf_loc = {x.pcf_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 8074 "reason_parser.ml"
          
        in
        
# 2118 "reason_parser.mly"
      ( [_1] )
# 8080 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_class_field = let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 8105 "reason_parser.ml"
         in
        
# 2120 "reason_parser.mly"
    ( List.map (fun x -> mkcf ~loc:x.loc (Pcf_attribute x.txt)) _1 )
# 8110 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_loption_parenthesized_class_type_arguments_comma_list__ = Obj.magic _2 in
        let x : 'tv_clty_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_class_instance_type = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 8147 "reason_parser.ml"
              
            in
            
# 2311 "reason_parser.mly"
    ( mkcty (Pcty_constr (_1, _2)) )
# 8153 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__2_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4900 "reason_parser.mly"
  ( {x with pcty_loc = {x.pcty_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 8162 "reason_parser.ml"
          
        in
        
# 2320 "reason_parser.mly"
    (_1)
# 8168 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_class_instance_type = Obj.magic _2 in
        let _1 : 'tv_attribute = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_class_instance_type = let _1 =
          let x = 
# 2315 "reason_parser.mly"
    ( {_2 with pcty_attributes = _1 :: _2.pcty_attributes} )
# 8201 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4900 "reason_parser.mly"
  ( {x with pcty_loc = {x.pcty_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 8209 "reason_parser.ml"
          
        in
        
# 2320 "reason_parser.mly"
    (_1)
# 8215 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_class_type_body = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_class_instance_type = let _1 =
          let x = 
# 2317 "reason_parser.mly"
    ( _1 )
# 8241 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4900 "reason_parser.mly"
  ( {x with pcty_loc = {x.pcty_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 8249 "reason_parser.ml"
          
        in
        
# 2320 "reason_parser.mly"
    (_1)
# 8255 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_extension = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_class_instance_type = let _1 =
          let x = 
# 2319 "reason_parser.mly"
    ( mkcty (Pcty_extension _1) )
# 8281 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4900 "reason_parser.mly"
  ( {x with pcty_loc = {x.pcty_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 8289 "reason_parser.ml"
          
        in
        
# 2320 "reason_parser.mly"
    (_1)
# 8295 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : (
# 1173 "reason_parser.mly"
       (string)
# 8316 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_class_longident = 
# 4696 "reason_parser.mly"
                                 ( Lident _1 )
# 8324 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : (
# 1173 "reason_parser.mly"
       (string)
# 8357 "reason_parser.ml"
        ) = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_mod_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_class_longident = 
# 4697 "reason_parser.mly"
                                 ( Ldot(_1, _3) )
# 8367 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_pattern = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_class_self_expr = 
# 2046 "reason_parser.mly"
               ( _2 )
# 8399 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_core_type = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_class_self_type = 
# 2347 "reason_parser.mly"
                 ( _2 )
# 8431 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_class_self_type = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_class_sig_body = 
# 2339 "reason_parser.mly"
  ( Csig.mk _1 [] )
# 8456 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_class_sig_body_fields = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_class_self_type = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_class_sig_body = 
# 2341 "reason_parser.mly"
  ( Csig.mk _1 _3 )
# 8495 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_class_sig_body_fields = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_class_sig_body = let _endpos = _endpos__1_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _endpos in
        
# 2343 "reason_parser.mly"
  ( Csig.mk (Typ.mk ~loc:(mklocation _symbolstartpos _endpos) Ptyp_any) _1 )
# 8525 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _2 : 'tv_option_SEMI_ = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_class_sig_body_fields = let _1 = 
# 4964 "reason_parser.mly"
                ( [] )
# 8550 "reason_parser.ml"
         in
        
# 2335 "reason_parser.mly"
                                               ( List.concat _1 )
# 8555 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_option_SEMI_ = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_SEMI_class_sig_field_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_class_sig_body_fields = let _1 =
          let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 8588 "reason_parser.ml"
           in
          
# 4965 "reason_parser.mly"
                                     ( _1 )
# 8593 "reason_parser.ml"
          
        in
        
# 2335 "reason_parser.mly"
                                               ( List.concat _1 )
# 8599 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _3 : 'tv_class_instance_type = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_class_sig_field = let _1 =
          let x =
            let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 8633 "reason_parser.ml"
             in
            
# 2353 "reason_parser.mly"
      ( mkctf_attrs (Pctf_inherit _3) _1 )
# 8638 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__2_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4904 "reason_parser.mly"
  ( {x with pctf_loc = {x.pctf_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 8647 "reason_parser.ml"
          
        in
        
# 2364 "reason_parser.mly"
      ( [_1] )
# 8653 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_class_instance_type = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_class_sig_field = let _1 =
          let x =
            let _1 =
              let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 8695 "reason_parser.ml"
               in
              
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 8700 "reason_parser.ml"
              
            in
            
# 2353 "reason_parser.mly"
      ( mkctf_attrs (Pctf_inherit _3) _1 )
# 8706 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4904 "reason_parser.mly"
  ( {x with pctf_loc = {x.pctf_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 8715 "reason_parser.ml"
          
        in
        
# 2364 "reason_parser.mly"
      ( [_1] )
# 8721 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _3 : 'tv_value_type = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_class_sig_field = let _1 =
          let x =
            let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 8755 "reason_parser.ml"
             in
            
# 2355 "reason_parser.mly"
      ( mkctf_attrs (Pctf_val _3) _1 )
# 8760 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__2_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4904 "reason_parser.mly"
  ( {x with pctf_loc = {x.pctf_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 8769 "reason_parser.ml"
          
        in
        
# 2364 "reason_parser.mly"
      ( [_1] )
# 8775 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_value_type = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_class_sig_field = let _1 =
          let x =
            let _1 =
              let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 8817 "reason_parser.ml"
               in
              
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 8822 "reason_parser.ml"
              
            in
            
# 2355 "reason_parser.mly"
      ( mkctf_attrs (Pctf_val _3) _1 )
# 8828 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4904 "reason_parser.mly"
  ( {x with pctf_loc = {x.pctf_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 8837 "reason_parser.ml"
          
        in
        
# 2364 "reason_parser.mly"
      ( [_1] )
# 8843 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _6;
          MenhirLib.EngineTypes.startp = _startpos__6_;
          MenhirLib.EngineTypes.endp = _endpos__6_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _5;
            MenhirLib.EngineTypes.startp = _startpos__5_;
            MenhirLib.EngineTypes.endp = _endpos__5_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _3;
                MenhirLib.EngineTypes.startp = _startpos__3_;
                MenhirLib.EngineTypes.endp = _endpos__3_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _2;
                  MenhirLib.EngineTypes.startp = _startpos__2_;
                  MenhirLib.EngineTypes.endp = _endpos__2_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _6 : 'tv_poly_type = Obj.magic _6 in
        let _5 : unit = Obj.magic _5 in
        let _1 : (
# 1173 "reason_parser.mly"
       (string)
# 8890 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _3 : 'tv_virtual_flag = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__6_ in
        let _v : 'tv_class_sig_field = let _1 =
          let x =
            let _4 = 
# 4721 "reason_parser.mly"
                      ( _1 )
# 8902 "reason_parser.ml"
             in
            let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 8907 "reason_parser.ml"
             in
            
# 2357 "reason_parser.mly"
      ( mkctf_attrs (Pctf_method (_4, Private, _3, _6)) _1 )
# 8912 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__6_, _startpos__2_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4904 "reason_parser.mly"
  ( {x with pctf_loc = {x.pctf_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 8921 "reason_parser.ml"
          
        in
        
# 2364 "reason_parser.mly"
      ( [_1] )
# 8927 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _6;
          MenhirLib.EngineTypes.startp = _startpos__6_;
          MenhirLib.EngineTypes.endp = _endpos__6_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _5;
            MenhirLib.EngineTypes.startp = _startpos__5_;
            MenhirLib.EngineTypes.endp = _endpos__5_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _3;
                MenhirLib.EngineTypes.startp = _startpos__3_;
                MenhirLib.EngineTypes.endp = _endpos__3_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _2;
                  MenhirLib.EngineTypes.startp = _startpos__2_;
                  MenhirLib.EngineTypes.endp = _endpos__2_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _1;
                    MenhirLib.EngineTypes.startp = _startpos__1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _6 : 'tv_poly_type = Obj.magic _6 in
        let _5 : unit = Obj.magic _5 in
        let _1_inlined1 : (
# 1173 "reason_parser.mly"
       (string)
# 8980 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _3 : 'tv_virtual_flag = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__6_ in
        let _v : 'tv_class_sig_field = let _1 =
          let x =
            let _4 =
              let _1 = _1_inlined1 in
              
# 4721 "reason_parser.mly"
                      ( _1 )
# 8995 "reason_parser.ml"
              
            in
            let _1 =
              let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 9002 "reason_parser.ml"
               in
              
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 9007 "reason_parser.ml"
              
            in
            
# 2357 "reason_parser.mly"
      ( mkctf_attrs (Pctf_method (_4, Private, _3, _6)) _1 )
# 9013 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__6_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4904 "reason_parser.mly"
  ( {x with pctf_loc = {x.pctf_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 9022 "reason_parser.ml"
          
        in
        
# 2364 "reason_parser.mly"
      ( [_1] )
# 9028 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _6;
          MenhirLib.EngineTypes.startp = _startpos__6_;
          MenhirLib.EngineTypes.endp = _endpos__6_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _5;
            MenhirLib.EngineTypes.startp = _startpos__5_;
            MenhirLib.EngineTypes.endp = _endpos__5_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _3;
                MenhirLib.EngineTypes.startp = _startpos__3_;
                MenhirLib.EngineTypes.endp = _endpos__3_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _2;
                  MenhirLib.EngineTypes.startp = _startpos__2_;
                  MenhirLib.EngineTypes.endp = _endpos__2_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _6 : 'tv_poly_type = Obj.magic _6 in
        let _5 : unit = Obj.magic _5 in
        let _1 : (
# 1173 "reason_parser.mly"
       (string)
# 9075 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _3 : 'tv_virtual_flag = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__6_ in
        let _v : 'tv_class_sig_field = let _1 =
          let x =
            let _4 = 
# 4721 "reason_parser.mly"
                      ( _1 )
# 9087 "reason_parser.ml"
             in
            let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 9092 "reason_parser.ml"
             in
            
# 2359 "reason_parser.mly"
      ( mkctf_attrs (Pctf_method (_4, Public, _3, _6)) _1 )
# 9097 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__6_, _startpos__2_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4904 "reason_parser.mly"
  ( {x with pctf_loc = {x.pctf_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 9106 "reason_parser.ml"
          
        in
        
# 2364 "reason_parser.mly"
      ( [_1] )
# 9112 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _6;
          MenhirLib.EngineTypes.startp = _startpos__6_;
          MenhirLib.EngineTypes.endp = _endpos__6_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _5;
            MenhirLib.EngineTypes.startp = _startpos__5_;
            MenhirLib.EngineTypes.endp = _endpos__5_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _3;
                MenhirLib.EngineTypes.startp = _startpos__3_;
                MenhirLib.EngineTypes.endp = _endpos__3_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _2;
                  MenhirLib.EngineTypes.startp = _startpos__2_;
                  MenhirLib.EngineTypes.endp = _endpos__2_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _1;
                    MenhirLib.EngineTypes.startp = _startpos__1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _6 : 'tv_poly_type = Obj.magic _6 in
        let _5 : unit = Obj.magic _5 in
        let _1_inlined1 : (
# 1173 "reason_parser.mly"
       (string)
# 9165 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _3 : 'tv_virtual_flag = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__6_ in
        let _v : 'tv_class_sig_field = let _1 =
          let x =
            let _4 =
              let _1 = _1_inlined1 in
              
# 4721 "reason_parser.mly"
                      ( _1 )
# 9180 "reason_parser.ml"
              
            in
            let _1 =
              let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 9187 "reason_parser.ml"
               in
              
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 9192 "reason_parser.ml"
              
            in
            
# 2359 "reason_parser.mly"
      ( mkctf_attrs (Pctf_method (_4, Public, _3, _6)) _1 )
# 9198 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__6_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4904 "reason_parser.mly"
  ( {x with pctf_loc = {x.pctf_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 9207 "reason_parser.ml"
          
        in
        
# 2364 "reason_parser.mly"
      ( [_1] )
# 9213 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _3 : 'tv_constrain_field = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_class_sig_field = let _1 =
          let x =
            let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 9247 "reason_parser.ml"
             in
            
# 2361 "reason_parser.mly"
      ( mkctf_attrs (Pctf_constraint _3) _1 )
# 9252 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__2_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4904 "reason_parser.mly"
  ( {x with pctf_loc = {x.pctf_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 9261 "reason_parser.ml"
          
        in
        
# 2364 "reason_parser.mly"
      ( [_1] )
# 9267 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_constrain_field = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_class_sig_field = let _1 =
          let x =
            let _1 =
              let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 9309 "reason_parser.ml"
               in
              
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 9314 "reason_parser.ml"
              
            in
            
# 2361 "reason_parser.mly"
      ( mkctf_attrs (Pctf_constraint _3) _1 )
# 9320 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4904 "reason_parser.mly"
  ( {x with pctf_loc = {x.pctf_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 9329 "reason_parser.ml"
          
        in
        
# 2364 "reason_parser.mly"
      ( [_1] )
# 9335 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _2 : 'tv_item_extension = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_class_sig_field = let _1 =
          let x =
            let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 9362 "reason_parser.ml"
             in
            
# 2363 "reason_parser.mly"
      ( mkctf_attrs (Pctf_extension _2) _1 )
# 9367 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__2_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4904 "reason_parser.mly"
  ( {x with pctf_loc = {x.pctf_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 9376 "reason_parser.ml"
          
        in
        
# 2364 "reason_parser.mly"
      ( [_1] )
# 9382 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_item_extension = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_class_sig_field = let _1 =
          let x =
            let _1 =
              let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 9417 "reason_parser.ml"
               in
              
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 9422 "reason_parser.ml"
              
            in
            
# 2363 "reason_parser.mly"
      ( mkctf_attrs (Pctf_extension _2) _1 )
# 9428 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4904 "reason_parser.mly"
  ( {x with pctf_loc = {x.pctf_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 9437 "reason_parser.ml"
          
        in
        
# 2364 "reason_parser.mly"
      ( [_1] )
# 9443 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_class_sig_field = let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 9468 "reason_parser.ml"
         in
        
# 2366 "reason_parser.mly"
    ( List.map (fun x -> mkctf ~loc:x.loc (Pctf_attribute x.txt)) _1 )
# 9473 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : 'tv_class_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_class_simple_expr = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 9503 "reason_parser.ml"
              
            in
            
# 2087 "reason_parser.mly"
    ( mkclass(Pcl_constr(_1, [])) )
# 9509 "reason_parser.ml"
            
          in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4924 "reason_parser.mly"
  ( {x with pcl_loc = {x.pcl_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 9517 "reason_parser.ml"
          
        in
        
# 2100 "reason_parser.mly"
    (_1)
# 9523 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_class_expr_lets_and_rest = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_class_simple_expr = let _1 =
          let x =
            let _1 = 
# 2102 "reason_parser.mly"
                                                                ( _2 )
# 9564 "reason_parser.ml"
             in
            
# 2089 "reason_parser.mly"
    ( _1 )
# 9569 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4924 "reason_parser.mly"
  ( {x with pcl_loc = {x.pcl_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 9578 "reason_parser.ml"
          
        in
        
# 2100 "reason_parser.mly"
    (_1)
# 9584 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _2 : 'tv_class_expr_lets_and_rest = Obj.magic _2 in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_class_simple_expr = let _1 =
          let x =
            let _3 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 9629 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 9638 "reason_parser.ml"
              
            in
            
# 2091 "reason_parser.mly"
    ( unclosed_cl (with_txt _1 "{") (with_txt _3 "}") )
# 9644 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos_x_inlined1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4924 "reason_parser.mly"
  ( {x with pcl_loc = {x.pcl_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 9653 "reason_parser.ml"
          
        in
        
# 2100 "reason_parser.mly"
    (_1)
# 9659 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_class_constructor_type = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_class_expr = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_class_simple_expr = let _1 =
          let x = 
# 2093 "reason_parser.mly"
    ( mkclass(Pcl_constraint(_2, _4)) )
# 9713 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__5_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4924 "reason_parser.mly"
  ( {x with pcl_loc = {x.pcl_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 9721 "reason_parser.ml"
          
        in
        
# 2100 "reason_parser.mly"
    (_1)
# 9727 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _4 : 'tv_class_constructor_type = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_class_expr = Obj.magic _2 in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_class_simple_expr = let _1 =
          let x =
            let _5 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 9786 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 9795 "reason_parser.ml"
              
            in
            
# 2095 "reason_parser.mly"
    ( unclosed_cl (with_txt _1 "(") (with_txt _5 ")") )
# 9801 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos_x_inlined1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4924 "reason_parser.mly"
  ( {x with pcl_loc = {x.pcl_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 9810 "reason_parser.ml"
          
        in
        
# 2100 "reason_parser.mly"
    (_1)
# 9816 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_class_expr = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_class_simple_expr = let _1 =
          let x = 
# 2097 "reason_parser.mly"
    ( _2 )
# 9856 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4924 "reason_parser.mly"
  ( {x with pcl_loc = {x.pcl_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 9864 "reason_parser.ml"
          
        in
        
# 2100 "reason_parser.mly"
    (_1)
# 9870 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _2 : 'tv_class_expr = Obj.magic _2 in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_class_simple_expr = let _1 =
          let x =
            let _3 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 9915 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 9924 "reason_parser.ml"
              
            in
            
# 2099 "reason_parser.mly"
    ( unclosed_cl (with_txt _1 "(") (with_txt _3 ")") )
# 9930 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos_x_inlined1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4924 "reason_parser.mly"
  ( {x with pcl_loc = {x.pcl_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 9939 "reason_parser.ml"
          
        in
        
# 2100 "reason_parser.mly"
    (_1)
# 9945 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_option_COMMA_ = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_core_type_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_class_type_arguments_comma_list = let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 9977 "reason_parser.ml"
         in
        
# 2304 "reason_parser.mly"
                                                     (_1)
# 9982 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_class_sig_body = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_class_type_body = let _endpos = _endpos__3_ in
        let _startpos = _startpos__1_ in
        
# 2324 "reason_parser.mly"
    ( mkcty ~loc:(mklocation _startpos _endpos) (Pcty_signature _2) )
# 10023 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_class_sig_body = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_class_type_body = let _endpos = _endpos__4_ in
        let _startpos = _startpos__1_ in
        
# 2326 "reason_parser.mly"
    ( let loc = mklocation _startpos _endpos in
      let ct = mkcty ~loc (Pcty_signature _3) in
      {ct with pcty_attributes = [uncurry_payload loc]}
    )
# 10074 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _2 : 'tv_class_sig_body = Obj.magic _2 in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_class_type_body = let _3 =
          let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 10117 "reason_parser.ml"
          
        in
        let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 10126 "reason_parser.ml"
          
        in
        
# 2331 "reason_parser.mly"
    ( unclosed_cty (with_txt _1 "{") (with_txt _3 "}") )
# 10132 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_either_preceded_EQUAL_class_instance_type__class_type_body_ = Obj.magic _4 in
        let _3 : 'tv_loption_class_type_parameters_ = Obj.magic _3 in
        let x : (
# 1173 "reason_parser.mly"
       (string)
# 10173 "reason_parser.ml"
        ) = Obj.magic x in
        let _1 : 'tv_virtual_flag = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_class_type_declaration_details = let _2 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 10185 "reason_parser.ml"
          
        in
        
# 2433 "reason_parser.mly"
  ( (_2, _4, _1, _3) )
# 10191 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_list_and_class_type_declaration_ = Obj.magic _5 in
        let _4 : 'tv_class_type_declaration_details = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_class_type_declarations = let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 10237 "reason_parser.ml"
         in
        let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
        let _endpos = _endpos__5_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 2416 "reason_parser.mly"
  ( let (ident, instance_type, virt, params) = _4 in
    let loc = mklocation _symbolstartpos _endpos in
    (Ci.mk ident instance_type ~virt ~params ~attrs:_1 ~loc :: _5)
  )
# 10251 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_list_and_class_type_declaration_ = Obj.magic _5 in
        let _4 : 'tv_class_type_declaration_details = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_class_type_declarations = let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 10305 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 10310 "reason_parser.ml"
          
        in
        let _endpos = _endpos__5_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 2416 "reason_parser.mly"
  ( let (ident, instance_type, virt, params) = _4 in
    let loc = mklocation _symbolstartpos _endpos in
    (Ci.mk ident instance_type ~virt ~params ~attrs:_1 ~loc :: _5)
  )
# 10324 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : (
# 1173 "reason_parser.mly"
       (string)
# 10345 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_clty_longident = 
# 4691 "reason_parser.mly"
                                 ( Lident _1 )
# 10353 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : (
# 1173 "reason_parser.mly"
       (string)
# 10386 "reason_parser.ml"
        ) = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_mod_ext_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_clty_longident = 
# 4692 "reason_parser.mly"
                                 ( Ldot(_1, _3) )
# 10396 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : (
# 1156 "reason_parser.mly"
       (string * char option)
# 10417 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_constant = 
# 4557 "reason_parser.mly"
                 ( let (n, m) = _1 in ([], Pconst_integer (n, m)) )
# 10425 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : (
# 1115 "reason_parser.mly"
       (char)
# 10446 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_constant = 
# 4558 "reason_parser.mly"
                 ( ([], Pconst_char _1) )
# 10454 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : (
# 1136 "reason_parser.mly"
       (string * char option)
# 10475 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_constant = 
# 4559 "reason_parser.mly"
                 ( let (f, m) = _1 in ([], Pconst_float (f, m)) )
# 10483 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : (
# 1212 "reason_parser.mly"
       (string * string option * string option)
# 10504 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_constant = 
# 4560 "reason_parser.mly"
                 (
    let (s, raw, d) = _1 in
    let attr = match raw with
      | None -> []
      | Some raw ->
        let constant = Ast_helper.Exp.constant (Pconst_string (raw, None)) in
        [Location.mknoloc "reason.raw_literal", PStr [mkstrexp constant []]]
    in
    (attr, Pconst_string (s, d))
  )
# 10521 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_mod_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_constr_longident = 
# 4644 "reason_parser.mly"
                                  ( _1 )
# 10546 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_constr_longident = 
# 4645 "reason_parser.mly"
                                  ( Lident "[]" )
# 10578 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_constr_longident = 
# 4646 "reason_parser.mly"
                                  ( Lident "()" )
# 10610 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_constr_longident = 
# 4647 "reason_parser.mly"
                                  ( Lident "false" )
# 10635 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_constr_longident = 
# 4648 "reason_parser.mly"
                                  ( Lident "true" )
# 10660 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_core_type = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_core_type = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_constrain = let _endpos = _endpos__3_ in
        let _symbolstartpos = _startpos__1_ in
        
# 2376 "reason_parser.mly"
  ( (_1, _3, mklocation _symbolstartpos _endpos) )
# 10701 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_core_type = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_core_type = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_constrain_field = 
# 2381 "reason_parser.mly"
  ( (_1, _3) )
# 10740 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_object_record_type = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_constructor_arguments = 
# 4085 "reason_parser.mly"
                       ( Pcstr_tuple [_1] )
# 10765 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_record_declaration = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_constructor_arguments = 
# 4089 "reason_parser.mly"
                       ( Pcstr_record _1 )
# 10790 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let x : 'tv_record_declaration = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_constructor_arguments = let _1 =
          let _1 = 
# 200 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 10830 "reason_parser.ml"
           in
          
# 4978 "reason_parser.mly"
                                                       ( _1 )
# 10835 "reason_parser.ml"
          
        in
        
# 4090 "reason_parser.mly"
                                      ( Pcstr_record _1 )
# 10841 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let x : 'tv_constructor_arguments_comma_list = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_constructor_arguments = let _1 =
          let _1 = 
# 200 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 10881 "reason_parser.ml"
           in
          
# 4978 "reason_parser.mly"
                                                       ( _1 )
# 10886 "reason_parser.ml"
          
        in
        
# 4092 "reason_parser.mly"
    ( Pcstr_tuple _1 )
# 10892 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_option_COMMA_ = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_core_type_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_constructor_arguments_comma_list = let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 10924 "reason_parser.ml"
         in
        
# 4081 "reason_parser.mly"
                                                    (_1)
# 10929 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _3 : 'tv_generalized_constructor_arguments = Obj.magic _3 in
        let _1 : (
# 1220 "reason_parser.mly"
       (string)
# 10957 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_constructor_declaration = let _2 =
          let x = 
# 4629 "reason_parser.mly"
                      ( _1 )
# 10966 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 10974 "reason_parser.ml"
          
        in
        let _startpos__2_ = _startpos__1_ in
        let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 10981 "reason_parser.ml"
         in
        let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 4057 "reason_parser.mly"
  ( let args, res = _3 in
    let loc = mklocation _symbolstartpos _endpos in
    Type.constructor ~attrs:_1 _2 ~args ?res ~loc )
# 10994 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_generalized_constructor_arguments = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_constructor_declaration = let _2 =
          let x = 
# 4630 "reason_parser.mly"
                      ( "[]" )
# 11034 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 11042 "reason_parser.ml"
          
        in
        let _startpos__2_ = _startpos__1_ in
        let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 11049 "reason_parser.ml"
         in
        let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 4057 "reason_parser.mly"
  ( let args, res = _3 in
    let loc = mklocation _symbolstartpos _endpos in
    Type.constructor ~attrs:_1 _2 ~args ?res ~loc )
# 11062 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_generalized_constructor_arguments = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_constructor_declaration = let _2 =
          let x = 
# 4631 "reason_parser.mly"
                      ( "()" )
# 11102 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 11110 "reason_parser.ml"
          
        in
        let _startpos__2_ = _startpos__1_ in
        let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 11117 "reason_parser.ml"
         in
        let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 4057 "reason_parser.mly"
  ( let args, res = _3 in
    let loc = mklocation _symbolstartpos _endpos in
    Type.constructor ~attrs:_1 _2 ~args ?res ~loc )
# 11130 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _3 : 'tv_generalized_constructor_arguments = Obj.magic _3 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_constructor_declaration = let _2 =
          let x = 
# 4632 "reason_parser.mly"
                      ( "::" )
# 11163 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 11171 "reason_parser.ml"
          
        in
        let _startpos__2_ = _startpos__1_ in
        let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 11178 "reason_parser.ml"
         in
        let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 4057 "reason_parser.mly"
  ( let args, res = _3 in
    let loc = mklocation _symbolstartpos _endpos in
    Type.constructor ~attrs:_1 _2 ~args ?res ~loc )
# 11191 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _3 : 'tv_generalized_constructor_arguments = Obj.magic _3 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_constructor_declaration = let _2 =
          let x = 
# 4634 "reason_parser.mly"
                      ( "false" )
# 11224 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 11232 "reason_parser.ml"
          
        in
        let _startpos__2_ = _startpos__1_ in
        let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 11239 "reason_parser.ml"
         in
        let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 4057 "reason_parser.mly"
  ( let args, res = _3 in
    let loc = mklocation _symbolstartpos _endpos in
    Type.constructor ~attrs:_1 _2 ~args ?res ~loc )
# 11252 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _3 : 'tv_generalized_constructor_arguments = Obj.magic _3 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_constructor_declaration = let _2 =
          let x = 
# 4635 "reason_parser.mly"
                      ( "true" )
# 11285 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 11293 "reason_parser.ml"
          
        in
        let _startpos__2_ = _startpos__1_ in
        let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 11300 "reason_parser.ml"
         in
        let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 4057 "reason_parser.mly"
  ( let args, res = _3 in
    let loc = mklocation _symbolstartpos _endpos in
    Type.constructor ~attrs:_1 _2 ~args ?res ~loc )
# 11313 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_generalized_constructor_arguments = Obj.magic _3 in
        let _1_inlined1 : (
# 1220 "reason_parser.mly"
       (string)
# 11347 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_constructor_declaration = let _2 =
          let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
          let x = 
# 4629 "reason_parser.mly"
                      ( _1 )
# 11358 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 11366 "reason_parser.ml"
          
        in
        let _startpos__2_ = _startpos__1_inlined1_ in
        let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 11374 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 11379 "reason_parser.ml"
          
        in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 4057 "reason_parser.mly"
  ( let args, res = _3 in
    let loc = mklocation _symbolstartpos _endpos in
    Type.constructor ~attrs:_1 _2 ~args ?res ~loc )
# 11392 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_generalized_constructor_arguments = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_constructor_declaration = let _2 =
          let (_startpos__1_, _1) = (_startpos__1_inlined1_, _1_inlined1) in
          let x = 
# 4630 "reason_parser.mly"
                      ( "[]" )
# 11440 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 11448 "reason_parser.ml"
          
        in
        let _startpos__2_ = _startpos__1_inlined1_ in
        let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 11456 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 11461 "reason_parser.ml"
          
        in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 4057 "reason_parser.mly"
  ( let args, res = _3 in
    let loc = mklocation _symbolstartpos _endpos in
    Type.constructor ~attrs:_1 _2 ~args ?res ~loc )
# 11474 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_generalized_constructor_arguments = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_constructor_declaration = let _2 =
          let (_startpos__1_, _1) = (_startpos__1_inlined1_, _1_inlined1) in
          let x = 
# 4631 "reason_parser.mly"
                      ( "()" )
# 11522 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 11530 "reason_parser.ml"
          
        in
        let _startpos__2_ = _startpos__1_inlined1_ in
        let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 11538 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 11543 "reason_parser.ml"
          
        in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 4057 "reason_parser.mly"
  ( let args, res = _3 in
    let loc = mklocation _symbolstartpos _endpos in
    Type.constructor ~attrs:_1 _2 ~args ?res ~loc )
# 11556 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_generalized_constructor_arguments = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_constructor_declaration = let _2 =
          let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
          let x = 
# 4632 "reason_parser.mly"
                      ( "::" )
# 11597 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 11605 "reason_parser.ml"
          
        in
        let _startpos__2_ = _startpos__1_inlined1_ in
        let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 11613 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 11618 "reason_parser.ml"
          
        in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 4057 "reason_parser.mly"
  ( let args, res = _3 in
    let loc = mklocation _symbolstartpos _endpos in
    Type.constructor ~attrs:_1 _2 ~args ?res ~loc )
# 11631 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_generalized_constructor_arguments = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_constructor_declaration = let _2 =
          let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
          let x = 
# 4634 "reason_parser.mly"
                      ( "false" )
# 11672 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 11680 "reason_parser.ml"
          
        in
        let _startpos__2_ = _startpos__1_inlined1_ in
        let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 11688 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 11693 "reason_parser.ml"
          
        in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 4057 "reason_parser.mly"
  ( let args, res = _3 in
    let loc = mklocation _symbolstartpos _endpos in
    Type.constructor ~attrs:_1 _2 ~args ?res ~loc )
# 11706 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_generalized_constructor_arguments = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_constructor_declaration = let _2 =
          let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
          let x = 
# 4635 "reason_parser.mly"
                      ( "true" )
# 11747 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 11755 "reason_parser.ml"
          
        in
        let _startpos__2_ = _startpos__1_inlined1_ in
        let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 11763 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 11768 "reason_parser.ml"
          
        in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 4057 "reason_parser.mly"
  ( let args, res = _3 in
    let loc = mklocation _symbolstartpos _endpos in
    Type.constructor ~attrs:_1 _2 ~args ?res ~loc )
# 11781 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_constructor_declarations_aux = Obj.magic _2 in
        let _1 : 'tv_either_constructor_declaration_bar_constructor_declaration_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_constructor_declarations = 
# 4036 "reason_parser.mly"
  ( let (cstrs, constraints, endpos, and_types) = _2 in
    (_1 :: cstrs, constraints, endpos, and_types)
  )
# 11815 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_constructor_declarations_aux = Obj.magic _2 in
        let _1 : 'tv_bar_constructor_declaration = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_constructor_declarations_aux = 
# 4043 "reason_parser.mly"
    ( let (cstrs, constraints, endpos, and_types) = _2 in
      (_1 :: cstrs, constraints, endpos, and_types)
    )
# 11849 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _2 : 'tv_and_type_declaration = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_constructor_declarations_aux = let _1 = 
# 3975 "reason_parser.mly"
    ( [] )
# 11874 "reason_parser.ml"
         in
        let _endpos__1_ = _endpos__0_ in
        
# 4047 "reason_parser.mly"
    ( ([], _1, _endpos__1_, _2) )
# 11880 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_and_type_declaration = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_preceded_CONSTRAINT_constrain__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_constructor_declarations_aux = let _1 = 
# 3976 "reason_parser.mly"
                                     ( _1 )
# 11912 "reason_parser.ml"
         in
        
# 4047 "reason_parser.mly"
    ( ([], _1, _endpos__1_, _2) )
# 11917 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_core_type2 = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_core_type = let _1 =
          let x = 
# 4322 "reason_parser.mly"
    ( _1 )
# 11943 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4912 "reason_parser.mly"
  ( {x with ptyp_loc = {x.ptyp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 11951 "reason_parser.ml"
          
        in
        
# 4325 "reason_parser.mly"
    (_1)
# 11957 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_ident = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_core_type2 = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_core_type = let _1 =
          let x = 
# 4324 "reason_parser.mly"
    ( mktyp(Ptyp_alias(_1, _4)) )
# 12004 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__4_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4912 "reason_parser.mly"
  ( {x with ptyp_loc = {x.ptyp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 12012 "reason_parser.ml"
          
        in
        
# 4325 "reason_parser.mly"
    (_1)
# 12018 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = ct;
          MenhirLib.EngineTypes.startp = _startpos_ct_;
          MenhirLib.EngineTypes.endp = _endpos_ct_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let ct : 'tv_unattributed_core_type = Obj.magic ct in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_ct_ in
        let _endpos = _endpos_ct_ in
        let _v : 'tv_core_type2 = let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 12043 "reason_parser.ml"
         in
        let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
        let _endpos = _endpos_ct_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos_ct_ in
        
# 4338 "reason_parser.mly"
  ( match _1 with
    | [] -> ct
    | attrs ->
      let loc_start = _symbolstartpos and loc_end = _endpos in
      let ptyp_loc = {ct.ptyp_loc with loc_start; loc_end} in
      let ptyp_attributes = attrs @ ct.ptyp_attributes in
      {ct with ptyp_attributes; ptyp_loc}
  )
# 12061 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = ct;
          MenhirLib.EngineTypes.startp = _startpos_ct_;
          MenhirLib.EngineTypes.endp = _endpos_ct_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let ct : 'tv_unattributed_core_type = Obj.magic ct in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_ct_ in
        let _v : 'tv_core_type2 = let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 12094 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 12099 "reason_parser.ml"
          
        in
        let _endpos = _endpos_ct_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos_ct_ in
        
# 4338 "reason_parser.mly"
  ( match _1 with
    | [] -> ct
    | attrs ->
      let loc_start = _symbolstartpos and loc_end = _endpos in
      let ptyp_loc = {ct.ptyp_loc with loc_start; loc_end} in
      let ptyp_attributes = attrs @ ct.ptyp_attributes in
      {ct with ptyp_attributes; ptyp_loc}
  )
# 12117 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_direction_flag = 
# 4734 "reason_parser.mly"
                  ( Upto )
# 12142 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_direction_flag = 
# 4735 "reason_parser.mly"
                  ( Downto )
# 12167 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_either_ES6_FUN_FUN_ = 
# 4940 "reason_parser.mly"
      ( _1 )
# 12192 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_either_ES6_FUN_FUN_ = 
# 4941 "reason_parser.mly"
      ( _1 )
# 12217 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_either___anonymous_12___anonymous_13_ = let _1 = 
# 2110 "reason_parser.mly"
                                 (Public)
# 12242 "reason_parser.ml"
         in
        
# 4940 "reason_parser.mly"
      ( _1 )
# 12247 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_either___anonymous_12___anonymous_13_ = let _1 = 
# 2110 "reason_parser.mly"
                                               (Private)
# 12272 "reason_parser.ml"
         in
        
# 4941 "reason_parser.mly"
      ( _1 )
# 12277 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_constructor_declaration = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_either_constructor_declaration_bar_constructor_declaration_ = 
# 4940 "reason_parser.mly"
      ( _1 )
# 12302 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_bar_constructor_declaration = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_either_constructor_declaration_bar_constructor_declaration_ = 
# 4941 "reason_parser.mly"
      ( _1 )
# 12327 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_extension_constructor_declaration = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_either_extension_constructor_declaration_extension_constructor_rebind_ = 
# 4940 "reason_parser.mly"
      ( _1 )
# 12352 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_extension_constructor_rebind = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_either_extension_constructor_declaration_extension_constructor_rebind_ = 
# 4941 "reason_parser.mly"
      ( _1 )
# 12377 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let x : 'tv_longident_type_constraint = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_either_parenthesized_longident_type_constraint__longident_type_constraint_ = let _1 =
          let _1 = 
# 200 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 12417 "reason_parser.ml"
           in
          
# 4978 "reason_parser.mly"
                                                       ( _1 )
# 12422 "reason_parser.ml"
          
        in
        
# 4940 "reason_parser.mly"
      ( _1 )
# 12428 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_longident_type_constraint = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_either_parenthesized_longident_type_constraint__longident_type_constraint_ = 
# 4941 "reason_parser.mly"
      ( _1 )
# 12453 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : 'tv_class_expr = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_either_preceded_EQUAL_class_expr__class_body_expr_ = let _1 = 
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 12485 "reason_parser.ml"
         in
        
# 4940 "reason_parser.mly"
      ( _1 )
# 12490 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_class_expr_lets_and_rest = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_either_preceded_EQUAL_class_expr__class_body_expr_ = let _1 = 
# 2102 "reason_parser.mly"
                                                                ( _2 )
# 12529 "reason_parser.ml"
         in
        
# 4941 "reason_parser.mly"
      ( _1 )
# 12534 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : 'tv_class_instance_type = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_either_preceded_EQUAL_class_instance_type__class_type_body_ = let _1 = 
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 12566 "reason_parser.ml"
         in
        
# 4940 "reason_parser.mly"
      ( _1 )
# 12571 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_class_type_body = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_either_preceded_EQUAL_class_instance_type__class_type_body_ = 
# 4941 "reason_parser.mly"
      ( _1 )
# 12596 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : 'tv_expr = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_either_preceded_EQUAL_expr__braced_expr_ = let _1 = 
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 12628 "reason_parser.ml"
         in
        
# 4940 "reason_parser.mly"
      ( _1 )
# 12633 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_braced_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_either_preceded_EQUAL_expr__braced_expr_ = 
# 4941 "reason_parser.mly"
      ( _1 )
# 12658 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : 'tv_expr = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_either_preceded_EQUALGREATER_expr__braced_expr_ = let _1 = 
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 12690 "reason_parser.ml"
         in
        
# 4940 "reason_parser.mly"
      ( _1 )
# 12695 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_braced_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_either_preceded_EQUALGREATER_expr__braced_expr_ = 
# 4941 "reason_parser.mly"
      ( _1 )
# 12720 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_embedded___anonymous_0_ = let x = 
# 1426 "reason_parser.mly"
                                     ( raise End_of_file)
# 12745 "reason_parser.ml"
         in
        
# 104 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 12750 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_structure_item = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_embedded___anonymous_0_ = let x = 
# 1427 "reason_parser.mly"
                                     ( Ptop_def _1 )
# 12782 "reason_parser.ml"
         in
        
# 104 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 12787 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_toplevel_directive = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_embedded___anonymous_0_ = let x = 
# 1428 "reason_parser.mly"
                                     ( _1 )
# 12819 "reason_parser.ml"
         in
        
# 104 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 12824 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_embedded___anonymous_1_ = let x = 
# 1433 "reason_parser.mly"
                                   ( [] )
# 12849 "reason_parser.ml"
         in
        
# 104 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 12854 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_use_file_no_mapper = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_structure_item = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_embedded___anonymous_1_ = let x = 
# 1434 "reason_parser.mly"
                                               ( Ptop_def _1  :: _3 )
# 12893 "reason_parser.ml"
         in
        
# 104 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 12898 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_use_file_no_mapper = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_toplevel_directive = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_embedded___anonymous_1_ = let x = 
# 1435 "reason_parser.mly"
                                               ( _1 :: _3 )
# 12937 "reason_parser.ml"
         in
        
# 104 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 12942 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_structure_item = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_embedded___anonymous_1_ = let x = 
# 1436 "reason_parser.mly"
                                     ( [Ptop_def _1 ] )
# 12974 "reason_parser.ml"
         in
        
# 104 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 12979 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_toplevel_directive = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_embedded___anonymous_1_ = let x = 
# 1437 "reason_parser.mly"
                                     ( [_1] )
# 13011 "reason_parser.ml"
         in
        
# 104 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 13016 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_ident = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_embedded___anonymous_34_ = let x = 
# 4005 "reason_parser.mly"
                      ( (mktyp (Ptyp_var _2) , Invariant    ) )
# 13048 "reason_parser.ml"
         in
        
# 104 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 13053 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_embedded___anonymous_34_ = let x = 
# 4006 "reason_parser.mly"
                      ( (mktyp (Ptyp_any)    , Invariant    ) )
# 13078 "reason_parser.ml"
         in
        
# 104 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 13083 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_ident = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_embedded___anonymous_34_ = let x = 
# 4007 "reason_parser.mly"
                      ( (mktyp (Ptyp_var _3) , Covariant    ) )
# 13122 "reason_parser.ml"
         in
        
# 104 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 13127 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_embedded___anonymous_34_ = let x = 
# 4008 "reason_parser.mly"
                      ( (mktyp (Ptyp_any)    , Covariant    ) )
# 13159 "reason_parser.ml"
         in
        
# 104 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 13164 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_ident = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_embedded___anonymous_34_ = let x = 
# 4009 "reason_parser.mly"
                      ( (mktyp (Ptyp_var _3) , Contravariant) )
# 13203 "reason_parser.ml"
         in
        
# 104 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 13208 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_embedded___anonymous_34_ = let x = 
# 4010 "reason_parser.mly"
                      ( (mktyp Ptyp_any      , Contravariant) )
# 13240 "reason_parser.ml"
         in
        
# 104 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 13245 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_embedded___anonymous_40_ = let x = 
# 4704 "reason_parser.mly"
                          ( Pdir_none )
# 13263 "reason_parser.ml"
         in
        
# 104 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 13268 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : (
# 1212 "reason_parser.mly"
       (string * string option * string option)
# 13289 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_embedded___anonymous_40_ = let x = 
# 4705 "reason_parser.mly"
                          ( let (s, _, _) = _1 in Pdir_string s )
# 13297 "reason_parser.ml"
         in
        
# 104 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 13302 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : (
# 1156 "reason_parser.mly"
       (string * char option)
# 13323 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_embedded___anonymous_40_ = let x = 
# 4706 "reason_parser.mly"
                          ( let (n, m) = _1 in Pdir_int (n, m) )
# 13331 "reason_parser.ml"
         in
        
# 104 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 13336 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_val_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_embedded___anonymous_40_ = let x = 
# 4707 "reason_parser.mly"
                          ( Pdir_ident _1 )
# 13361 "reason_parser.ml"
         in
        
# 104 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 13366 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_mod_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_embedded___anonymous_40_ = let x = 
# 4708 "reason_parser.mly"
                          ( Pdir_ident _1 )
# 13391 "reason_parser.ml"
         in
        
# 104 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 13396 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_embedded___anonymous_40_ = let x = 
# 4709 "reason_parser.mly"
                          ( Pdir_bool false )
# 13421 "reason_parser.ml"
         in
        
# 104 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 13426 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_embedded___anonymous_40_ = let x = 
# 4710 "reason_parser.mly"
                          ( Pdir_bool true )
# 13451 "reason_parser.ml"
         in
        
# 104 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 13456 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_embedded_private_flag_ = let x = 
# 4739 "reason_parser.mly"
                  ( Public )
# 13474 "reason_parser.ml"
         in
        
# 104 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 13479 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_embedded_private_flag_ = let x = 
# 4740 "reason_parser.mly"
                  ( Private )
# 13504 "reason_parser.ml"
         in
        
# 104 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 13509 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_es6_parameters = let _1 =
          let _endpos = _endpos__2_ in
          let _startpos = _startpos__1_ in
          
# 2626 "reason_parser.mly"
                  (
    let loc = mklocation _startpos _endpos in
    ([mkloc (Term (Nolabel, None, mkpat_constructor_unit loc loc)) loc], false)
  )
# 13547 "reason_parser.ml"
          
        in
        
# 2652 "reason_parser.mly"
                         ( _1 )
# 13553 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_option_COMMA_ = Obj.magic _2 in
        let _1_inlined1 : 'tv_lseparated_nonempty_list_aux_COMMA_labeled_pattern_ = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_es6_parameters = let _1 =
          let _1 =
            let _1 =
              let x =
                let _1 = _1_inlined1 in
                let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 13604 "reason_parser.ml"
                 in
                
# 2623 "reason_parser.mly"
                                                          ( _1 )
# 13609 "reason_parser.ml"
                
              in
              
# 200 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 13615 "reason_parser.ml"
              
            in
            
# 4978 "reason_parser.mly"
                                                       ( _1 )
# 13621 "reason_parser.ml"
            
          in
          
# 2630 "reason_parser.mly"
                                               (
    (_1, false)
  )
# 13629 "reason_parser.ml"
          
        in
        
# 2652 "reason_parser.mly"
                         ( _1 )
# 13635 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_es6_parameters = let _1 =
          let _endpos = _endpos__3_ in
          let _startpos = _startpos__1_ in
          
# 2633 "reason_parser.mly"
                      (
      let loc = mklocation _startpos _endpos in
      ([mkloc (Term (Nolabel, None, mkpat_constructor_unit loc loc)) loc], true)
  )
# 13680 "reason_parser.ml"
          
        in
        
# 2652 "reason_parser.mly"
                         ( _1 )
# 13686 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _2_inlined1 : 'tv_option_COMMA_ = Obj.magic _2_inlined1 in
        let _1_inlined1 : 'tv_lseparated_nonempty_list_aux_COMMA_labeled_pattern_ = Obj.magic _1_inlined1 in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_es6_parameters = let _1 =
          let _3 =
            let (_2, _1) = (_2_inlined1, _1_inlined1) in
            let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 13742 "reason_parser.ml"
             in
            
# 2623 "reason_parser.mly"
                                                          ( _1 )
# 13747 "reason_parser.ml"
            
          in
          
# 2637 "reason_parser.mly"
                                                  (
    let () = List.iter (fun p ->
        match p.txt with
        | Term (Labelled _, _, _)
        | Term (Optional _, _, _)  ->
            raise Reason_syntax_util.(
              Error(p.loc, (Syntax_error "Uncurried function definition with labelled arguments is not supported at the moment."))
            )
        | _ -> ()
      ) _3 in
    (_3, true)
  )
# 13764 "reason_parser.ml"
          
        in
        
# 2652 "reason_parser.mly"
                         ( _1 )
# 13770 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_es6_parameters = let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 13798 "reason_parser.ml"
          
        in
        
# 2654 "reason_parser.mly"
    ( ([{_1 with txt = Term (Nolabel, None, mkpat ~loc:_1.loc Ppat_any)}], false) )
# 13804 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_simple_pattern_ident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_es6_parameters = 
# 2656 "reason_parser.mly"
    ( ([Location.mkloc (Term (Nolabel, None, _1)) _1.ppat_loc], false) )
# 13829 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_simple_expr_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _1 =
                let _endpos = _endpos__1_ in
                let _startpos = _startpos__1_ in
                
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 13860 "reason_parser.ml"
                
              in
              
# 2826 "reason_parser.mly"
    ( _1 )
# 13866 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 13875 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 13881 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 13887 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_fun_def_EQUALGREATER_non_arrowed_core_type_ = Obj.magic _3 in
        let _2 : 'tv_optional_expr_extension = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x = 
# 2828 "reason_parser.mly"
    ( _2 _3 )
# 13928 "reason_parser.ml"
             in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 13936 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 13942 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 13948 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_expr = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_es6_parameters = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _endpos = _endpos__4_ in
              let _startpos = _startpos__1_ in
              
# 2830 "reason_parser.mly"
    ( let (ps, uncurried) = _2 in
      let exp = List.fold_right mkexp_fun ps _4 in
      if uncurried then
        let loc = mklocation _startpos _endpos in
        {exp with pexp_attributes = (uncurry_payload loc)::exp.pexp_attributes}
      else exp
    )
# 14005 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__4_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 14014 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 14020 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 14026 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _6;
          MenhirLib.EngineTypes.startp = _startpos__6_;
          MenhirLib.EngineTypes.endp = _endpos__6_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _5;
            MenhirLib.EngineTypes.startp = _startpos__5_;
            MenhirLib.EngineTypes.endp = _endpos__5_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _4;
              MenhirLib.EngineTypes.startp = _startpos__4_;
              MenhirLib.EngineTypes.endp = _endpos__4_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _3;
                MenhirLib.EngineTypes.startp = _startpos__3_;
                MenhirLib.EngineTypes.endp = _endpos__3_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _2;
                  MenhirLib.EngineTypes.startp = _startpos__2_;
                  MenhirLib.EngineTypes.endp = _endpos__2_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _1;
                    MenhirLib.EngineTypes.startp = _startpos__1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _6 : 'tv_expr = Obj.magic _6 in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_non_arrowed_core_type = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_es6_parameters = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__6_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _endpos = _endpos__6_ in
              let _startpos = _startpos__1_ in
              
# 2838 "reason_parser.mly"
    ( let (ps, uncurried) = _2 in
    let exp = List.fold_right mkexp_fun ps
        (ghexp_constraint (mklocation _startpos__4_ _endpos) _6 (Some _4, None))  in
    if uncurried then
      let loc = mklocation _startpos _endpos in
      {exp with pexp_attributes = (uncurry_payload loc)::exp.pexp_attributes}
    else exp
    )
# 14098 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__6_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 14107 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 14113 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 14119 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2_inlined1;
          MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _2_inlined1 : 'tv_llist_aux_match_case_expr__ = Obj.magic _2_inlined1 in
        let _1_inlined1 : 'tv_match_case_expr_ = Obj.magic _1_inlined1 in
        let _2 : 'tv_optional_expr_extension = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_inlined1_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _3 =
                let (_2, _1) = (_2_inlined1, _1_inlined1) in
                let _1 = 
# 4954 "reason_parser.mly"
                                          ( _1 :: List.rev _2 )
# 14170 "reason_parser.ml"
                 in
                
# 3428 "reason_parser.mly"
                                                            ( _1 )
# 14175 "reason_parser.ml"
                
              in
              
# 2851 "reason_parser.mly"
    ( _2 (mkexp (Pexp_function _3)) )
# 14181 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__2_inlined1_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 14190 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 14196 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 14202 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _6;
          MenhirLib.EngineTypes.startp = _startpos__6_;
          MenhirLib.EngineTypes.endp = _endpos__6_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _4;
                MenhirLib.EngineTypes.startp = _startpos__4_;
                MenhirLib.EngineTypes.endp = _endpos__4_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _3;
                  MenhirLib.EngineTypes.startp = _startpos__3_;
                  MenhirLib.EngineTypes.endp = _endpos__3_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _2;
                    MenhirLib.EngineTypes.startp = _startpos__2_;
                    MenhirLib.EngineTypes.endp = _endpos__2_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _menhir_s;
                      MenhirLib.EngineTypes.semv = _1;
                      MenhirLib.EngineTypes.startp = _startpos__1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_;
                      MenhirLib.EngineTypes.next = _menhir_stack;
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _6 : unit = Obj.magic _6 in
        let _2_inlined1 : 'tv_llist_aux_match_case_seq_expr__ = Obj.magic _2_inlined1 in
        let _1_inlined1 : 'tv_match_case_seq_expr_ = Obj.magic _1_inlined1 in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_simple_expr_no_constructor = Obj.magic _3 in
        let _2 : 'tv_optional_expr_extension = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__6_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _5 =
                let (_2, _1) = (_2_inlined1, _1_inlined1) in
                let _1 = 
# 4954 "reason_parser.mly"
                                          ( _1 :: List.rev _2 )
# 14274 "reason_parser.ml"
                 in
                
# 3428 "reason_parser.mly"
                                                            ( _1 )
# 14279 "reason_parser.ml"
                
              in
              
# 2854 "reason_parser.mly"
    ( _2 (mkexp (Pexp_match (_3, _5))) )
# 14285 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__6_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 14294 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 14300 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 14306 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _6;
          MenhirLib.EngineTypes.startp = _startpos__6_;
          MenhirLib.EngineTypes.endp = _endpos__6_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _4;
                MenhirLib.EngineTypes.startp = _startpos__4_;
                MenhirLib.EngineTypes.endp = _endpos__4_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _3;
                  MenhirLib.EngineTypes.startp = _startpos__3_;
                  MenhirLib.EngineTypes.endp = _endpos__3_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _2;
                    MenhirLib.EngineTypes.startp = _startpos__2_;
                    MenhirLib.EngineTypes.endp = _endpos__2_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _menhir_s;
                      MenhirLib.EngineTypes.semv = _1;
                      MenhirLib.EngineTypes.startp = _startpos__1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_;
                      MenhirLib.EngineTypes.next = _menhir_stack;
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _6 : unit = Obj.magic _6 in
        let _2_inlined1 : 'tv_llist_aux_match_case_seq_expr__ = Obj.magic _2_inlined1 in
        let _1_inlined1 : 'tv_match_case_seq_expr_ = Obj.magic _1_inlined1 in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_simple_expr_no_constructor = Obj.magic _3 in
        let _2 : 'tv_optional_expr_extension = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__6_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _5 =
                let (_2, _1) = (_2_inlined1, _1_inlined1) in
                let _1 = 
# 4954 "reason_parser.mly"
                                          ( _1 :: List.rev _2 )
# 14378 "reason_parser.ml"
                 in
                
# 3428 "reason_parser.mly"
                                                            ( _1 )
# 14383 "reason_parser.ml"
                
              in
              
# 2857 "reason_parser.mly"
    ( _2 (mkexp (Pexp_try (_3, _5))) )
# 14389 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__6_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 14398 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 14404 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 14410 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : unit = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_simple_expr_no_constructor = Obj.magic _3 in
        let _2 : 'tv_optional_expr_extension = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x = 
# 2859 "reason_parser.mly"
    ( syntax_error_exp (mklocation _startpos__5_ _endpos__5_) "Invalid try with")
# 14465 "reason_parser.ml"
             in
            let (_endpos_x_, _startpos_x_) = (_endpos__5_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 14473 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 14479 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 14485 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _1_inlined1;
          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _1_inlined1 : 'tv_simple_expr_call = Obj.magic _1_inlined1 in
        let _3 : 'tv_parenthesized_expr = Obj.magic _3 in
        let _2 : 'tv_optional_expr_extension = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_inlined1_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _5 = 
# 124 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( None )
# 14534 "reason_parser.ml"
               in
              let _4 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let _endpos = _endpos__1_ in
                let _startpos = _startpos__1_ in
                
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 14543 "reason_parser.ml"
                
              in
              
# 2862 "reason_parser.mly"
    ( _2 (mkexp (Pexp_ifthenelse(_3, _4, _5))) )
# 14549 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__1_inlined1_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 14558 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 14564 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 14570 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined2;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _3;
                MenhirLib.EngineTypes.startp = _startpos__3_;
                MenhirLib.EngineTypes.endp = _endpos__3_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _2;
                  MenhirLib.EngineTypes.startp = _startpos__2_;
                  MenhirLib.EngineTypes.endp = _endpos__2_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _1;
                    MenhirLib.EngineTypes.startp = _startpos__1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let x : 'tv_expr = Obj.magic x in
        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
        let _1_inlined1 : 'tv_simple_expr_call = Obj.magic _1_inlined1 in
        let _3 : 'tv_parenthesized_expr = Obj.magic _3 in
        let _2 : 'tv_optional_expr_extension = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _5 =
                let _1 = _1_inlined2 in
                let x = 
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 14635 "reason_parser.ml"
                 in
                
# 126 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 14640 "reason_parser.ml"
                
              in
              let _4 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let _endpos = _endpos__1_ in
                let _startpos = _startpos__1_ in
                
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 14650 "reason_parser.ml"
                
              in
              
# 2862 "reason_parser.mly"
    ( _2 (mkexp (Pexp_ifthenelse(_3, _4, _5))) )
# 14656 "reason_parser.ml"
              
            in
            let _startpos_x_ = _startpos__1_ in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 14665 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 14671 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 14677 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _1_inlined1;
          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _1_inlined1 : 'tv_simple_expr_call = Obj.magic _1_inlined1 in
        let _3 : 'tv_parenthesized_expr = Obj.magic _3 in
        let _2 : 'tv_optional_expr_extension = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_inlined1_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _4 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let _endpos = _endpos__1_ in
                let _startpos = _startpos__1_ in
                
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 14730 "reason_parser.ml"
                
              in
              
# 2864 "reason_parser.mly"
    ( _2 (mkexp (Pexp_while(_3, _4))) )
# 14736 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__1_inlined1_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 14745 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 14751 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 14757 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _1_inlined1;
          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _9;
            MenhirLib.EngineTypes.startp = _startpos__9_;
            MenhirLib.EngineTypes.endp = _endpos__9_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _8;
              MenhirLib.EngineTypes.startp = _startpos__8_;
              MenhirLib.EngineTypes.endp = _endpos__8_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _7;
                MenhirLib.EngineTypes.startp = _startpos__7_;
                MenhirLib.EngineTypes.endp = _endpos__7_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _6;
                  MenhirLib.EngineTypes.startp = _startpos__6_;
                  MenhirLib.EngineTypes.endp = _endpos__6_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _5;
                    MenhirLib.EngineTypes.startp = _startpos__5_;
                    MenhirLib.EngineTypes.endp = _endpos__5_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _4;
                      MenhirLib.EngineTypes.startp = _startpos__4_;
                      MenhirLib.EngineTypes.endp = _endpos__4_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _;
                        MenhirLib.EngineTypes.semv = _3;
                        MenhirLib.EngineTypes.startp = _startpos__3_;
                        MenhirLib.EngineTypes.endp = _endpos__3_;
                        MenhirLib.EngineTypes.next = {
                          MenhirLib.EngineTypes.state = _;
                          MenhirLib.EngineTypes.semv = _2;
                          MenhirLib.EngineTypes.startp = _startpos__2_;
                          MenhirLib.EngineTypes.endp = _endpos__2_;
                          MenhirLib.EngineTypes.next = {
                            MenhirLib.EngineTypes.state = _menhir_s;
                            MenhirLib.EngineTypes.semv = _1;
                            MenhirLib.EngineTypes.startp = _startpos__1_;
                            MenhirLib.EngineTypes.endp = _endpos__1_;
                            MenhirLib.EngineTypes.next = _menhir_stack;
                          };
                        };
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _1_inlined1 : 'tv_simple_expr_call = Obj.magic _1_inlined1 in
        let _9 : unit = Obj.magic _9 in
        let _8 : 'tv_expr = Obj.magic _8 in
        let _7 : 'tv_direction_flag = Obj.magic _7 in
        let _6 : 'tv_expr = Obj.magic _6 in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_pattern = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_optional_expr_extension = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_inlined1_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _10 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let _endpos = _endpos__1_ in
                let _startpos = _startpos__1_ in
                
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 14852 "reason_parser.ml"
                
              in
              
# 2867 "reason_parser.mly"
    ( _2 (mkexp (Pexp_for(_4, _6, _8, _7, _10))) )
# 14858 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__1_inlined1_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 14867 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 14873 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 14879 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _8;
          MenhirLib.EngineTypes.startp = _startpos__8_;
          MenhirLib.EngineTypes.endp = _endpos__8_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _7;
            MenhirLib.EngineTypes.startp = _startpos__7_;
            MenhirLib.EngineTypes.endp = _endpos__7_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _6;
              MenhirLib.EngineTypes.startp = _startpos__6_;
              MenhirLib.EngineTypes.endp = _endpos__6_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _5;
                MenhirLib.EngineTypes.startp = _startpos__5_;
                MenhirLib.EngineTypes.endp = _endpos__5_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _4;
                  MenhirLib.EngineTypes.startp = _startpos__4_;
                  MenhirLib.EngineTypes.endp = _endpos__4_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _3;
                    MenhirLib.EngineTypes.startp = _startpos__3_;
                    MenhirLib.EngineTypes.endp = _endpos__3_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _2;
                      MenhirLib.EngineTypes.startp = _startpos__2_;
                      MenhirLib.EngineTypes.endp = _endpos__2_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _menhir_s;
                        MenhirLib.EngineTypes.semv = _1;
                        MenhirLib.EngineTypes.startp = _startpos__1_;
                        MenhirLib.EngineTypes.endp = _endpos__1_;
                        MenhirLib.EngineTypes.next = _menhir_stack;
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _8 : unit = Obj.magic _8 in
        let _7 : 'tv_expr = Obj.magic _7 in
        let _6 : unit = Obj.magic _6 in
        let _5 : 'tv_expr = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__8_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _endpos = _endpos__8_ in
              let _symbolstartpos = _startpos__1_ in
              
# 2869 "reason_parser.mly"
    ( let loc_colon = mklocation _startpos__2_ _endpos__2_ in
      let loc = mklocation _symbolstartpos _endpos in
      mkexp_cons loc_colon (mkexp ~ghost:true ~loc (Pexp_tuple[_5;_7])) loc
    )
# 14961 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__8_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 14970 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 14976 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 14982 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : (
# 1147 "reason_parser.mly"
       (string)
# 15016 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4590 "reason_parser.mly"
                      ( _1 )
# 15030 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 15038 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 15048 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 15057 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 15063 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 15069 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : (
# 1148 "reason_parser.mly"
       (string)
# 15103 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4591 "reason_parser.mly"
                      ( _1 )
# 15117 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 15125 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 15135 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 15144 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 15150 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 15156 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : (
# 1149 "reason_parser.mly"
       (string)
# 15190 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4592 "reason_parser.mly"
                      ( _1 )
# 15204 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 15212 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 15222 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 15231 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 15237 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 15243 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : (
# 1150 "reason_parser.mly"
       (string)
# 15277 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4593 "reason_parser.mly"
                      ( _1 )
# 15291 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 15299 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 15309 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 15318 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 15324 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 15330 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4595 "reason_parser.mly"
                      ( "/>" )
# 15374 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 15382 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 15392 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 15401 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 15407 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 15413 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : (
# 1153 "reason_parser.mly"
       (string)
# 15447 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4596 "reason_parser.mly"
                      ( _1 )
# 15461 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 15469 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 15479 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 15488 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 15494 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 15500 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4597 "reason_parser.mly"
                      ( "+" )
# 15544 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 15552 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 15562 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 15571 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 15577 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 15583 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4598 "reason_parser.mly"
                      ( "+." )
# 15627 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 15635 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 15645 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 15654 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 15660 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 15666 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4599 "reason_parser.mly"
                      ( "-" )
# 15710 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 15718 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 15728 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 15737 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 15743 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 15749 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4600 "reason_parser.mly"
                      ( "-." )
# 15793 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 15801 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 15811 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 15820 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 15826 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 15832 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4601 "reason_parser.mly"
                      ( "*" )
# 15876 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 15884 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 15894 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 15903 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 15909 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 15915 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4602 "reason_parser.mly"
                      ( "<" )
# 15959 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 15967 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 15977 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 15986 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 15992 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 15998 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4603 "reason_parser.mly"
                      ( ">" )
# 16042 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 16050 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 16060 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 16069 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 16075 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 16081 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4604 "reason_parser.mly"
                      ( "or" )
# 16125 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 16133 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 16143 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 16152 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 16158 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 16164 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4605 "reason_parser.mly"
                      ( "||" )
# 16208 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 16216 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 16226 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 16235 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 16241 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 16247 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4606 "reason_parser.mly"
                      ( "&" )
# 16291 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 16299 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 16309 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 16318 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 16324 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 16330 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4607 "reason_parser.mly"
                      ( "&&" )
# 16374 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 16382 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 16392 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 16401 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 16407 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 16413 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4608 "reason_parser.mly"
                      ( ":=" )
# 16457 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 16465 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 16475 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 16484 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 16490 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 16496 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4609 "reason_parser.mly"
                      ( "+=" )
# 16540 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 16548 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 16558 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 16567 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 16573 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 16579 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4610 "reason_parser.mly"
                      ( "%" )
# 16623 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 16631 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 16641 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 16650 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 16656 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 16662 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4617 "reason_parser.mly"
                      ( "<..>" )
# 16706 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 16714 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 16724 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 16733 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 16739 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 16745 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_startpos__1_, _1) = (_startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4618 "reason_parser.mly"
                      ( ">>" )
# 16796 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 16804 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 16814 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 16823 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 16829 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 16835 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4619 "reason_parser.mly"
                     ( ">..." )
# 16879 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 16887 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 16897 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 16906 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 16912 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 16918 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : (
# 1147 "reason_parser.mly"
       (string)
# 16952 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4590 "reason_parser.mly"
                      ( _1 )
# 16966 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 16974 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 16980 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 16989 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 16995 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 17001 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : (
# 1148 "reason_parser.mly"
       (string)
# 17035 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4591 "reason_parser.mly"
                      ( _1 )
# 17049 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 17057 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 17063 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 17072 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 17078 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 17084 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : (
# 1149 "reason_parser.mly"
       (string)
# 17118 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4592 "reason_parser.mly"
                      ( _1 )
# 17132 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 17140 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 17146 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 17155 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 17161 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 17167 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : (
# 1150 "reason_parser.mly"
       (string)
# 17201 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4593 "reason_parser.mly"
                      ( _1 )
# 17215 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 17223 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 17229 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 17238 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 17244 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 17250 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4595 "reason_parser.mly"
                      ( "/>" )
# 17294 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 17302 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 17308 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 17317 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 17323 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 17329 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : (
# 1153 "reason_parser.mly"
       (string)
# 17363 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4596 "reason_parser.mly"
                      ( _1 )
# 17377 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 17385 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 17391 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 17400 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 17406 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 17412 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4597 "reason_parser.mly"
                      ( "+" )
# 17456 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 17464 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 17470 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 17479 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 17485 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 17491 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4598 "reason_parser.mly"
                      ( "+." )
# 17535 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 17543 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 17549 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 17558 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 17564 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 17570 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4599 "reason_parser.mly"
                      ( "-" )
# 17614 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 17622 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 17628 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 17637 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 17643 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 17649 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4600 "reason_parser.mly"
                      ( "-." )
# 17693 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 17701 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 17707 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 17716 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 17722 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 17728 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4601 "reason_parser.mly"
                      ( "*" )
# 17772 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 17780 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 17786 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 17795 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 17801 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 17807 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4602 "reason_parser.mly"
                      ( "<" )
# 17851 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 17859 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 17865 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 17874 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 17880 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 17886 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4603 "reason_parser.mly"
                      ( ">" )
# 17930 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 17938 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 17944 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 17953 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 17959 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 17965 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4604 "reason_parser.mly"
                      ( "or" )
# 18009 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 18017 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 18023 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 18032 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 18038 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 18044 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4605 "reason_parser.mly"
                      ( "||" )
# 18088 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 18096 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 18102 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 18111 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 18117 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 18123 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4606 "reason_parser.mly"
                      ( "&" )
# 18167 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 18175 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 18181 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 18190 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 18196 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 18202 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4607 "reason_parser.mly"
                      ( "&&" )
# 18246 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 18254 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 18260 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 18269 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 18275 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 18281 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4608 "reason_parser.mly"
                      ( ":=" )
# 18325 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 18333 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 18339 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 18348 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 18354 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 18360 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4609 "reason_parser.mly"
                      ( "+=" )
# 18404 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 18412 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 18418 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 18427 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 18433 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 18439 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4610 "reason_parser.mly"
                      ( "%" )
# 18483 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 18491 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 18497 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 18506 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 18512 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 18518 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4617 "reason_parser.mly"
                      ( "<..>" )
# 18562 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 18570 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 18576 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 18585 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 18591 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 18597 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_startpos__1_, _1) = (_startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4618 "reason_parser.mly"
                      ( ">>" )
# 18648 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 18656 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 18662 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 18671 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 18677 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 18683 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4619 "reason_parser.mly"
                     ( ">..." )
# 18727 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 18735 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 18741 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 18750 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 18756 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 18762 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_expr = Obj.magic _2 in
        let x : 'tv_subtractive = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _1 =
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 18800 "reason_parser.ml"
                
              in
              
# 2882 "reason_parser.mly"
    ( mkuminus _1 _2 )
# 18806 "reason_parser.ml"
              
            in
            let _endpos_x_ = _endpos__2_ in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 18815 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 18821 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 18827 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_expr = Obj.magic _2 in
        let x : 'tv_additive = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _1 =
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 18865 "reason_parser.ml"
                
              in
              
# 2884 "reason_parser.mly"
    ( mkuplus _1 _2 )
# 18871 "reason_parser.ml"
              
            in
            let _endpos_x_ = _endpos__2_ in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 18880 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 18886 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 18892 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_expr = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _1 =
                let x = 
# 2885 "reason_parser.mly"
                ("!")
# 18928 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 18936 "reason_parser.ml"
                
              in
              
# 2886 "reason_parser.mly"
    ( mkexp(Pexp_apply(mkoperator _1, [Nolabel,_2])) )
# 18942 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 18951 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 18957 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 18963 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_expr = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let x : 'tv_label_longident = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_simple_expr_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _3 =
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 19022 "reason_parser.ml"
                
              in
              let _1 =
                let _endpos = _endpos__1_ in
                let _startpos = _startpos__1_ in
                
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 19031 "reason_parser.ml"
                
              in
              
# 2888 "reason_parser.mly"
    ( mkexp(Pexp_setfield(_1, _3, _5)) )
# 19037 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__5_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 19046 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 19052 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 19058 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _6;
          MenhirLib.EngineTypes.startp = _startpos__6_;
          MenhirLib.EngineTypes.endp = _endpos__6_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _5;
            MenhirLib.EngineTypes.startp = _startpos__5_;
            MenhirLib.EngineTypes.endp = _endpos__5_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _4;
              MenhirLib.EngineTypes.startp = _startpos__4_;
              MenhirLib.EngineTypes.endp = _endpos__4_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _3;
                MenhirLib.EngineTypes.startp = _startpos__3_;
                MenhirLib.EngineTypes.endp = _endpos__3_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _2;
                  MenhirLib.EngineTypes.startp = _startpos__2_;
                  MenhirLib.EngineTypes.endp = _endpos__2_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _1;
                    MenhirLib.EngineTypes.startp = _startpos__1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _6 : 'tv_expr = Obj.magic _6 in
        let _5 : unit = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_simple_expr_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__6_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _1 =
                let _endpos = _endpos__1_ in
                let _startpos = _startpos__1_ in
                
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 19124 "reason_parser.ml"
                
              in
              let _endpos = _endpos__6_ in
              let _symbolstartpos = _startpos__1_ in
              
# 2890 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      let exp = Pexp_ident(array_function ~loc "Array" "set") in
      mkexp(Pexp_apply(mkexp ~ghost:true ~loc exp,
                       [Nolabel,_1; Nolabel,_3; Nolabel,_6]))
    )
# 19136 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__6_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 19145 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 19151 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 19157 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _7;
          MenhirLib.EngineTypes.startp = _startpos__7_;
          MenhirLib.EngineTypes.endp = _endpos__7_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _6;
            MenhirLib.EngineTypes.startp = _startpos__6_;
            MenhirLib.EngineTypes.endp = _endpos__6_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _5;
              MenhirLib.EngineTypes.startp = _startpos__5_;
              MenhirLib.EngineTypes.endp = _endpos__5_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _4;
                MenhirLib.EngineTypes.startp = _startpos__4_;
                MenhirLib.EngineTypes.endp = _endpos__4_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _3;
                  MenhirLib.EngineTypes.startp = _startpos__3_;
                  MenhirLib.EngineTypes.endp = _endpos__3_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _2;
                    MenhirLib.EngineTypes.startp = _startpos__2_;
                    MenhirLib.EngineTypes.endp = _endpos__2_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _menhir_s;
                      MenhirLib.EngineTypes.semv = _1;
                      MenhirLib.EngineTypes.startp = _startpos__1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_;
                      MenhirLib.EngineTypes.next = _menhir_stack;
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _7 : 'tv_expr = Obj.magic _7 in
        let _6 : unit = Obj.magic _6 in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_expr = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_simple_expr_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__7_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _1 =
                let _endpos = _endpos__1_ in
                let _startpos = _startpos__1_ in
                
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 19230 "reason_parser.ml"
                
              in
              let _endpos = _endpos__7_ in
              let _symbolstartpos = _startpos__1_ in
              
# 2896 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      let exp = Pexp_ident(array_function ~loc "String" "set") in
      mkexp(Pexp_apply(mkexp ~ghost:true ~loc exp,
                       [Nolabel,_1; Nolabel,_4; Nolabel,_7]))
    )
# 19242 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__7_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 19251 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 19257 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 19263 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _5;
              MenhirLib.EngineTypes.startp = _startpos__5_;
              MenhirLib.EngineTypes.endp = _endpos__5_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _4_inlined1;
                MenhirLib.EngineTypes.startp = _startpos__4_inlined1_;
                MenhirLib.EngineTypes.endp = _endpos__4_inlined1_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _1_inlined2;
                  MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
                  MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _2;
                    MenhirLib.EngineTypes.startp = _startpos__2_;
                    MenhirLib.EngineTypes.endp = _endpos__2_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _1_inlined1;
                      MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _menhir_s;
                        MenhirLib.EngineTypes.semv = _1;
                        MenhirLib.EngineTypes.startp = _startpos__1_;
                        MenhirLib.EngineTypes.endp = _endpos__1_;
                        MenhirLib.EngineTypes.next = _menhir_stack;
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_expr = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _5 : unit = Obj.magic _5 in
        let _4_inlined1 : 'tv_option_COMMA_ = Obj.magic _4_inlined1 in
        let _1_inlined2 : 'tv_lseparated_nonempty_list_aux_COMMA_expr_ = Obj.magic _1_inlined2 in
        let _2 : unit = Obj.magic _2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_simple_expr_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_4, _1_inlined1, _1) = (_4_inlined1, _1_inlined2, _1_inlined1) in
                let _3 =
                  let _1 = _1_inlined1 in
                  
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 19344 "reason_parser.ml"
                  
                in
                
# 2988 "reason_parser.mly"
                                                                 ( _3 )
# 19350 "reason_parser.ml"
                
              in
              let _1 =
                let _endpos = _endpos__1_ in
                let _startpos = _startpos__1_ in
                
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 19359 "reason_parser.ml"
                
              in
              let _endpos = _endpos__4_ in
              let _symbolstartpos = _startpos__1_ in
              
# 2902 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      bigarray_set ~loc _1 _2 _4
    )
# 19369 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__4_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 19378 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 19384 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 19390 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : (
# 1173 "reason_parser.mly"
       (string)
# 19425 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _1 =
                let x = 
# 4721 "reason_parser.mly"
                      ( _1 )
# 19437 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 19445 "reason_parser.ml"
                
              in
              
# 2906 "reason_parser.mly"
    ( mkexp(Pexp_setinstvar(_1, _3)) )
# 19451 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 19460 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 19466 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 19472 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _1_inlined1;
          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _1_inlined1 : 'tv_simple_expr_call = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_inlined1_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let _endpos = _endpos__1_ in
                let _startpos = _startpos__1_ in
                
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 19511 "reason_parser.ml"
                
              in
              
# 2908 "reason_parser.mly"
    ( mkexp (Pexp_assert _2) )
# 19517 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__1_inlined1_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 19526 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 19532 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 19538 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _1_inlined1;
          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _1_inlined1 : 'tv_simple_expr_call = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_inlined1_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let _endpos = _endpos__1_ in
                let _startpos = _startpos__1_ in
                
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 19577 "reason_parser.ml"
                
              in
              
# 2910 "reason_parser.mly"
    ( mkexp (Pexp_lazy _2) )
# 19583 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__1_inlined1_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 19592 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 19598 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 19604 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_expr = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_expr = let _1 =
          let _1 =
            let x = 
# 2936 "reason_parser.mly"
    ( (* Should use ghost expressions, but not sure how that would work with source maps *)
      (* So ? will become true and : becomes false for now*)
      let loc_question = mklocation _startpos__2_ _endpos__2_ in
      let loc_colon = mklocation _startpos__4_ _endpos__4_ in
      let fauxTruePat =
        Pat.mk ~loc:loc_question (Ppat_construct({txt = Lident "true"; loc = loc_question}, None)) in
      let fauxFalsePat =
        Pat.mk ~loc:loc_colon (Ppat_construct({txt = Lident "false"; loc = loc_colon}, None)) in
      let fauxMatchCaseTrue = Exp.case fauxTruePat _3 in
      let fauxMatchCaseFalse = Exp.case fauxFalsePat _5 in
      mkexp (Pexp_match (_1, [fauxMatchCaseTrue; fauxMatchCaseFalse]))
    )
# 19670 "reason_parser.ml"
             in
            let (_endpos_x_, _startpos_x_) = (_endpos__5_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 19678 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 19684 "reason_parser.ml"
          
        in
        
# 2957 "reason_parser.mly"
                                     ( _1 )
# 19690 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_expr = Obj.magic _2 in
        let _1 : 'tv_attribute = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_expr = let _1 =
          let x = 
# 2959 "reason_parser.mly"
                     ( {_2 with pexp_attributes = _1 :: _2.pexp_attributes} )
# 19723 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 19731 "reason_parser.ml"
          
        in
        
# 2962 "reason_parser.mly"
    ( _1 )
# 19737 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_option_COMMA_ = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_opt_spread_expr_optional_constraint__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_expr_comma_seq_extension = let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 19769 "reason_parser.ml"
         in
        
# 3466 "reason_parser.mly"
  ( match List.rev _1 with
    (* Check if the last expr has been spread with `...` *)
    | ((dotdotdot, e) as hd)::es ->
      let (es, ext) = match dotdotdot with
      | Some _ -> (es, Some e)
      | None -> (hd::es, None)
      in
      let msg = "Lists can only have one `...` spread, at the end.
Explanation: lists are singly-linked list, where a node contains a value and points to the next node. `[a, ...bc]` efficiently creates a new item and links `bc` as its next nodes. `[...bc, a]` would be expensive, as it'd need to traverse `bc` and prepend each item to `a` one by one. We therefore disallow such syntax sugar.
Solution: directly use `concat` or other List helpers." in
      let exprList = filter_raise_spread_syntax msg es in
      (List.rev exprList, ext)
    | [] -> [], None
  )
# 19787 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_option_COMMA_ = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_expr_optional_constraint_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_expr_list = let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 19819 "reason_parser.ml"
         in
        
# 3460 "reason_parser.mly"
  ( _1 )
# 19824 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_expr_optional_constraint = 
# 3488 "reason_parser.mly"
         ( _1 )
# 19849 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_type_constraint = Obj.magic _2 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_expr_optional_constraint = let _endpos = _endpos__2_ in
        let _symbolstartpos = _startpos__1_ in
        
# 3490 "reason_parser.mly"
    ( ghexp_constraint (mklocation _symbolstartpos _endpos) _1 _2 )
# 19883 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_payload = Obj.magic _3 in
        let _2 : 'tv_attr_id = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_extension = 
# 4852 "reason_parser.mly"
                                           ( (_2, _3) )
# 19929 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_generalized_constructor_arguments = Obj.magic _2 in
        let _1 : (
# 1220 "reason_parser.mly"
       (string)
# 19957 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_extension_constructor_declaration = let _1 =
          let x = 
# 4629 "reason_parser.mly"
                      ( _1 )
# 19966 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 19974 "reason_parser.ml"
          
        in
        let _endpos = _endpos__2_ in
        let _symbolstartpos = _startpos__1_ in
        
# 4161 "reason_parser.mly"
  ( let args, res = _2 in
    let loc = mklocation _symbolstartpos _endpos in
    Te.decl _1 ~args ?res ~loc
  )
# 19985 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _2 : 'tv_generalized_constructor_arguments = Obj.magic _2 in
        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_extension_constructor_declaration = let _1 =
          let (_endpos__2_, _2) = (_endpos__2_inlined1_, _2_inlined1) in
          let x = 
# 4630 "reason_parser.mly"
                      ( "[]" )
# 20026 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 20034 "reason_parser.ml"
          
        in
        let _endpos = _endpos__2_ in
        let _symbolstartpos = _startpos__1_ in
        
# 4161 "reason_parser.mly"
  ( let args, res = _2 in
    let loc = mklocation _symbolstartpos _endpos in
    Te.decl _1 ~args ?res ~loc
  )
# 20045 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _2 : 'tv_generalized_constructor_arguments = Obj.magic _2 in
        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_extension_constructor_declaration = let _1 =
          let (_endpos__2_, _2) = (_endpos__2_inlined1_, _2_inlined1) in
          let x = 
# 4631 "reason_parser.mly"
                      ( "()" )
# 20086 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 20094 "reason_parser.ml"
          
        in
        let _endpos = _endpos__2_ in
        let _symbolstartpos = _startpos__1_ in
        
# 4161 "reason_parser.mly"
  ( let args, res = _2 in
    let loc = mklocation _symbolstartpos _endpos in
    Te.decl _1 ~args ?res ~loc
  )
# 20105 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_generalized_constructor_arguments = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_extension_constructor_declaration = let _1 =
          let x = 
# 4632 "reason_parser.mly"
                      ( "::" )
# 20138 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 20146 "reason_parser.ml"
          
        in
        let _endpos = _endpos__2_ in
        let _symbolstartpos = _startpos__1_ in
        
# 4161 "reason_parser.mly"
  ( let args, res = _2 in
    let loc = mklocation _symbolstartpos _endpos in
    Te.decl _1 ~args ?res ~loc
  )
# 20157 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_generalized_constructor_arguments = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_extension_constructor_declaration = let _1 =
          let x = 
# 4634 "reason_parser.mly"
                      ( "false" )
# 20190 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 20198 "reason_parser.ml"
          
        in
        let _endpos = _endpos__2_ in
        let _symbolstartpos = _startpos__1_ in
        
# 4161 "reason_parser.mly"
  ( let args, res = _2 in
    let loc = mklocation _symbolstartpos _endpos in
    Te.decl _1 ~args ?res ~loc
  )
# 20209 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_generalized_constructor_arguments = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_extension_constructor_declaration = let _1 =
          let x = 
# 4635 "reason_parser.mly"
                      ( "true" )
# 20242 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 20250 "reason_parser.ml"
          
        in
        let _endpos = _endpos__2_ in
        let _symbolstartpos = _startpos__1_ in
        
# 4161 "reason_parser.mly"
  ( let args, res = _2 in
    let loc = mklocation _symbolstartpos _endpos in
    Te.decl _1 ~args ?res ~loc
  )
# 20261 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x : 'tv_constr_longident = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : (
# 1220 "reason_parser.mly"
       (string)
# 20296 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_extension_constructor_rebind = let _3 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 20307 "reason_parser.ml"
          
        in
        let _endpos__3_ = _endpos_x_ in
        let _1 =
          let x = 
# 4629 "reason_parser.mly"
                      ( _1 )
# 20315 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 20323 "reason_parser.ml"
          
        in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = _startpos__1_ in
        
# 4169 "reason_parser.mly"
  ( let loc = mklocation _symbolstartpos _endpos in
    Te.rebind _1 _3 ~loc
  )
# 20333 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let x : 'tv_constr_longident = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_extension_constructor_rebind = let _3 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 20382 "reason_parser.ml"
          
        in
        let _endpos__3_ = _endpos_x_ in
        let _1 =
          let (_endpos__2_, _2) = (_endpos__2_inlined1_, _2_inlined1) in
          let x = 
# 4630 "reason_parser.mly"
                      ( "[]" )
# 20391 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 20399 "reason_parser.ml"
          
        in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = _startpos__1_ in
        
# 4169 "reason_parser.mly"
  ( let loc = mklocation _symbolstartpos _endpos in
    Te.rebind _1 _3 ~loc
  )
# 20409 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let x : 'tv_constr_longident = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_extension_constructor_rebind = let _3 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 20458 "reason_parser.ml"
          
        in
        let _endpos__3_ = _endpos_x_ in
        let _1 =
          let (_endpos__2_, _2) = (_endpos__2_inlined1_, _2_inlined1) in
          let x = 
# 4631 "reason_parser.mly"
                      ( "()" )
# 20467 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 20475 "reason_parser.ml"
          
        in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = _startpos__1_ in
        
# 4169 "reason_parser.mly"
  ( let loc = mklocation _symbolstartpos _endpos in
    Te.rebind _1 _3 ~loc
  )
# 20485 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x : 'tv_constr_longident = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_extension_constructor_rebind = let _3 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 20527 "reason_parser.ml"
          
        in
        let _endpos__3_ = _endpos_x_ in
        let _1 =
          let x = 
# 4632 "reason_parser.mly"
                      ( "::" )
# 20535 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 20543 "reason_parser.ml"
          
        in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = _startpos__1_ in
        
# 4169 "reason_parser.mly"
  ( let loc = mklocation _symbolstartpos _endpos in
    Te.rebind _1 _3 ~loc
  )
# 20553 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x : 'tv_constr_longident = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_extension_constructor_rebind = let _3 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 20595 "reason_parser.ml"
          
        in
        let _endpos__3_ = _endpos_x_ in
        let _1 =
          let x = 
# 4634 "reason_parser.mly"
                      ( "false" )
# 20603 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 20611 "reason_parser.ml"
          
        in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = _startpos__1_ in
        
# 4169 "reason_parser.mly"
  ( let loc = mklocation _symbolstartpos _endpos in
    Te.rebind _1 _3 ~loc
  )
# 20621 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x : 'tv_constr_longident = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_extension_constructor_rebind = let _3 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 20663 "reason_parser.ml"
          
        in
        let _endpos__3_ = _endpos_x_ in
        let _1 =
          let x = 
# 4635 "reason_parser.mly"
                      ( "true" )
# 20671 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 20679 "reason_parser.ml"
          
        in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = _startpos__1_ in
        
# 4169 "reason_parser.mly"
  ( let loc = mklocation _symbolstartpos _endpos in
    Te.rebind _1 _3 ~loc
  )
# 20689 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : (
# 1173 "reason_parser.mly"
       (string)
# 20724 "reason_parser.ml"
        ) = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_field_expr = let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 20735 "reason_parser.ml"
          
        in
        
# 3597 "reason_parser.mly"
   ( (_1, _3) )
# 20741 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : (
# 1173 "reason_parser.mly"
       (string)
# 20762 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_field_expr = let _endpos = _endpos__1_ in
        let _symbolstartpos = _startpos__1_ in
        
# 3599 "reason_parser.mly"
   ( let loc = mklocation _symbolstartpos _endpos in
     let lident_loc = mkloc _1 loc in
     let lident_lident_loc = mkloc (Lident _1) loc in
     (lident_loc, mkexp (Pexp_ident lident_lident_loc))
   )
# 20776 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_either_preceded_EQUAL_expr__braced_expr_ = Obj.magic _3 in
        let _2 : 'tv_option_preceded_COLON_core_type__ = Obj.magic _2 in
        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_fun_def_EQUAL_core_type_ = let _1 =
          let (_endpos__2_, _2) = (_endpos__2_inlined1_, _2_inlined1) in
          let _endpos = _endpos__2_ in
          let _startpos = _startpos__1_ in
          
# 2626 "reason_parser.mly"
                  (
    let loc = mklocation _startpos _endpos in
    ([mkloc (Term (Nolabel, None, mkpat_constructor_unit loc loc)) loc], false)
  )
# 20829 "reason_parser.ml"
          
        in
        let _endpos = _endpos__3_ in
        let _startpos = _startpos__1_ in
        
# 3444 "reason_parser.mly"
  ( let loc = mklocation _startpos _endpos in
    let (pl, uncurried) = _1 in
    let exp = List.fold_right mkexp_fun pl
        (match _2 with
        | None -> _3
        | Some ct -> Exp.constraint_ ~loc _3 ct)
    in
    if uncurried then
      {exp with pexp_attributes = (uncurry_payload loc)::exp.pexp_attributes}
    else exp
  )
# 20847 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2_inlined1;
                MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
                MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _1_inlined1;
                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _1;
                    MenhirLib.EngineTypes.startp = _startpos__1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_either_preceded_EQUAL_expr__braced_expr_ = Obj.magic _3 in
        let _2 : 'tv_option_preceded_COLON_core_type__ = Obj.magic _2 in
        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
        let _2_inlined1 : 'tv_option_COMMA_ = Obj.magic _2_inlined1 in
        let _1_inlined1 : 'tv_lseparated_nonempty_list_aux_COMMA_labeled_pattern_ = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_fun_def_EQUAL_core_type_ = let _1 =
          let (_3, _2) = (_3_inlined1, _2_inlined1) in
          let _1 =
            let _1 =
              let x =
                let _1 = _1_inlined1 in
                let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 20913 "reason_parser.ml"
                 in
                
# 2623 "reason_parser.mly"
                                                          ( _1 )
# 20918 "reason_parser.ml"
                
              in
              
# 200 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 20924 "reason_parser.ml"
              
            in
            
# 4978 "reason_parser.mly"
                                                       ( _1 )
# 20930 "reason_parser.ml"
            
          in
          
# 2630 "reason_parser.mly"
                                               (
    (_1, false)
  )
# 20938 "reason_parser.ml"
          
        in
        let _endpos = _endpos__3_ in
        let _startpos = _startpos__1_ in
        
# 3444 "reason_parser.mly"
  ( let loc = mklocation _startpos _endpos in
    let (pl, uncurried) = _1 in
    let exp = List.fold_right mkexp_fun pl
        (match _2 with
        | None -> _3
        | Some ct -> Exp.constraint_ ~loc _3 ct)
    in
    if uncurried then
      {exp with pexp_attributes = (uncurry_payload loc)::exp.pexp_attributes}
    else exp
  )
# 20956 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2_inlined1;
                MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
                MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_either_preceded_EQUAL_expr__braced_expr_ = Obj.magic _3 in
        let _2 : 'tv_option_preceded_COLON_core_type__ = Obj.magic _2 in
        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_fun_def_EQUAL_core_type_ = let _1 =
          let (_endpos__3_, _3, _2) = (_endpos__3_inlined1_, _3_inlined1, _2_inlined1) in
          let _endpos = _endpos__3_ in
          let _startpos = _startpos__1_ in
          
# 2633 "reason_parser.mly"
                      (
      let loc = mklocation _startpos _endpos in
      ([mkloc (Term (Nolabel, None, mkpat_constructor_unit loc loc)) loc], true)
  )
# 21016 "reason_parser.ml"
          
        in
        let _endpos = _endpos__3_ in
        let _startpos = _startpos__1_ in
        
# 3444 "reason_parser.mly"
  ( let loc = mklocation _startpos _endpos in
    let (pl, uncurried) = _1 in
    let exp = List.fold_right mkexp_fun pl
        (match _2 with
        | None -> _3
        | Some ct -> Exp.constraint_ ~loc _3 ct)
    in
    if uncurried then
      {exp with pexp_attributes = (uncurry_payload loc)::exp.pexp_attributes}
    else exp
  )
# 21034 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _4;
              MenhirLib.EngineTypes.startp = _startpos__4_;
              MenhirLib.EngineTypes.endp = _endpos__4_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2_inlined2;
                MenhirLib.EngineTypes.startp = _startpos__2_inlined2_;
                MenhirLib.EngineTypes.endp = _endpos__2_inlined2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _1_inlined1;
                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _2_inlined1;
                    MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
                    MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _menhir_s;
                      MenhirLib.EngineTypes.semv = _1;
                      MenhirLib.EngineTypes.startp = _startpos__1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_;
                      MenhirLib.EngineTypes.next = _menhir_stack;
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_either_preceded_EQUAL_expr__braced_expr_ = Obj.magic _3 in
        let _2 : 'tv_option_preceded_COLON_core_type__ = Obj.magic _2 in
        let _4 : unit = Obj.magic _4 in
        let _2_inlined2 : 'tv_option_COMMA_ = Obj.magic _2_inlined2 in
        let _1_inlined1 : 'tv_lseparated_nonempty_list_aux_COMMA_labeled_pattern_ = Obj.magic _1_inlined1 in
        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_fun_def_EQUAL_core_type_ = let _1 =
          let (_2_inlined1, _2) = (_2_inlined2, _2_inlined1) in
          let _3 =
            let (_2, _1) = (_2_inlined1, _1_inlined1) in
            let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 21105 "reason_parser.ml"
             in
            
# 2623 "reason_parser.mly"
                                                          ( _1 )
# 21110 "reason_parser.ml"
            
          in
          
# 2637 "reason_parser.mly"
                                                  (
    let () = List.iter (fun p ->
        match p.txt with
        | Term (Labelled _, _, _)
        | Term (Optional _, _, _)  ->
            raise Reason_syntax_util.(
              Error(p.loc, (Syntax_error "Uncurried function definition with labelled arguments is not supported at the moment."))
            )
        | _ -> ()
      ) _3 in
    (_3, true)
  )
# 21127 "reason_parser.ml"
          
        in
        let _endpos = _endpos__3_ in
        let _startpos = _startpos__1_ in
        
# 3444 "reason_parser.mly"
  ( let loc = mklocation _startpos _endpos in
    let (pl, uncurried) = _1 in
    let exp = List.fold_right mkexp_fun pl
        (match _2 with
        | None -> _3
        | Some ct -> Exp.constraint_ ~loc _3 ct)
    in
    if uncurried then
      {exp with pexp_attributes = (uncurry_payload loc)::exp.pexp_attributes}
    else exp
  )
# 21145 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_either_preceded_EQUALGREATER_expr__braced_expr_ = Obj.magic _3 in
        let _2 : 'tv_option_preceded_COLON_non_arrowed_core_type__ = Obj.magic _2 in
        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_fun_def_EQUALGREATER_non_arrowed_core_type_ = let _1 =
          let (_endpos__2_, _2) = (_endpos__2_inlined1_, _2_inlined1) in
          let _endpos = _endpos__2_ in
          let _startpos = _startpos__1_ in
          
# 2626 "reason_parser.mly"
                  (
    let loc = mklocation _startpos _endpos in
    ([mkloc (Term (Nolabel, None, mkpat_constructor_unit loc loc)) loc], false)
  )
# 21198 "reason_parser.ml"
          
        in
        let _endpos = _endpos__3_ in
        let _startpos = _startpos__1_ in
        
# 3444 "reason_parser.mly"
  ( let loc = mklocation _startpos _endpos in
    let (pl, uncurried) = _1 in
    let exp = List.fold_right mkexp_fun pl
        (match _2 with
        | None -> _3
        | Some ct -> Exp.constraint_ ~loc _3 ct)
    in
    if uncurried then
      {exp with pexp_attributes = (uncurry_payload loc)::exp.pexp_attributes}
    else exp
  )
# 21216 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2_inlined1;
                MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
                MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _1_inlined1;
                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _1;
                    MenhirLib.EngineTypes.startp = _startpos__1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_either_preceded_EQUALGREATER_expr__braced_expr_ = Obj.magic _3 in
        let _2 : 'tv_option_preceded_COLON_non_arrowed_core_type__ = Obj.magic _2 in
        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
        let _2_inlined1 : 'tv_option_COMMA_ = Obj.magic _2_inlined1 in
        let _1_inlined1 : 'tv_lseparated_nonempty_list_aux_COMMA_labeled_pattern_ = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_fun_def_EQUALGREATER_non_arrowed_core_type_ = let _1 =
          let (_3, _2) = (_3_inlined1, _2_inlined1) in
          let _1 =
            let _1 =
              let x =
                let _1 = _1_inlined1 in
                let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 21282 "reason_parser.ml"
                 in
                
# 2623 "reason_parser.mly"
                                                          ( _1 )
# 21287 "reason_parser.ml"
                
              in
              
# 200 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 21293 "reason_parser.ml"
              
            in
            
# 4978 "reason_parser.mly"
                                                       ( _1 )
# 21299 "reason_parser.ml"
            
          in
          
# 2630 "reason_parser.mly"
                                               (
    (_1, false)
  )
# 21307 "reason_parser.ml"
          
        in
        let _endpos = _endpos__3_ in
        let _startpos = _startpos__1_ in
        
# 3444 "reason_parser.mly"
  ( let loc = mklocation _startpos _endpos in
    let (pl, uncurried) = _1 in
    let exp = List.fold_right mkexp_fun pl
        (match _2 with
        | None -> _3
        | Some ct -> Exp.constraint_ ~loc _3 ct)
    in
    if uncurried then
      {exp with pexp_attributes = (uncurry_payload loc)::exp.pexp_attributes}
    else exp
  )
# 21325 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2_inlined1;
                MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
                MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_either_preceded_EQUALGREATER_expr__braced_expr_ = Obj.magic _3 in
        let _2 : 'tv_option_preceded_COLON_non_arrowed_core_type__ = Obj.magic _2 in
        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_fun_def_EQUALGREATER_non_arrowed_core_type_ = let _1 =
          let (_endpos__3_, _3, _2) = (_endpos__3_inlined1_, _3_inlined1, _2_inlined1) in
          let _endpos = _endpos__3_ in
          let _startpos = _startpos__1_ in
          
# 2633 "reason_parser.mly"
                      (
      let loc = mklocation _startpos _endpos in
      ([mkloc (Term (Nolabel, None, mkpat_constructor_unit loc loc)) loc], true)
  )
# 21385 "reason_parser.ml"
          
        in
        let _endpos = _endpos__3_ in
        let _startpos = _startpos__1_ in
        
# 3444 "reason_parser.mly"
  ( let loc = mklocation _startpos _endpos in
    let (pl, uncurried) = _1 in
    let exp = List.fold_right mkexp_fun pl
        (match _2 with
        | None -> _3
        | Some ct -> Exp.constraint_ ~loc _3 ct)
    in
    if uncurried then
      {exp with pexp_attributes = (uncurry_payload loc)::exp.pexp_attributes}
    else exp
  )
# 21403 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _4;
              MenhirLib.EngineTypes.startp = _startpos__4_;
              MenhirLib.EngineTypes.endp = _endpos__4_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2_inlined2;
                MenhirLib.EngineTypes.startp = _startpos__2_inlined2_;
                MenhirLib.EngineTypes.endp = _endpos__2_inlined2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _1_inlined1;
                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _2_inlined1;
                    MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
                    MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _menhir_s;
                      MenhirLib.EngineTypes.semv = _1;
                      MenhirLib.EngineTypes.startp = _startpos__1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_;
                      MenhirLib.EngineTypes.next = _menhir_stack;
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_either_preceded_EQUALGREATER_expr__braced_expr_ = Obj.magic _3 in
        let _2 : 'tv_option_preceded_COLON_non_arrowed_core_type__ = Obj.magic _2 in
        let _4 : unit = Obj.magic _4 in
        let _2_inlined2 : 'tv_option_COMMA_ = Obj.magic _2_inlined2 in
        let _1_inlined1 : 'tv_lseparated_nonempty_list_aux_COMMA_labeled_pattern_ = Obj.magic _1_inlined1 in
        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_fun_def_EQUALGREATER_non_arrowed_core_type_ = let _1 =
          let (_2_inlined1, _2) = (_2_inlined2, _2_inlined1) in
          let _3 =
            let (_2, _1) = (_2_inlined1, _1_inlined1) in
            let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 21474 "reason_parser.ml"
             in
            
# 2623 "reason_parser.mly"
                                                          ( _1 )
# 21479 "reason_parser.ml"
            
          in
          
# 2637 "reason_parser.mly"
                                                  (
    let () = List.iter (fun p ->
        match p.txt with
        | Term (Labelled _, _, _)
        | Term (Optional _, _, _)  ->
            raise Reason_syntax_util.(
              Error(p.loc, (Syntax_error "Uncurried function definition with labelled arguments is not supported at the moment."))
            )
        | _ -> ()
      ) _3 in
    (_3, true)
  )
# 21496 "reason_parser.ml"
          
        in
        let _endpos = _endpos__3_ in
        let _startpos = _startpos__1_ in
        
# 3444 "reason_parser.mly"
  ( let loc = mklocation _startpos _endpos in
    let (pl, uncurried) = _1 in
    let exp = List.fold_right mkexp_fun pl
        (match _2 with
        | None -> _3
        | Some ct -> Exp.constraint_ ~loc _3 ct)
    in
    if uncurried then
      {exp with pexp_attributes = (uncurry_payload loc)::exp.pexp_attributes}
    else exp
  )
# 21514 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_functor_parameters = let _endpos = _endpos__2_ in
        let _startpos = _startpos__1_ in
        
# 1478 "reason_parser.mly"
    ( let loc = mklocation _startpos _endpos in
      [mkloc (Some (mkloc "*" loc), None) loc]
    )
# 21550 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_module_parameter = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_functor_parameters = 
# 1489 "reason_parser.mly"
                                   ([_2])
# 21589 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_module_parameter = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_functor_parameters = 
# 1490 "reason_parser.mly"
                                         ([_2])
# 21635 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined2;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2_inlined1;
                MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
                MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _1_inlined1;
                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _1;
                    MenhirLib.EngineTypes.startp = _startpos__1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_option_COMMA_ = Obj.magic _2 in
        let _1_inlined2 : 'tv_lseparated_nonempty_list_aux_COMMA_module_parameter_ = Obj.magic _1_inlined2 in
        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
        let _1_inlined1 : 'tv_module_parameter = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_functor_parameters = let _1 =
          let _1 =
            let x =
              let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in
              let _1 =
                let _2 = _2_inlined1 in
                let _3 =
                  let _1 = _1_inlined1 in
                  
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 21703 "reason_parser.ml"
                  
                in
                
# 4976 "reason_parser.mly"
                                         ( _1 :: _3 )
# 21709 "reason_parser.ml"
                
              in
              
# 1473 "reason_parser.mly"
                                                         (_1)
# 21715 "reason_parser.ml"
              
            in
            
# 200 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 21721 "reason_parser.ml"
            
          in
          
# 4978 "reason_parser.mly"
                                                       ( _1 )
# 21727 "reason_parser.ml"
          
        in
        
# 1491 "reason_parser.mly"
                                                            ( _1 )
# 21733 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_option_preceded_COLON_core_type__ = Obj.magic _2 in
        let _1 : 'tv_option_constructor_arguments_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_generalized_constructor_arguments = 
# 4077 "reason_parser.mly"
  ( ((match _1 with None -> Pcstr_tuple [] | Some x -> x), _2) )
# 21765 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_greater_spread = 
# 2725 "reason_parser.mly"
                      ( ">..." )
# 21790 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_greater_spread = 
# 2725 "reason_parser.mly"
                      ( ">..." )
# 21822 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : (
# 1220 "reason_parser.mly"
       (string)
# 21843 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_ident = 
# 4582 "reason_parser.mly"
                       ( _1 )
# 21851 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : (
# 1173 "reason_parser.mly"
       (string)
# 21872 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_ident = 
# 4582 "reason_parser.mly"
                       ( _1 )
# 21880 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_structure = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : (
# 1375 "reason_parser.mly"
      (Ast_404.Parsetree.structure)
# 21912 "reason_parser.ml"
        ) = 
# 1417 "reason_parser.mly"
  ( apply_mapper_to_structure _1 reason_mapper )
# 21916 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_signature = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : (
# 1377 "reason_parser.mly"
      (Ast_404.Parsetree.signature)
# 21948 "reason_parser.ml"
        ) = 
# 1422 "reason_parser.mly"
  ( apply_mapper_to_signature _1 reason_mapper )
# 21952 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_payload = Obj.magic _3 in
        let _2 : 'tv_attr_id = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_item_extension = 
# 4856 "reason_parser.mly"
                                                  ( (_2, _3) )
# 21998 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_attr_id = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_item_extension_sugar = 
# 4848 "reason_parser.mly"
                  ( ([], _2) )
# 22030 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_list_simple_expr_no_call_ = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_jsx = let _endpos = _endpos__3_ in
        let _symbolstartpos = _startpos__1_ in
        
# 2729 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      let body = mktailexp_extension loc _2 None in
      makeFrag loc body
    )
# 22074 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_jsx_start_tag_and_args = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_jsx = let _endpos = _endpos__2_ in
        let _symbolstartpos = _startpos__1_ in
        
# 2734 "reason_parser.mly"
    ( let (component, _) = _1 in
      let loc = mklocation _symbolstartpos _endpos in
      component [
        (Labelled "children", mktailexp_extension loc [] None);
        (Nolabel, mkexp_constructor_unit loc loc)
      ] loc
    )
# 22114 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : (
# 1204 "reason_parser.mly"
       (string)
# 22153 "reason_parser.ml"
        ) = Obj.magic _4 in
        let _3 : 'tv_list_simple_expr_no_call_ = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_jsx_start_tag_and_args = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_jsx = let _endpos = _endpos__4_ in
        let _symbolstartpos = _startpos__1_ in
        
# 2742 "reason_parser.mly"
    ( let (component, start) = _1 in
      let loc = mklocation _symbolstartpos _endpos in
      (* TODO: Make this tag check simply a warning *)
      let endName = Longident.parse _4 in
      let _ = ensureTagsAreEqual start endName loc in
      let siblings = if List.length _3 > 0 then _3 else [] in
      component [
        (Labelled "children", mktailexp_extension loc siblings None);
        (Nolabel, mkexp_constructor_unit loc loc)
      ] loc
    )
# 22176 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : (
# 1204 "reason_parser.mly"
       (string)
# 22215 "reason_parser.ml"
        ) = Obj.magic _4 in
        let _3 : 'tv_simple_expr_no_call = Obj.magic _3 in
        let _2 : 'tv_greater_spread = Obj.magic _2 in
        let _1 : 'tv_jsx_start_tag_and_args = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_jsx = let _endpos = _endpos__4_ in
        let _symbolstartpos = _startpos__1_ in
        
# 2755 "reason_parser.mly"
    ( let (component, start) = _1 in
      let loc = mklocation _symbolstartpos _endpos in
      (* TODO: Make this tag check simply a warning *)
      let endName = Longident.parse _4 in
      let _ = ensureTagsAreEqual start endName loc in
      let child = _3 in
      component [
        (Labelled "children", child);
        (Nolabel, mkexp_constructor_unit loc loc)
      ] loc
    )
# 22238 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_jsx_arguments = 
# 2661 "reason_parser.mly"
              ( [] )
# 22256 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_jsx_arguments = Obj.magic _5 in
        let _1_inlined1 : 'tv_simple_expr_call = Obj.magic _1_inlined1 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : (
# 1173 "reason_parser.mly"
       (string)
# 22305 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_jsx_arguments = let _4 =
          let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
          let _endpos = _endpos__1_ in
          let _startpos = _startpos__1_ in
          
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 22317 "reason_parser.ml"
          
        in
        
# 2663 "reason_parser.mly"
    ( (* a=?b *)
      [(Optional _1, _4)] @ _5
    )
# 22325 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_jsx_arguments = Obj.magic _3 in
        let _2 : (
# 1173 "reason_parser.mly"
       (string)
# 22359 "reason_parser.ml"
        ) = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_jsx_arguments = 
# 2667 "reason_parser.mly"
    ( (* <Foo ?bar /> punning with explicitly passed optional *)
      let loc_lident = mklocation _startpos__2_ _endpos__2_ in
      [(Optional _2, mkexp (Pexp_ident {txt = Lident _2; loc = loc_lident}) ~loc:loc_lident)] @ _3
    )
# 22371 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_jsx_arguments = Obj.magic _4 in
        let _1_inlined1 : 'tv_simple_expr_call = Obj.magic _1_inlined1 in
        let _2 : unit = Obj.magic _2 in
        let _1 : (
# 1173 "reason_parser.mly"
       (string)
# 22413 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_jsx_arguments = let _3 =
          let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
          let _endpos = _endpos__1_ in
          let _startpos = _startpos__1_ in
          
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 22425 "reason_parser.ml"
          
        in
        
# 2672 "reason_parser.mly"
    ( (* a=b *)
      [(Labelled _1, _3)] @ _4
    )
# 22433 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_jsx_arguments = Obj.magic _2 in
        let _1 : (
# 1173 "reason_parser.mly"
       (string)
# 22461 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_jsx_arguments = 
# 2676 "reason_parser.mly"
    ( (* a (punning) *)
      let loc_lident = mklocation _startpos__1_ _endpos__1_ in
      [(Labelled _1, mkexp (Pexp_ident {txt = Lident _1; loc = loc_lident}) ~loc:loc_lident)] @ _2
    )
# 22472 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : (
# 1150 "reason_parser.mly"
       (string)
# 22493 "reason_parser.ml"
        ) = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_jsx_arguments = let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 22504 "reason_parser.ml"
          
        in
        
# 2685 "reason_parser.mly"
  (
    match _1.txt with
    | "/>>" ->
     let err = Reason_syntax_util.Syntax_error {|JSX in a JSX-argument needs to be wrapped in braces.
    If you wrote:
      <Description term=<Text text="Age" />> child </Description>
    Try wrapping <Text /> in braces.
      <Description term={<Text text="Age" />}> child </Description>|} in
      raise (Reason_syntax_util.Error(_1.loc, err))
    | "/>/>" ->
     let err = Reason_syntax_util.Syntax_error {|JSX in a JSX-argument needs to be wrapped in braces.
    If you wrote:
      <Description term=<Text text="Age" />/>
    Try wrapping <Text /> in braces.
      <Description term={<Text text="Age" />} />|} in
      raise (Reason_syntax_util.Error(_1.loc, err))
    | _ -> syntax_error ()
  )
# 22527 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_jsx_arguments = Obj.magic _2 in
        let x : (
# 1167 "reason_parser.mly"
       (string)
# 22555 "reason_parser.ml"
        ) = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_jsx_start_tag_and_args = let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 22566 "reason_parser.ml"
          
        in
        
# 2707 "reason_parser.mly"
    ( let name = Longident.parse _1.txt in
      (jsx_component {_1 with txt = name} _2, name)
    )
# 22574 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_jsx_arguments = Obj.magic _3 in
        let x : 'tv_mod_ext_longident = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_jsx_start_tag_and_args = let _2 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 22616 "reason_parser.ml"
          
        in
        
# 2711 "reason_parser.mly"
    ( jsx_component _2 _3, _2.txt )
# 22622 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_jsx_arguments = Obj.magic _2 in
        let x : 'tv_mod_ext_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_jsx_start_tag_and_args_without_leading_less = let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 22657 "reason_parser.ml"
          
        in
        
# 2716 "reason_parser.mly"
    ( (jsx_component _1 _2, _1.txt) )
# 22663 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_jsx_arguments = Obj.magic _2 in
        let x : (
# 1173 "reason_parser.mly"
       (string)
# 22691 "reason_parser.ml"
        ) = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_jsx_start_tag_and_args_without_leading_less = let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 22702 "reason_parser.ml"
          
        in
        
# 2718 "reason_parser.mly"
    ( let lident = Longident.Lident _1.txt in
      (jsx_component {_1 with txt = lident } _2, lident)
    )
# 22710 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_list_simple_expr_no_call_ = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_jsx_without_leading_less = let _endpos = _endpos__3_ in
        let _symbolstartpos = _startpos__1_ in
        
# 2769 "reason_parser.mly"
                                                  (
    let loc = mklocation _symbolstartpos _endpos in
    let body = mktailexp_extension loc _2 None in
    makeFrag loc body
  )
# 22755 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_jsx_start_tag_and_args_without_leading_less = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_jsx_without_leading_less = let _endpos = _endpos__2_ in
        let _symbolstartpos = _startpos__1_ in
        
# 2774 "reason_parser.mly"
                                                             (
    let (component, _) = _1 in
    let loc = mklocation _symbolstartpos _endpos in
    component [
      (Labelled "children", mktailexp_extension loc [] None);
      (Nolabel, mkexp_constructor_unit loc loc)
    ] loc
  )
# 22796 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : (
# 1204 "reason_parser.mly"
       (string)
# 22835 "reason_parser.ml"
        ) = Obj.magic _4 in
        let _3 : 'tv_list_simple_expr_no_call_ = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_jsx_start_tag_and_args_without_leading_less = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_jsx_without_leading_less = let _endpos = _endpos__4_ in
        let _symbolstartpos = _startpos__1_ in
        
# 2782 "reason_parser.mly"
                                                                                                   (
    let (component, start) = _1 in
    let loc = mklocation _symbolstartpos _endpos in
    (* TODO: Make this tag check simply a warning *)
    let endName = Longident.parse _4 in
    let _ = ensureTagsAreEqual start endName loc in
    let siblings = if List.length _3 > 0 then _3 else [] in
    component [
      (Labelled "children", mktailexp_extension loc siblings None);
      (Nolabel, mkexp_constructor_unit loc loc)
    ] loc
  )
# 22859 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : (
# 1204 "reason_parser.mly"
       (string)
# 22898 "reason_parser.ml"
        ) = Obj.magic _4 in
        let _3 : 'tv_simple_expr_no_call = Obj.magic _3 in
        let _2 : 'tv_greater_spread = Obj.magic _2 in
        let _1 : 'tv_jsx_start_tag_and_args_without_leading_less = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_jsx_without_leading_less = let _endpos = _endpos__4_ in
        let _symbolstartpos = _startpos__1_ in
        
# 2794 "reason_parser.mly"
                                                                                                           (
    let (component, start) = _1 in
    let loc = mklocation _symbolstartpos _endpos in
    (* TODO: Make this tag check simply a warning *)
    let endName = Longident.parse _4 in
    let _ = ensureTagsAreEqual start endName loc in
    let child = _3 in
    component [
      (Labelled "children", child);
      (Nolabel, mkexp_constructor_unit loc loc)
    ] loc
  )
# 22922 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : (
# 1173 "reason_parser.mly"
       (string)
# 22943 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_label_longident = 
# 4652 "reason_parser.mly"
                                  ( Lident _1 )
# 22951 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : (
# 1173 "reason_parser.mly"
       (string)
# 22984 "reason_parser.ml"
        ) = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_mod_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_label_longident = 
# 4653 "reason_parser.mly"
                                  ( Ldot(_1, _3) )
# 22994 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : 'tv_simple_expr_direct_argument = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_labeled_arguments = let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 23022 "reason_parser.ml"
          
        in
        
# 3235 "reason_parser.mly"
    ( [(Nolabel, _1)] )
# 23028 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_option_COMMA_ = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_labeled_arguments = let _1 =
          let _1 =
            let x =
              let _1 = 
# 4964 "reason_parser.mly"
                ( [] )
# 23070 "reason_parser.ml"
               in
              
# 3231 "reason_parser.mly"
                                                        ( _1 )
# 23075 "reason_parser.ml"
              
            in
            
# 200 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 23081 "reason_parser.ml"
            
          in
          
# 4978 "reason_parser.mly"
                                                       ( _1 )
# 23087 "reason_parser.ml"
          
        in
        let _endpos__1_ = _endpos__3_ in
        let _endpos = _endpos__1_ in
        let _startpos = _startpos__1_ in
        
# 3237 "reason_parser.mly"
    ( match _1 with
      | [] -> let loc = mklocation _startpos _endpos in
              [(Nolabel, mkexp_constructor_unit loc loc)]
      | xs -> xs
    )
# 23100 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_option_COMMA_ = Obj.magic _2 in
        let _1_inlined1 : 'tv_lseparated_nonempty_list_aux_COMMA_uncurried_labeled_expr_ = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_labeled_arguments = let _1 =
          let _1 =
            let x =
              let _1 = _1_inlined1 in
              let _1 =
                let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 23151 "reason_parser.ml"
                 in
                
# 4965 "reason_parser.mly"
                                     ( _1 )
# 23156 "reason_parser.ml"
                
              in
              
# 3231 "reason_parser.mly"
                                                        ( _1 )
# 23162 "reason_parser.ml"
              
            in
            
# 200 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 23168 "reason_parser.ml"
            
          in
          
# 4978 "reason_parser.mly"
                                                       ( _1 )
# 23174 "reason_parser.ml"
          
        in
        let _endpos__1_ = _endpos__3_ in
        let _endpos = _endpos__1_ in
        let _startpos = _startpos__1_ in
        
# 3237 "reason_parser.mly"
    ( match _1 with
      | [] -> let loc = mklocation _startpos _endpos in
              [(Nolabel, mkexp_constructor_unit loc loc)]
      | xs -> xs
    )
# 23187 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_labeled_arguments = let _endpos = _endpos__3_ in
        let _startpos = _startpos__1_ in
        
# 3243 "reason_parser.mly"
    ( let loc = mklocation _startpos _endpos in
      [(Nolabel, mkexp_constructor_unit ~uncurried:true loc loc)]
    )
# 23230 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_expr_optional_constraint = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_labeled_expr = 
# 3277 "reason_parser.mly"
                             ( (Nolabel, _1) )
# 23255 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : 'tv_either_parenthesized_longident_type_constraint__longident_type_constraint_ = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_labeled_expr = let _2 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 23290 "reason_parser.ml"
          
        in
        
# 3279 "reason_parser.mly"
    ( (* add(~a, ~b) -> parses ~a & ~b *)
      let lident_loc, maybe_typ = _2.txt in
      let exp = mkexp (Pexp_ident lident_loc) ~loc:lident_loc.loc in
      let labeled_exp = match maybe_typ with
      | None -> exp
      | Some typ ->
          ghexp_constraint _2.loc exp typ
      in
      (Labelled (Longident.last lident_loc.txt), labeled_exp)
    )
# 23305 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let x : 'tv_val_longident = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_labeled_expr = let _2 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 23347 "reason_parser.ml"
          
        in
        
# 3290 "reason_parser.mly"
    ( (* foo(~a?)  -> parses ~a? *)
      let exp = mkexp (Pexp_ident _2) ~loc:_2.loc in
      (Optional (Longident.last _2.txt), exp)
    )
# 23356 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = x;
                MenhirLib.EngineTypes.startp = _startpos_x_;
                MenhirLib.EngineTypes.endp = _endpos_x_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_labeled_expr_constraint = Obj.magic _5 in
        let _4 : 'tv_optional = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let x : (
# 1173 "reason_parser.mly"
       (string)
# 23404 "reason_parser.ml"
        ) = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_labeled_expr = let _2 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 23416 "reason_parser.ml"
          
        in
        
# 3295 "reason_parser.mly"
    ( (* foo(~bar=?Some(1)) or add(~x=1, ~y=2) -> parses ~bar=?Some(1) & ~x=1 & ~y=1 *)
      (_4 _2.txt, _5 { _2 with txt = Lident _2.txt })
    )
# 23424 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = x;
                MenhirLib.EngineTypes.startp = _startpos_x_;
                MenhirLib.EngineTypes.endp = _endpos_x_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _4 : 'tv_optional = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let x : (
# 1173 "reason_parser.mly"
       (string)
# 23472 "reason_parser.ml"
        ) = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_labeled_expr = let _5 =
          let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 23485 "reason_parser.ml"
          
        in
        let _2 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 23494 "reason_parser.ml"
          
        in
        
# 3299 "reason_parser.mly"
    ( (* foo(~l =_) *)
      let loc = _5.loc in
      let exp = mkexp (Pexp_ident (mkloc (Lident "_") loc)) ~loc in
      (_4 _2.txt, exp)
    )
# 23504 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_labeled_expr = let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 23532 "reason_parser.ml"
          
        in
        
# 3305 "reason_parser.mly"
    ( (* foo(_) *)
      let loc = _1.loc in
      let exp = mkexp (Pexp_ident (mkloc (Lident "_") loc)) ~loc in
      (Nolabel, exp)
    )
# 23542 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_expr_optional_constraint = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_labeled_expr_constraint = 
# 3249 "reason_parser.mly"
                             ( fun _punned -> _1 )
# 23567 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_type_constraint = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_labeled_expr_constraint = let _endpos = _endpos__1_ in
        
# 3251 "reason_parser.mly"
    ( fun punned ->
      let exp = mkexp (Pexp_ident punned) ~loc:punned.loc in
      match _1 with
      | typ ->
        let loc = mklocation punned.loc.loc_start _endpos in
        ghexp_constraint loc exp typ
    )
# 23599 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_labeled_pattern_constraint = Obj.magic _3 in
        let x : (
# 1173 "reason_parser.mly"
       (string)
# 23633 "reason_parser.ml"
        ) = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_labeled_pattern = let _1 =
          let x =
            let _2 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 23647 "reason_parser.ml"
              
            in
            
# 2609 "reason_parser.mly"
    ( Term (Labelled _2.txt, None, _3 _2) )
# 23653 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 23662 "reason_parser.ml"
          
        in
        
# 2618 "reason_parser.mly"
    ( _1 )
# 23668 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = x;
                MenhirLib.EngineTypes.startp = _startpos_x_;
                MenhirLib.EngineTypes.endp = _endpos_x_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_expr = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_labeled_pattern_constraint = Obj.magic _3 in
        let x : (
# 1173 "reason_parser.mly"
       (string)
# 23716 "reason_parser.ml"
        ) = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_labeled_pattern = let _1 =
          let x =
            let _2 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 23730 "reason_parser.ml"
              
            in
            
# 2611 "reason_parser.mly"
    ( Term (Optional _2.txt, Some _5, _3 _2) )
# 23736 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__5_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 23745 "reason_parser.ml"
          
        in
        
# 2618 "reason_parser.mly"
    ( _1 )
# 23751 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = x;
                MenhirLib.EngineTypes.startp = _startpos_x_;
                MenhirLib.EngineTypes.endp = _endpos_x_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : unit = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_labeled_pattern_constraint = Obj.magic _3 in
        let x : (
# 1173 "reason_parser.mly"
       (string)
# 23799 "reason_parser.ml"
        ) = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_labeled_pattern = let _1 =
          let x =
            let _2 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 23813 "reason_parser.ml"
              
            in
            
# 2613 "reason_parser.mly"
    ( Term (Optional _2.txt, None, _3 _2) )
# 23819 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__5_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 23828 "reason_parser.ml"
          
        in
        
# 2618 "reason_parser.mly"
    ( _1 )
# 23834 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_pattern_optional_constraint = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_labeled_pattern = let _1 =
          let x = 
# 2615 "reason_parser.mly"
    ( Term (Nolabel, None, _1) )
# 23860 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 23868 "reason_parser.ml"
          
        in
        
# 2618 "reason_parser.mly"
    ( _1 )
# 23874 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : (
# 1173 "reason_parser.mly"
       (string)
# 23901 "reason_parser.ml"
        ) = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_labeled_pattern = let _1 =
          let x = 
# 2617 "reason_parser.mly"
    ( Type _2 )
# 23911 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 23919 "reason_parser.ml"
          
        in
        
# 2618 "reason_parser.mly"
    ( _1 )
# 23925 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_pattern_optional_constraint = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_labeled_pattern_constraint = 
# 2594 "reason_parser.mly"
                                   ( fun _punned -> _2 )
# 23957 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_option_preceded_COLON_core_type__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_labeled_pattern_constraint = let _endpos = _endpos__1_ in
        
# 2596 "reason_parser.mly"
    ( fun punned ->
      let pat = mkpat (Ppat_var punned) ~loc:punned.loc in
      match _1 with
      | None -> pat
      | Some typ ->
        let loc = mklocation punned.loc.loc_start _endpos in
        mkpat ~loc (Ppat_constraint(pat, typ))
    )
# 23990 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _6;
          MenhirLib.EngineTypes.startp = _startpos__6_;
          MenhirLib.EngineTypes.endp = _endpos__6_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _5;
            MenhirLib.EngineTypes.startp = _startpos__5_;
            MenhirLib.EngineTypes.endp = _endpos__5_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _4;
              MenhirLib.EngineTypes.startp = _startpos__4_;
              MenhirLib.EngineTypes.endp = _endpos__4_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _3;
                MenhirLib.EngineTypes.startp = _startpos__3_;
                MenhirLib.EngineTypes.endp = _endpos__3_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _2;
                  MenhirLib.EngineTypes.startp = _startpos__2_;
                  MenhirLib.EngineTypes.endp = _endpos__2_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _1;
                    MenhirLib.EngineTypes.startp = _startpos__1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _6 : 'tv_optional = Obj.magic _6 in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_protected_type = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : (
# 1173 "reason_parser.mly"
       (string)
# 24045 "reason_parser.ml"
        ) = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__6_ in
        let _v : 'tv_labelled_arrow_type_parameter_optional = 
# 4366 "reason_parser.mly"
    ( (_6 _2, _4) )
# 24054 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_pattern = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_label_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_lbl_pattern = let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 24096 "reason_parser.ml"
          
        in
        
# 3897 "reason_parser.mly"
                                          ( (_1,_3) )
# 24102 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : 'tv_label_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_lbl_pattern = let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 24130 "reason_parser.ml"
          
        in
        
# 3898 "reason_parser.mly"
                                          ( (_1, pat_of_label _1) )
# 24136 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x_inlined1 : 'tv_val_ident = Obj.magic x_inlined1 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_label_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_lbl_pattern = let _3 =
          let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 24179 "reason_parser.ml"
          
        in
        let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 24188 "reason_parser.ml"
          
        in
        
# 3900 "reason_parser.mly"
    ( (* punning with alias eg. {ReasonReact.state as prevState}
       *  -> {ReasonReact.state: state as prevState} *)
      (_1, mkpat(Ppat_alias(pat_of_label _1, _3)))
    )
# 24197 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_let_binding_body = Obj.magic _5 in
        let _4 : 'tv_rec_flag = Obj.magic _4 in
        let _3 : 'tv_option_item_extension_sugar_ = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_let_binding = let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 24243 "reason_parser.ml"
         in
        let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
        let _endpos = _endpos__5_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 3328 "reason_parser.mly"
  ( let loc = mklocation _symbolstartpos _endpos in
    let pat, expr = _5 in
    mklbs _3 _4 (Vb.mk ~loc ~attrs:_1 pat expr) loc )
# 24256 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_let_binding_body = Obj.magic _5 in
        let _4 : 'tv_rec_flag = Obj.magic _4 in
        let _3 : 'tv_option_item_extension_sugar_ = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_let_binding = let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 24310 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 24315 "reason_parser.ml"
          
        in
        let _endpos = _endpos__5_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 3328 "reason_parser.mly"
  ( let loc = mklocation _symbolstartpos _endpos in
    let pat, expr = _5 in
    mklbs _3 _4 (Vb.mk ~loc ~attrs:_1 pat expr) loc )
# 24328 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_expr = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_type_constraint = Obj.magic _2 in
        let _1 : 'tv_simple_pattern_ident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_let_binding_body = let _endpos = _endpos__4_ in
        let _symbolstartpos = _startpos__1_ in
        
# 3335 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      (_1, ghexp_constraint loc _4 _2) )
# 24377 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_fun_def_EQUAL_core_type_ = Obj.magic _2 in
        let _1 : 'tv_simple_pattern_ident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_let_binding_body = 
# 3338 "reason_parser.mly"
    ( (_1, _2) )
# 24409 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _6;
            MenhirLib.EngineTypes.startp = _startpos__6_;
            MenhirLib.EngineTypes.endp = _endpos__6_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _5;
              MenhirLib.EngineTypes.startp = _startpos__5_;
              MenhirLib.EngineTypes.endp = _endpos__5_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _4;
                MenhirLib.EngineTypes.startp = _startpos__4_;
                MenhirLib.EngineTypes.endp = _endpos__4_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _3;
                  MenhirLib.EngineTypes.startp = _startpos__3_;
                  MenhirLib.EngineTypes.endp = _endpos__3_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _2;
                    MenhirLib.EngineTypes.startp = _startpos__2_;
                    MenhirLib.EngineTypes.endp = _endpos__2_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _menhir_s;
                      MenhirLib.EngineTypes.semv = _1;
                      MenhirLib.EngineTypes.startp = _startpos__1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_;
                      MenhirLib.EngineTypes.next = _menhir_stack;
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let x : 'tv_expr = Obj.magic x in
        let _6 : unit = Obj.magic _6 in
        let _5 : 'tv_core_type = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_nonempty_list_preceded_QUOTE_ident__ = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_simple_pattern_ident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_let_binding_body = let _7 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 24479 "reason_parser.ml"
          
        in
        let _endpos__7_ = _endpos_x_ in
        let _endpos = _endpos__7_ in
        let _symbolstartpos = _startpos__1_ in
        
# 3341 "reason_parser.mly"
    ( let typ = mktyp ~ghost:true (Ptyp_poly(_3, _5)) in
      let loc = mklocation _symbolstartpos _endpos in
      (mkpat ~ghost:true ~loc (Ppat_constraint(_1, typ)), _7)
    )
# 24491 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _7;
            MenhirLib.EngineTypes.startp = _startpos__7_;
            MenhirLib.EngineTypes.endp = _endpos__7_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _6;
              MenhirLib.EngineTypes.startp = _startpos__6_;
              MenhirLib.EngineTypes.endp = _endpos__6_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _5;
                MenhirLib.EngineTypes.startp = _startpos__5_;
                MenhirLib.EngineTypes.endp = _endpos__5_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _4;
                  MenhirLib.EngineTypes.startp = _startpos__4_;
                  MenhirLib.EngineTypes.endp = _endpos__4_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _3;
                    MenhirLib.EngineTypes.startp = _startpos__3_;
                    MenhirLib.EngineTypes.endp = _endpos__3_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _2;
                      MenhirLib.EngineTypes.startp = _startpos__2_;
                      MenhirLib.EngineTypes.endp = _endpos__2_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _menhir_s;
                        MenhirLib.EngineTypes.semv = _1;
                        MenhirLib.EngineTypes.startp = _startpos__1_;
                        MenhirLib.EngineTypes.endp = _endpos__1_;
                        MenhirLib.EngineTypes.next = _menhir_stack;
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let x : 'tv_expr = Obj.magic x in
        let _7 : unit = Obj.magic _7 in
        let _6 : 'tv_core_type = Obj.magic _6 in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_nonempty_list_LIDENT_ = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_simple_pattern_ident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_let_binding_body = let _8 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 24568 "reason_parser.ml"
          
        in
        let _endpos__8_ = _endpos_x_ in
        let _endpos = _endpos__8_ in
        let _symbolstartpos = _startpos__1_ in
        
# 3394 "reason_parser.mly"
   ( let exp, poly = wrap_type_annotation _4 _6 _8 in
     let loc = mklocation _symbolstartpos _endpos in
     (mkpat ~ghost:true ~loc (Ppat_constraint(_1, poly)), exp)
   )
# 24580 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_pattern = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_let_binding_body = 
# 3410 "reason_parser.mly"
    ( (_1, _3) )
# 24619 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_expr = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_core_type = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_simple_pattern_not_ident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_let_binding_body = let _endpos = _endpos__5_ in
        let _symbolstartpos = _startpos__1_ in
        
# 3412 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      (mkpat ~loc (Ppat_constraint(_1, _3)), _5)
    )
# 24676 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_list_and_let_binding_ = Obj.magic _2 in
        let _1 : 'tv_let_binding = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_let_bindings = 
# 3323 "reason_parser.mly"
                                           ( addlbs _1 _2 )
# 24708 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_list_and_class_declaration_ = 
# 211 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [] )
# 24726 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = xs;
          MenhirLib.EngineTypes.startp = _startpos_xs_;
          MenhirLib.EngineTypes.endp = _endpos_xs_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let xs : 'tv_list_and_class_declaration_ = Obj.magic xs in
        let x : 'tv_and_class_declaration = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_xs_ in
        let _v : 'tv_list_and_class_declaration_ = 
# 213 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x :: xs )
# 24758 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_list_and_class_description_ = 
# 211 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [] )
# 24776 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = xs;
          MenhirLib.EngineTypes.startp = _startpos_xs_;
          MenhirLib.EngineTypes.endp = _endpos_xs_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let xs : 'tv_list_and_class_description_ = Obj.magic xs in
        let x : 'tv_and_class_description = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_xs_ in
        let _v : 'tv_list_and_class_description_ = 
# 213 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x :: xs )
# 24808 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_list_and_class_type_declaration_ = 
# 211 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [] )
# 24826 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = xs;
          MenhirLib.EngineTypes.startp = _startpos_xs_;
          MenhirLib.EngineTypes.endp = _endpos_xs_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let xs : 'tv_list_and_class_type_declaration_ = Obj.magic xs in
        let x : 'tv_and_class_type_declaration = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_xs_ in
        let _v : 'tv_list_and_class_type_declaration_ = 
# 213 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x :: xs )
# 24858 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_list_and_let_binding_ = 
# 211 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [] )
# 24876 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = xs;
          MenhirLib.EngineTypes.startp = _startpos_xs_;
          MenhirLib.EngineTypes.endp = _endpos_xs_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let xs : 'tv_list_and_let_binding_ = Obj.magic xs in
        let _3 : 'tv_let_binding_body = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos_xs_ in
        let _v : 'tv_list_and_let_binding_ = let x =
          let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 24916 "reason_parser.ml"
           in
          let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
          let _endpos = _endpos__3_ in
          let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
            _startpos__1_
          else
            _startpos__2_ in
          
# 3319 "reason_parser.mly"
  ( let pat, expr = _3 in
    Vb.mk ~loc:(mklocation _symbolstartpos _endpos) ~attrs:_1 pat expr )
# 24928 "reason_parser.ml"
          
        in
        
# 213 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x :: xs )
# 24934 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = xs;
          MenhirLib.EngineTypes.startp = _startpos_xs_;
          MenhirLib.EngineTypes.endp = _endpos_xs_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let xs : 'tv_list_and_let_binding_ = Obj.magic xs in
        let _3 : 'tv_let_binding_body = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_xs_ in
        let _v : 'tv_list_and_let_binding_ = let x =
          let _1 =
            let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 24982 "reason_parser.ml"
             in
            
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 24987 "reason_parser.ml"
            
          in
          let _endpos = _endpos__3_ in
          let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
            _startpos__1_
          else
            _startpos__2_ in
          
# 3319 "reason_parser.mly"
  ( let pat, expr = _3 in
    Vb.mk ~loc:(mklocation _symbolstartpos _endpos) ~attrs:_1 pat expr )
# 24999 "reason_parser.ml"
          
        in
        
# 213 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x :: xs )
# 25005 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_list_and_module_bindings_ = 
# 211 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [] )
# 25023 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = xs;
          MenhirLib.EngineTypes.startp = _startpos_xs_;
          MenhirLib.EngineTypes.endp = _endpos_xs_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let xs : 'tv_list_and_module_bindings_ = Obj.magic xs in
        let x : 'tv_and_module_bindings = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_xs_ in
        let _v : 'tv_list_and_module_bindings_ = 
# 213 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x :: xs )
# 25055 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_list_and_module_rec_declaration_ = 
# 211 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [] )
# 25073 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = xs;
          MenhirLib.EngineTypes.startp = _startpos_xs_;
          MenhirLib.EngineTypes.endp = _endpos_xs_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let xs : 'tv_list_and_module_rec_declaration_ = Obj.magic xs in
        let x : 'tv_and_module_rec_declaration = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_xs_ in
        let _v : 'tv_list_and_module_rec_declaration_ = 
# 213 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x :: xs )
# 25105 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_list_attributed_ext_constructor_either_extension_constructor_declaration_extension_constructor_rebind___ = 
# 211 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [] )
# 25123 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = xs;
          MenhirLib.EngineTypes.startp = _startpos_xs_;
          MenhirLib.EngineTypes.endp = _endpos_xs_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let xs : 'tv_list_attributed_ext_constructor_either_extension_constructor_declaration_extension_constructor_rebind___ = Obj.magic xs in
        let _4 : 'tv_either_extension_constructor_declaration_extension_constructor_rebind_ = Obj.magic _4 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos_xs_ in
        let _v : 'tv_list_attributed_ext_constructor_either_extension_constructor_declaration_extension_constructor_rebind___ = let x =
          let _3 = 
# 4843 "reason_parser.mly"
    ( [] )
# 25163 "reason_parser.ml"
           in
          let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 25168 "reason_parser.ml"
           in
          
# 4143 "reason_parser.mly"
                                        ( {_4 with pext_attributes = List.concat [_1; _3; _4.pext_attributes]} )
# 25173 "reason_parser.ml"
          
        in
        
# 213 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x :: xs )
# 25179 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = xs;
          MenhirLib.EngineTypes.startp = _startpos_xs_;
          MenhirLib.EngineTypes.endp = _endpos_xs_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let xs : 'tv_list_attributed_ext_constructor_either_extension_constructor_declaration_extension_constructor_rebind___ = Obj.magic xs in
        let _4 : 'tv_either_extension_constructor_declaration_extension_constructor_rebind_ = Obj.magic _4 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos_xs_ in
        let _v : 'tv_list_attributed_ext_constructor_either_extension_constructor_declaration_extension_constructor_rebind___ = let x =
          let _3 =
            let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 25227 "reason_parser.ml"
             in
            
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 25232 "reason_parser.ml"
            
          in
          let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 25238 "reason_parser.ml"
           in
          
# 4143 "reason_parser.mly"
                                        ( {_4 with pext_attributes = List.concat [_1; _3; _4.pext_attributes]} )
# 25243 "reason_parser.ml"
          
        in
        
# 213 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x :: xs )
# 25249 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = xs;
          MenhirLib.EngineTypes.startp = _startpos_xs_;
          MenhirLib.EngineTypes.endp = _endpos_xs_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let xs : 'tv_list_attributed_ext_constructor_either_extension_constructor_declaration_extension_constructor_rebind___ = Obj.magic xs in
        let _4 : 'tv_either_extension_constructor_declaration_extension_constructor_rebind_ = Obj.magic _4 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_xs_ in
        let _v : 'tv_list_attributed_ext_constructor_either_extension_constructor_declaration_extension_constructor_rebind___ = let x =
          let _3 = 
# 4843 "reason_parser.mly"
    ( [] )
# 25296 "reason_parser.ml"
           in
          let _1 =
            let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 25302 "reason_parser.ml"
             in
            
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 25307 "reason_parser.ml"
            
          in
          
# 4143 "reason_parser.mly"
                                        ( {_4 with pext_attributes = List.concat [_1; _3; _4.pext_attributes]} )
# 25313 "reason_parser.ml"
          
        in
        
# 213 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x :: xs )
# 25319 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = xs;
          MenhirLib.EngineTypes.startp = _startpos_xs_;
          MenhirLib.EngineTypes.endp = _endpos_xs_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let xs : 'tv_list_attributed_ext_constructor_either_extension_constructor_declaration_extension_constructor_rebind___ = Obj.magic xs in
        let _4 : 'tv_either_extension_constructor_declaration_extension_constructor_rebind_ = Obj.magic _4 in
        let _1_inlined1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1_inlined1 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_xs_ in
        let _v : 'tv_list_attributed_ext_constructor_either_extension_constructor_declaration_extension_constructor_rebind___ = let x =
          let _3 =
            let _1 = _1_inlined1 in
            let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 25375 "reason_parser.ml"
             in
            
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 25380 "reason_parser.ml"
            
          in
          let _1 =
            let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 25387 "reason_parser.ml"
             in
            
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 25392 "reason_parser.ml"
            
          in
          
# 4143 "reason_parser.mly"
                                        ( {_4 with pext_attributes = List.concat [_1; _3; _4.pext_attributes]} )
# 25398 "reason_parser.ml"
          
        in
        
# 213 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x :: xs )
# 25404 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_list_attributed_ext_constructor_extension_constructor_declaration__ = 
# 211 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [] )
# 25422 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = xs;
          MenhirLib.EngineTypes.startp = _startpos_xs_;
          MenhirLib.EngineTypes.endp = _endpos_xs_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let xs : 'tv_list_attributed_ext_constructor_extension_constructor_declaration__ = Obj.magic xs in
        let _4 : 'tv_extension_constructor_declaration = Obj.magic _4 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos_xs_ in
        let _v : 'tv_list_attributed_ext_constructor_extension_constructor_declaration__ = let x =
          let _3 = 
# 4843 "reason_parser.mly"
    ( [] )
# 25462 "reason_parser.ml"
           in
          let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 25467 "reason_parser.ml"
           in
          
# 4143 "reason_parser.mly"
                                        ( {_4 with pext_attributes = List.concat [_1; _3; _4.pext_attributes]} )
# 25472 "reason_parser.ml"
          
        in
        
# 213 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x :: xs )
# 25478 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = xs;
          MenhirLib.EngineTypes.startp = _startpos_xs_;
          MenhirLib.EngineTypes.endp = _endpos_xs_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let xs : 'tv_list_attributed_ext_constructor_extension_constructor_declaration__ = Obj.magic xs in
        let _4 : 'tv_extension_constructor_declaration = Obj.magic _4 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos_xs_ in
        let _v : 'tv_list_attributed_ext_constructor_extension_constructor_declaration__ = let x =
          let _3 =
            let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 25526 "reason_parser.ml"
             in
            
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 25531 "reason_parser.ml"
            
          in
          let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 25537 "reason_parser.ml"
           in
          
# 4143 "reason_parser.mly"
                                        ( {_4 with pext_attributes = List.concat [_1; _3; _4.pext_attributes]} )
# 25542 "reason_parser.ml"
          
        in
        
# 213 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x :: xs )
# 25548 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = xs;
          MenhirLib.EngineTypes.startp = _startpos_xs_;
          MenhirLib.EngineTypes.endp = _endpos_xs_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let xs : 'tv_list_attributed_ext_constructor_extension_constructor_declaration__ = Obj.magic xs in
        let _4 : 'tv_extension_constructor_declaration = Obj.magic _4 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_xs_ in
        let _v : 'tv_list_attributed_ext_constructor_extension_constructor_declaration__ = let x =
          let _3 = 
# 4843 "reason_parser.mly"
    ( [] )
# 25595 "reason_parser.ml"
           in
          let _1 =
            let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 25601 "reason_parser.ml"
             in
            
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 25606 "reason_parser.ml"
            
          in
          
# 4143 "reason_parser.mly"
                                        ( {_4 with pext_attributes = List.concat [_1; _3; _4.pext_attributes]} )
# 25612 "reason_parser.ml"
          
        in
        
# 213 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x :: xs )
# 25618 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = xs;
          MenhirLib.EngineTypes.startp = _startpos_xs_;
          MenhirLib.EngineTypes.endp = _endpos_xs_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let xs : 'tv_list_attributed_ext_constructor_extension_constructor_declaration__ = Obj.magic xs in
        let _4 : 'tv_extension_constructor_declaration = Obj.magic _4 in
        let _1_inlined1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1_inlined1 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_xs_ in
        let _v : 'tv_list_attributed_ext_constructor_extension_constructor_declaration__ = let x =
          let _3 =
            let _1 = _1_inlined1 in
            let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 25674 "reason_parser.ml"
             in
            
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 25679 "reason_parser.ml"
            
          in
          let _1 =
            let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 25686 "reason_parser.ml"
             in
            
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 25691 "reason_parser.ml"
            
          in
          
# 4143 "reason_parser.mly"
                                        ( {_4 with pext_attributes = List.concat [_1; _3; _4.pext_attributes]} )
# 25697 "reason_parser.ml"
          
        in
        
# 213 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x :: xs )
# 25703 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_list_bar_row_field_ = 
# 211 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [] )
# 25721 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = xs;
          MenhirLib.EngineTypes.startp = _startpos_xs_;
          MenhirLib.EngineTypes.endp = _endpos_xs_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let xs : 'tv_list_bar_row_field_ = Obj.magic xs in
        let x : 'tv_bar_row_field = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_xs_ in
        let _v : 'tv_list_bar_row_field_ = 
# 213 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x :: xs )
# 25753 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_list_simple_expr_no_call_ = 
# 211 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [] )
# 25771 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = xs;
          MenhirLib.EngineTypes.startp = _startpos_xs_;
          MenhirLib.EngineTypes.endp = _endpos_xs_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let xs : 'tv_list_simple_expr_no_call_ = Obj.magic xs in
        let x : 'tv_simple_expr_no_call = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_xs_ in
        let _v : 'tv_list_simple_expr_no_call_ = 
# 213 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x :: xs )
# 25803 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_llist_aux_match_case_expr__ = 
# 4959 "reason_parser.mly"
                ( [] )
# 25821 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_match_case_expr_ = Obj.magic _2 in
        let _1 : 'tv_llist_aux_match_case_expr__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_llist_aux_match_case_expr__ = 
# 4960 "reason_parser.mly"
                   ( _2 :: _1 )
# 25853 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_llist_aux_match_case_seq_expr__ = 
# 4959 "reason_parser.mly"
                ( [] )
# 25871 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_match_case_seq_expr_ = Obj.magic _2 in
        let _1 : 'tv_llist_aux_match_case_seq_expr__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_llist_aux_match_case_seq_expr__ = 
# 4960 "reason_parser.mly"
                   ( _2 :: _1 )
# 25903 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_llist_aux_preceded_COMMA_opt_spread_lbl_expr___ = 
# 4959 "reason_parser.mly"
                ( [] )
# 25921 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _1_inlined2;
                MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
                MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _1_inlined1;
                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _1;
                    MenhirLib.EngineTypes.startp = _startpos__1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_label_longident = Obj.magic x in
        let _1_inlined2 : 'tv_option_DOTDOTDOT_ = Obj.magic _1_inlined2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_llist_aux_preceded_COMMA_opt_spread_lbl_expr___ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_llist_aux_preceded_COMMA_opt_spread_lbl_expr___ = let _2 =
          let (_startpos__1_inlined1_, _1_inlined1, _1) = (_startpos__1_inlined2_, _1_inlined2, _1_inlined1) in
          let x =
            let (_startpos__1_, _1) = (_startpos__1_inlined1_, _1_inlined1) in
            let _2 =
              let _1 =
                let _1 =
                  let _endpos = _endpos_x_ in
                  let _symbolstartpos = _startpos_x_ in
                  
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 25990 "reason_parser.ml"
                  
                in
                
# 3525 "reason_parser.mly"
                                       ( (_1, _3) )
# 25996 "reason_parser.ml"
                
              in
              
# 3533 "reason_parser.mly"
                        (_1)
# 26002 "reason_parser.ml"
              
            in
            let _endpos__2_ = _endpos__3_ in
            
# 4946 "reason_parser.mly"
    ( let dotdotdot = match _1 with
      | Some _ -> Some (mklocation _startpos__1_ _endpos__2_)
      | None -> None
      in
      (dotdotdot, _2)
    )
# 26014 "reason_parser.ml"
            
          in
          
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 26020 "reason_parser.ml"
          
        in
        
# 4960 "reason_parser.mly"
                   ( _2 :: _1 )
# 26026 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined2;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let x : 'tv_label_longident = Obj.magic x in
        let _1_inlined2 : 'tv_option_DOTDOTDOT_ = Obj.magic _1_inlined2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_llist_aux_preceded_COMMA_opt_spread_lbl_expr___ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_llist_aux_preceded_COMMA_opt_spread_lbl_expr___ = let _2 =
          let (_startpos__1_inlined1_, _1_inlined1, _1) = (_startpos__1_inlined2_, _1_inlined2, _1_inlined1) in
          let x =
            let (_startpos__1_, _1) = (_startpos__1_inlined1_, _1_inlined1) in
            let _2 =
              let _1 =
                let _1 =
                  let _endpos = _endpos_x_ in
                  let _symbolstartpos = _startpos_x_ in
                  
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 26081 "reason_parser.ml"
                  
                in
                
# 3529 "reason_parser.mly"
                            ( (_1, exp_of_label _1) )
# 26087 "reason_parser.ml"
                
              in
              
# 3534 "reason_parser.mly"
                    (_1)
# 26093 "reason_parser.ml"
              
            in
            let _endpos__2_ = _endpos_x_ in
            
# 4946 "reason_parser.mly"
    ( let dotdotdot = match _1 with
      | Some _ -> Some (mklocation _startpos__1_ _endpos__2_)
      | None -> None
      in
      (dotdotdot, _2)
    )
# 26105 "reason_parser.ml"
            
          in
          
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 26111 "reason_parser.ml"
          
        in
        
# 4960 "reason_parser.mly"
                   ( _2 :: _1 )
# 26117 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_option_type_constraint_ = Obj.magic _2 in
        let x : 'tv_val_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_longident_type_constraint = let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 26152 "reason_parser.ml"
          
        in
        
# 3274 "reason_parser.mly"
 ( _1, _2 )
# 26158 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_loption_class_type_parameters_ = 
# 142 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [] )
# 26176 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_option_COMMA_ = Obj.magic _2 in
        let _1_inlined1 : 'tv_lseparated_nonempty_list_aux_COMMA_type_parameter_ = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_loption_class_type_parameters_ = let x =
          let _1 =
            let _1 =
              let x =
                let _1 = _1_inlined1 in
                let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 26227 "reason_parser.ml"
                 in
                
# 2401 "reason_parser.mly"
                                                             (_1)
# 26232 "reason_parser.ml"
                
              in
              
# 200 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 26238 "reason_parser.ml"
              
            in
            
# 4978 "reason_parser.mly"
                                                       ( _1 )
# 26244 "reason_parser.ml"
            
          in
          
# 2405 "reason_parser.mly"
  ( _1 )
# 26250 "reason_parser.ml"
          
        in
        
# 144 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 26256 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_loption_functor_parameters_ = 
# 142 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [] )
# 26274 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : 'tv_functor_parameters = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_loption_functor_parameters_ = 
# 144 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 26299 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_loption_located_attributes_ = 
# 142 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [] )
# 26317 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_loption_located_attributes_ = let x = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 26342 "reason_parser.ml"
         in
        
# 144 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 26347 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_loption_object_label_declarations_ = 
# 142 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [] )
# 26365 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : 'tv_object_label_declarations = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_loption_object_label_declarations_ = 
# 144 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 26390 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_loption_parenthesized_class_type_arguments_comma_list__ = 
# 142 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [] )
# 26408 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let x : 'tv_class_type_arguments_comma_list = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_loption_parenthesized_class_type_arguments_comma_list__ = let x =
          let _1 = 
# 200 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 26448 "reason_parser.ml"
           in
          
# 4978 "reason_parser.mly"
                                                       ( _1 )
# 26453 "reason_parser.ml"
          
        in
        
# 144 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 26459 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_loption_parenthesized_type_variables_with_variance_comma_list__ = 
# 142 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [] )
# 26477 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let x : 'tv_type_variables_with_variance_comma_list = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_loption_parenthesized_type_variables_with_variance_comma_list__ = let x =
          let _1 = 
# 200 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 26517 "reason_parser.ml"
           in
          
# 4978 "reason_parser.mly"
                                                       ( _1 )
# 26522 "reason_parser.ml"
          
        in
        
# 144 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 26528 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_loption_preceded_GREATER_nonempty_list_name_tag___ = 
# 142 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [] )
# 26546 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : 'tv_nonempty_list_name_tag_ = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_loption_preceded_GREATER_nonempty_list_name_tag___ = let x = 
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 26578 "reason_parser.ml"
         in
        
# 144 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 26583 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_loption_row_field_list_ = 
# 142 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [] )
# 26601 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : 'tv_row_field_list = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_loption_row_field_list_ = 
# 144 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 26626 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_loption_terminated_pattern_comma_list_option_COMMA___ = 
# 142 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [] )
# 26644 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_option_COMMA_ = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_opt_spread_pattern__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_loption_terminated_pattern_comma_list_option_COMMA___ = let x =
          let x =
            let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 26678 "reason_parser.ml"
             in
            
# 3858 "reason_parser.mly"
  ( let msg = "Array's `...` spread is not supported in pattern matches.
Explanation: such spread would create a subarray; out of performance concern, our pattern matching currently guarantees to never create new intermediate data.
Solution: if it's to validate the first few elements, use a `when` clause + Array size check + `get` checks on the current pattern. If it's to obtain a subarray, use `Array.sub` or `Belt.Array.slice`." in
    filter_raise_spread_syntax msg _1 )
# 26686 "reason_parser.ml"
            
          in
          
# 191 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 26692 "reason_parser.ml"
          
        in
        
# 144 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 26698 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_loption_type_parameters_ = 
# 142 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [] )
# 26716 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : 'tv_type_parameters = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_loption_type_parameters_ = 
# 144 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 26741 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_with_constraint = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_lseparated_nonempty_list_aux_AND_with_constraint_ = 
# 4971 "reason_parser.mly"
      ( [_1] )
# 26766 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_with_constraint = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_AND_with_constraint_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_lseparated_nonempty_list_aux_AND_with_constraint_ = 
# 4972 "reason_parser.mly"
                                               ( _3 :: _1 )
# 26805 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_core_type = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_core_type_ = 
# 4971 "reason_parser.mly"
      ( [_1] )
# 26830 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_core_type = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_core_type_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_core_type_ = 
# 4972 "reason_parser.mly"
                                               ( _3 :: _1 )
# 26869 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_expr_ = 
# 4971 "reason_parser.mly"
      ( [_1] )
# 26894 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_expr_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_expr_ = 
# 4972 "reason_parser.mly"
                                               ( _3 :: _1 )
# 26933 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_expr_optional_constraint = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_expr_optional_constraint_ = 
# 4971 "reason_parser.mly"
      ( [_1] )
# 26958 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr_optional_constraint = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_expr_optional_constraint_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_expr_optional_constraint_ = 
# 4972 "reason_parser.mly"
                                               ( _3 :: _1 )
# 26997 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_field_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_field_expr_ = 
# 4971 "reason_parser.mly"
      ( [_1] )
# 27022 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_field_expr = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_field_expr_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_field_expr_ = 
# 4972 "reason_parser.mly"
                                               ( _3 :: _1 )
# 27061 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_labeled_pattern = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_labeled_pattern_ = 
# 4971 "reason_parser.mly"
      ( [_1] )
# 27086 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_labeled_pattern = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_labeled_pattern_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_labeled_pattern_ = 
# 4972 "reason_parser.mly"
                                               ( _3 :: _1 )
# 27125 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_mod_ext_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_mod_ext_longident_ = 
# 4971 "reason_parser.mly"
      ( [_1] )
# 27150 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_mod_ext_longident = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_mod_ext_longident_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_mod_ext_longident_ = 
# 4972 "reason_parser.mly"
                                               ( _3 :: _1 )
# 27189 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_module_complex_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_module_complex_expr_ = 
# 4971 "reason_parser.mly"
      ( [_1] )
# 27214 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_module_complex_expr = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_module_complex_expr_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_module_complex_expr_ = 
# 4972 "reason_parser.mly"
                                               ( _3 :: _1 )
# 27253 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_module_parameter = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_module_parameter_ = 
# 4971 "reason_parser.mly"
      ( [_1] )
# 27278 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_module_parameter = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_module_parameter_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_module_parameter_ = 
# 4972 "reason_parser.mly"
                                               ( _3 :: _1 )
# 27317 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_object_label_declaration = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_object_label_declaration_ = 
# 4971 "reason_parser.mly"
      ( [_1] )
# 27342 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_object_label_declaration = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_object_label_declaration_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_object_label_declaration_ = 
# 4972 "reason_parser.mly"
                                               ( _3 :: _1 )
# 27381 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_expr_optional_constraint = Obj.magic _2 in
        let _1 : 'tv_option_DOTDOTDOT_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_opt_spread_expr_optional_constraint__ = let _1 = 
# 4946 "reason_parser.mly"
    ( let dotdotdot = match _1 with
      | Some _ -> Some (mklocation _startpos__1_ _endpos__2_)
      | None -> None
      in
      (dotdotdot, _2)
    )
# 27418 "reason_parser.ml"
         in
        
# 4971 "reason_parser.mly"
      ( [_1] )
# 27423 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2_inlined1;
          MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _2_inlined1 : 'tv_expr_optional_constraint = Obj.magic _2_inlined1 in
        let _1_inlined1 : 'tv_option_DOTDOTDOT_ = Obj.magic _1_inlined1 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_opt_spread_expr_optional_constraint__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_inlined1_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_opt_spread_expr_optional_constraint__ = let _3 =
          let (_endpos__2_, _startpos__1_, _2, _1) = (_endpos__2_inlined1_, _startpos__1_inlined1_, _2_inlined1, _1_inlined1) in
          
# 4946 "reason_parser.mly"
    ( let dotdotdot = match _1 with
      | Some _ -> Some (mklocation _startpos__1_ _endpos__2_)
      | None -> None
      in
      (dotdotdot, _2)
    )
# 27476 "reason_parser.ml"
          
        in
        
# 4972 "reason_parser.mly"
                                               ( _3 :: _1 )
# 27482 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_label_longident = Obj.magic x in
        let _1 : 'tv_option_DOTDOTDOT_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_opt_spread_lbl_expr__ = let _1 =
          let _2 =
            let _1 =
              let _1 =
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 27534 "reason_parser.ml"
                
              in
              
# 3525 "reason_parser.mly"
                                       ( (_1, _3) )
# 27540 "reason_parser.ml"
              
            in
            
# 3533 "reason_parser.mly"
                        (_1)
# 27546 "reason_parser.ml"
            
          in
          let _endpos__2_ = _endpos__3_ in
          
# 4946 "reason_parser.mly"
    ( let dotdotdot = match _1 with
      | Some _ -> Some (mklocation _startpos__1_ _endpos__2_)
      | None -> None
      in
      (dotdotdot, _2)
    )
# 27558 "reason_parser.ml"
          
        in
        
# 4971 "reason_parser.mly"
      ( [_1] )
# 27564 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : 'tv_label_longident = Obj.magic x in
        let _1 : 'tv_option_DOTDOTDOT_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_opt_spread_lbl_expr__ = let _1 =
          let _2 =
            let _1 =
              let _1 =
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 27602 "reason_parser.ml"
                
              in
              
# 3529 "reason_parser.mly"
                            ( (_1, exp_of_label _1) )
# 27608 "reason_parser.ml"
              
            in
            
# 3534 "reason_parser.mly"
                    (_1)
# 27614 "reason_parser.ml"
            
          in
          let _endpos__2_ = _endpos_x_ in
          
# 4946 "reason_parser.mly"
    ( let dotdotdot = match _1 with
      | Some _ -> Some (mklocation _startpos__1_ _endpos__2_)
      | None -> None
      in
      (dotdotdot, _2)
    )
# 27626 "reason_parser.ml"
          
        in
        
# 4971 "reason_parser.mly"
      ( [_1] )
# 27632 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _1_inlined1;
                MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _2;
                  MenhirLib.EngineTypes.startp = _startpos__2_;
                  MenhirLib.EngineTypes.endp = _endpos__2_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _1;
                    MenhirLib.EngineTypes.startp = _startpos__1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
        let x : 'tv_label_longident = Obj.magic x in
        let _1_inlined1 : 'tv_option_DOTDOTDOT_ = Obj.magic _1_inlined1 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_opt_spread_lbl_expr__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_opt_spread_lbl_expr__ = let _3 =
          let (_startpos__1_, _2, _1) = (_startpos__1_inlined1_, _2_inlined1, _1_inlined1) in
          let _2 =
            let _1 =
              let _1 =
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 27699 "reason_parser.ml"
                
              in
              
# 3525 "reason_parser.mly"
                                       ( (_1, _3) )
# 27705 "reason_parser.ml"
              
            in
            
# 3533 "reason_parser.mly"
                        (_1)
# 27711 "reason_parser.ml"
            
          in
          let _endpos__2_ = _endpos__3_ in
          
# 4946 "reason_parser.mly"
    ( let dotdotdot = match _1 with
      | Some _ -> Some (mklocation _startpos__1_ _endpos__2_)
      | None -> None
      in
      (dotdotdot, _2)
    )
# 27723 "reason_parser.ml"
          
        in
        
# 4972 "reason_parser.mly"
                                               ( _3 :: _1 )
# 27729 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let x : 'tv_label_longident = Obj.magic x in
        let _1_inlined1 : 'tv_option_DOTDOTDOT_ = Obj.magic _1_inlined1 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_opt_spread_lbl_expr__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_opt_spread_lbl_expr__ = let _3 =
          let (_startpos__1_, _1) = (_startpos__1_inlined1_, _1_inlined1) in
          let _2 =
            let _1 =
              let _1 =
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 27782 "reason_parser.ml"
                
              in
              
# 3529 "reason_parser.mly"
                            ( (_1, exp_of_label _1) )
# 27788 "reason_parser.ml"
              
            in
            
# 3534 "reason_parser.mly"
                    (_1)
# 27794 "reason_parser.ml"
            
          in
          let _endpos__2_ = _endpos_x_ in
          
# 4946 "reason_parser.mly"
    ( let dotdotdot = match _1 with
      | Some _ -> Some (mklocation _startpos__1_ _endpos__2_)
      | None -> None
      in
      (dotdotdot, _2)
    )
# 27806 "reason_parser.ml"
          
        in
        
# 4972 "reason_parser.mly"
                                               ( _3 :: _1 )
# 27812 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_pattern = Obj.magic _2 in
        let _1 : 'tv_option_DOTDOTDOT_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_opt_spread_pattern__ = let _1 = 
# 4946 "reason_parser.mly"
    ( let dotdotdot = match _1 with
      | Some _ -> Some (mklocation _startpos__1_ _endpos__2_)
      | None -> None
      in
      (dotdotdot, _2)
    )
# 27849 "reason_parser.ml"
         in
        
# 4971 "reason_parser.mly"
      ( [_1] )
# 27854 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2_inlined1;
          MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _2_inlined1 : 'tv_pattern = Obj.magic _2_inlined1 in
        let _1_inlined1 : 'tv_option_DOTDOTDOT_ = Obj.magic _1_inlined1 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_opt_spread_pattern__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_inlined1_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_opt_spread_pattern__ = let _3 =
          let (_endpos__2_, _startpos__1_, _2, _1) = (_endpos__2_inlined1_, _startpos__1_inlined1_, _2_inlined1, _1_inlined1) in
          
# 4946 "reason_parser.mly"
    ( let dotdotdot = match _1 with
      | Some _ -> Some (mklocation _startpos__1_ _endpos__2_)
      | None -> None
      in
      (dotdotdot, _2)
    )
# 27907 "reason_parser.ml"
          
        in
        
# 4972 "reason_parser.mly"
                                               ( _3 :: _1 )
# 27913 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_pattern_optional_constraint = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_pattern_optional_constraint_ = 
# 4971 "reason_parser.mly"
      ( [_1] )
# 27938 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_pattern_optional_constraint = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_pattern_optional_constraint_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_pattern_optional_constraint_ = 
# 4972 "reason_parser.mly"
                                               ( _3 :: _1 )
# 27977 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_protected_type = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_protected_type_ = 
# 4971 "reason_parser.mly"
      ( [_1] )
# 28002 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_protected_type = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_protected_type_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_protected_type_ = 
# 4972 "reason_parser.mly"
                                               ( _3 :: _1 )
# 28041 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_record_label_declaration = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_record_label_declaration_ = 
# 4971 "reason_parser.mly"
      ( [_1] )
# 28066 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_record_label_declaration = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_record_label_declaration_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_record_label_declaration_ = 
# 4972 "reason_parser.mly"
                                               ( _3 :: _1 )
# 28105 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_string_literal_expr_maybe_punned = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_string_literal_expr_maybe_punned_ = 
# 4971 "reason_parser.mly"
      ( [_1] )
# 28130 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_string_literal_expr_maybe_punned = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_string_literal_expr_maybe_punned_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_string_literal_expr_maybe_punned_ = 
# 4972 "reason_parser.mly"
                                               ( _3 :: _1 )
# 28169 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_string_literal_label = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_string_literal_label_ = 
# 4971 "reason_parser.mly"
      ( [_1] )
# 28194 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_string_literal_label = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_string_literal_label_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_string_literal_label_ = 
# 4972 "reason_parser.mly"
                                               ( _3 :: _1 )
# 28233 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_type_parameter = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_type_parameter_ = 
# 4971 "reason_parser.mly"
      ( [_1] )
# 28258 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_type_parameter = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_type_parameter_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_type_parameter_ = 
# 4972 "reason_parser.mly"
                                               ( _3 :: _1 )
# 28297 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_type_variable_with_variance = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_type_variable_with_variance_ = 
# 4971 "reason_parser.mly"
      ( [_1] )
# 28322 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_type_variable_with_variance = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_type_variable_with_variance_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_type_variable_with_variance_ = 
# 4972 "reason_parser.mly"
                                               ( _3 :: _1 )
# 28361 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : 'tv_arrow_type_parameter = Obj.magic x in
        let _1 : 'tv_option_DOT_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_uncurried_arrow_type_parameter_ = let _1 =
          let _2 =
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 28397 "reason_parser.ml"
            
          in
          
# 4378 "reason_parser.mly"
  ( let uncurried = match _1 with | Some _ -> true | None -> false in
    match _2.txt with
    | (Labelled _, _) when uncurried ->
        raise Reason_syntax_util.(Error(_2.loc, (Syntax_error "An uncurried function type with labelled arguments is not supported at the moment.")))
    | _ -> (_2, uncurried)
  )
# 28408 "reason_parser.ml"
          
        in
        
# 4971 "reason_parser.mly"
      ( [_1] )
# 28414 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let x : 'tv_arrow_type_parameter = Obj.magic x in
        let _1_inlined1 : 'tv_option_DOT_ = Obj.magic _1_inlined1 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_uncurried_arrow_type_parameter_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_uncurried_arrow_type_parameter_ = let _3 =
          let _1 = _1_inlined1 in
          let _2 =
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 28465 "reason_parser.ml"
            
          in
          
# 4378 "reason_parser.mly"
  ( let uncurried = match _1 with | Some _ -> true | None -> false in
    match _2.txt with
    | (Labelled _, _) when uncurried ->
        raise Reason_syntax_util.(Error(_2.loc, (Syntax_error "An uncurried function type with labelled arguments is not supported at the moment.")))
    | _ -> (_2, uncurried)
  )
# 28476 "reason_parser.ml"
          
        in
        
# 4972 "reason_parser.mly"
                                               ( _3 :: _1 )
# 28482 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_labeled_expr = Obj.magic _2 in
        let _1 : 'tv_option_DOT_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_uncurried_labeled_expr_ = let _1 =
          let _endpos = _endpos__2_ in
          let _startpos = _startpos__1_ in
          
# 3261 "reason_parser.mly"
                      (
    let uncurried = match _1 with | Some _ -> true | None -> false in
    if uncurried then
      let (lbl, argExpr) = _2 in
      let loc = mklocation _startpos _endpos in
      let up = uncurry_payload ~name:"uncurry" loc in
      (lbl, {argExpr with pexp_attributes = up::argExpr.pexp_attributes})
    else _2
  )
# 28525 "reason_parser.ml"
          
        in
        
# 4971 "reason_parser.mly"
      ( [_1] )
# 28531 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2_inlined1;
          MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _2_inlined1 : 'tv_labeled_expr = Obj.magic _2_inlined1 in
        let _1_inlined1 : 'tv_option_DOT_ = Obj.magic _1_inlined1 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_uncurried_labeled_expr_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_inlined1_ in
        let _v : 'tv_lseparated_nonempty_list_aux_COMMA_uncurried_labeled_expr_ = let _3 =
          let (_endpos__2_, _startpos__1_, _2, _1) = (_endpos__2_inlined1_, _startpos__1_inlined1_, _2_inlined1, _1_inlined1) in
          let _endpos = _endpos__2_ in
          let _startpos = _startpos__1_ in
          
# 3261 "reason_parser.mly"
                      (
    let uncurried = match _1 with | Some _ -> true | None -> false in
    if uncurried then
      let (lbl, argExpr) = _2 in
      let loc = mklocation _startpos _endpos in
      let up = uncurry_payload ~name:"uncurry" loc in
      (lbl, {argExpr with pexp_attributes = up::argExpr.pexp_attributes})
    else _2
  )
# 28589 "reason_parser.ml"
          
        in
        
# 4972 "reason_parser.mly"
                                               ( _3 :: _1 )
# 28595 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_class_field = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_lseparated_nonempty_list_aux_SEMI_class_field_ = 
# 4971 "reason_parser.mly"
      ( [_1] )
# 28620 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_class_field = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_SEMI_class_field_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_lseparated_nonempty_list_aux_SEMI_class_field_ = 
# 4972 "reason_parser.mly"
                                               ( _3 :: _1 )
# 28659 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_class_sig_field = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_lseparated_nonempty_list_aux_SEMI_class_sig_field_ = 
# 4971 "reason_parser.mly"
      ( [_1] )
# 28684 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_class_sig_field = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_SEMI_class_sig_field_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_lseparated_nonempty_list_aux_SEMI_class_sig_field_ = 
# 4972 "reason_parser.mly"
                                               ( _3 :: _1 )
# 28723 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_expr = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_option_preceded_WHEN_expr__ = Obj.magic _3 in
        let _2 : 'tv_pattern = Obj.magic _2 in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_match_case_expr_ = let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 28779 "reason_parser.ml"
          
        in
        
# 3432 "reason_parser.mly"
  ( let pat = {_2 with ppat_loc =
      { _2.ppat_loc with
        loc_start = _1.loc.loc_start
      }
    } in
    Exp.case pat ?guard:_3 _5 )
# 28790 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_seq_expr = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_option_preceded_WHEN_expr__ = Obj.magic _3 in
        let _2 : 'tv_pattern = Obj.magic _2 in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_match_case_seq_expr_ = let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 28846 "reason_parser.ml"
          
        in
        
# 3432 "reason_parser.mly"
  ( let pat = {_2 with ppat_loc =
      { _2.ppat_loc with
        loc_start = _1.loc.loc_start
      }
    } in
    Exp.case pat ?guard:_3 _5 )
# 28857 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_poly_type = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _1_inlined1 : (
# 1173 "reason_parser.mly"
       (string)
# 28904 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_override_flag = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_method_ = let _3 =
          let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
          let x = 
# 4721 "reason_parser.mly"
                      ( _1 )
# 28916 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 28924 "reason_parser.ml"
          
        in
        
# 2147 "reason_parser.mly"
    ( if _1 = Override then syntax_error ();
      (_3, Cfk_virtual _5)
    )
# 28932 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_fun_def_EQUAL_core_type_ = Obj.magic _3 in
        let _1_inlined1 : (
# 1173 "reason_parser.mly"
       (string)
# 28966 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _1 : 'tv_override_flag = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_method_ = let _2 =
          let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
          let x = 
# 4721 "reason_parser.mly"
                      ( _1 )
# 28977 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 28985 "reason_parser.ml"
          
        in
        let _startpos__2_ = _startpos__1_inlined1_ in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 2151 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      (_2, Cfk_concrete (_1, mkexp ~ghost:true ~loc (Pexp_poly (_3, None))))
    )
# 28999 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_either_preceded_EQUAL_expr__braced_expr_ = Obj.magic _4 in
        let _3 : 'tv_option_preceded_COLON_poly_type__ = Obj.magic _3 in
        let _1_inlined1 : (
# 1173 "reason_parser.mly"
       (string)
# 29040 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _1 : 'tv_override_flag = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_method_ = let _2 =
          let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
          let x = 
# 4721 "reason_parser.mly"
                      ( _1 )
# 29051 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 29059 "reason_parser.ml"
          
        in
        let _startpos__2_ = _startpos__1_inlined1_ in
        let _endpos = _endpos__4_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 2157 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      (_2, Cfk_concrete (_1, mkexp ~ghost:true ~loc (Pexp_poly(_4, _3))))
    )
# 29073 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _8;
          MenhirLib.EngineTypes.startp = _startpos__8_;
          MenhirLib.EngineTypes.endp = _endpos__8_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _7;
            MenhirLib.EngineTypes.startp = _startpos__7_;
            MenhirLib.EngineTypes.endp = _endpos__7_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _6;
              MenhirLib.EngineTypes.startp = _startpos__6_;
              MenhirLib.EngineTypes.endp = _endpos__6_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _5;
                MenhirLib.EngineTypes.startp = _startpos__5_;
                MenhirLib.EngineTypes.endp = _endpos__5_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _4;
                  MenhirLib.EngineTypes.startp = _startpos__4_;
                  MenhirLib.EngineTypes.endp = _endpos__4_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _3;
                    MenhirLib.EngineTypes.startp = _startpos__3_;
                    MenhirLib.EngineTypes.endp = _endpos__3_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _1_inlined1;
                      MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _menhir_s;
                        MenhirLib.EngineTypes.semv = _1;
                        MenhirLib.EngineTypes.startp = _startpos__1_;
                        MenhirLib.EngineTypes.endp = _endpos__1_;
                        MenhirLib.EngineTypes.next = _menhir_stack;
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _8 : 'tv_either_preceded_EQUAL_expr__braced_expr_ = Obj.magic _8 in
        let _7 : 'tv_core_type = Obj.magic _7 in
        let _6 : unit = Obj.magic _6 in
        let _5 : 'tv_nonempty_list_LIDENT_ = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : (
# 1173 "reason_parser.mly"
       (string)
# 29142 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _1 : 'tv_override_flag = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__8_ in
        let _v : 'tv_method_ = let _2 =
          let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
          let x = 
# 4721 "reason_parser.mly"
                      ( _1 )
# 29153 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 29161 "reason_parser.ml"
          
        in
        let _startpos__2_ = _startpos__1_inlined1_ in
        let _endpos = _endpos__8_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 2165 "reason_parser.mly"
    (
      (* For non, methods we'd create a pattern binding:
         ((Ppat_constraint(mkpatvar ..., Ptyp_poly (typeVars, poly_type_varified))),
          exp_with_newtypes_constrained_by_non_varified)

         For methods, we create:
         Pexp_poly (Pexp_constraint (methodFunWithNewtypes, non_varified), Some (Ptyp_poly newTypes varified))
       *)
      let (exp_non_varified, poly_vars) = wrap_type_annotation _5 _7 _8 in
      let exp = Pexp_poly(exp_non_varified, Some poly_vars) in
      let loc = mklocation _symbolstartpos _endpos in
      (_2, Cfk_concrete (_1, mkexp ~ghost:true ~loc exp))
    )
# 29185 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined2;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined2 : 'tv_lseparated_nonempty_list_aux_COMMA_mod_ext_longident_ = Obj.magic _1_inlined2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : (
# 1220 "reason_parser.mly"
       (string)
# 29227 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_mod_ext_apply = let _2 =
          let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in
          let _1 =
            let x =
              let _1 = _1_inlined1 in
              
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 29240 "reason_parser.ml"
              
            in
            
# 200 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 29246 "reason_parser.ml"
            
          in
          
# 4978 "reason_parser.mly"
                                                       ( _1 )
# 29252 "reason_parser.ml"
          
        in
        let _endpos__2_ = _endpos__3_ in
        let _1 = 
# 4671 "reason_parser.mly"
                                  ( Lident _1 )
# 29259 "reason_parser.ml"
         in
        let _endpos = _endpos__2_ in
        let _startpos = _startpos__1_ in
        
# 4679 "reason_parser.mly"
  ( if not !Clflags.applicative_functors then
      raise Syntaxerr.(Error(Applicative_path(mklocation _startpos _endpos)));
    List.fold_left (fun p1 p2 -> Lapply (p1, p2)) _1 _2
  )
# 29269 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3_inlined1;
          MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined2;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _3;
                MenhirLib.EngineTypes.startp = _startpos__3_;
                MenhirLib.EngineTypes.endp = _endpos__3_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _2_inlined1;
                  MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
                  MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _1;
                    MenhirLib.EngineTypes.startp = _startpos__1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
        let _1_inlined2 : 'tv_lseparated_nonempty_list_aux_COMMA_mod_ext_longident_ = Obj.magic _1_inlined2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _3 : (
# 1220 "reason_parser.mly"
       (string)
# 29323 "reason_parser.ml"
        ) = Obj.magic _3 in
        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
        let _1 : 'tv_mod_ext_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_inlined1_ in
        let _v : 'tv_mod_ext_apply = let _2 =
          let (_3, _1_inlined1, _1) = (_3_inlined1, _1_inlined2, _1_inlined1) in
          let _1 =
            let x =
              let _1 = _1_inlined1 in
              
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 29338 "reason_parser.ml"
              
            in
            
# 200 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 29344 "reason_parser.ml"
            
          in
          
# 4978 "reason_parser.mly"
                                                       ( _1 )
# 29350 "reason_parser.ml"
          
        in
        let _endpos__2_ = _endpos__3_inlined1_ in
        let _1 =
          let _2 = _2_inlined1 in
          
# 4672 "reason_parser.mly"
                                  ( Ldot(_1, _3) )
# 29359 "reason_parser.ml"
          
        in
        let _endpos = _endpos__2_ in
        let _startpos = _startpos__1_ in
        
# 4679 "reason_parser.mly"
  ( if not !Clflags.applicative_functors then
      raise Syntaxerr.(Error(Applicative_path(mklocation _startpos _endpos)));
    List.fold_left (fun p1 p2 -> Lapply (p1, p2)) _1 _2
  )
# 29370 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined2;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined2 : 'tv_lseparated_nonempty_list_aux_COMMA_mod_ext_longident_ = Obj.magic _1_inlined2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_mod_ext_apply = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_mod_ext_apply = let _2 =
          let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in
          let _1 =
            let x =
              let _1 = _1_inlined1 in
              
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 29421 "reason_parser.ml"
              
            in
            
# 200 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 29427 "reason_parser.ml"
            
          in
          
# 4978 "reason_parser.mly"
                                                       ( _1 )
# 29433 "reason_parser.ml"
          
        in
        let _endpos__2_ = _endpos__3_ in
        let _1 = 
# 4673 "reason_parser.mly"
                                  ( _1 )
# 29440 "reason_parser.ml"
         in
        let _endpos = _endpos__2_ in
        let _startpos = _startpos__1_ in
        
# 4679 "reason_parser.mly"
  ( if not !Clflags.applicative_functors then
      raise Syntaxerr.(Error(Applicative_path(mklocation _startpos _endpos)));
    List.fold_left (fun p1 p2 -> Lapply (p1, p2)) _1 _2
  )
# 29450 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : (
# 1220 "reason_parser.mly"
       (string)
# 29471 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_mod_ext_longident = let _1 = 
# 4671 "reason_parser.mly"
                                  ( Lident _1 )
# 29479 "reason_parser.ml"
         in
        
# 4668 "reason_parser.mly"
                                      ( _1 )
# 29484 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : (
# 1220 "reason_parser.mly"
       (string)
# 29517 "reason_parser.ml"
        ) = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_mod_ext_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_mod_ext_longident = let _1 = 
# 4672 "reason_parser.mly"
                                  ( Ldot(_1, _3) )
# 29527 "reason_parser.ml"
         in
        
# 4668 "reason_parser.mly"
                                      ( _1 )
# 29532 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_mod_ext_apply = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_mod_ext_longident = let _1 = 
# 4673 "reason_parser.mly"
                                  ( _1 )
# 29557 "reason_parser.ml"
         in
        
# 4668 "reason_parser.mly"
                                      ( _1 )
# 29562 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : (
# 1220 "reason_parser.mly"
       (string)
# 29583 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_mod_longident = 
# 4664 "reason_parser.mly"
                                  ( Lident _1 )
# 29591 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : (
# 1220 "reason_parser.mly"
       (string)
# 29624 "reason_parser.ml"
        ) = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_mod_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_mod_longident = 
# 4665 "reason_parser.mly"
                                  ( Ldot(_1, _3) )
# 29634 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_module_expr_structure = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_module_arguments = 
# 1523 "reason_parser.mly"
                          ( [_1] )
# 29659 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let x : 'tv_module_arguments_comma_list = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_module_arguments = let _1 =
          let _1 = 
# 200 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 29699 "reason_parser.ml"
           in
          
# 4978 "reason_parser.mly"
                                                       ( _1 )
# 29704 "reason_parser.ml"
          
        in
        let _endpos__1_ = _endpos__3_ in
        let _endpos = _endpos__1_ in
        let _startpos = _startpos__1_ in
        
# 1525 "reason_parser.mly"
    ( match _1 with
      | [] -> [mkmod ~loc:(mklocation _startpos _endpos) (Pmod_structure [])]
      | xs -> xs
    )
# 29716 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _2 : 'tv_option_COMMA_ = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_module_arguments_comma_list = let _1 = 
# 4964 "reason_parser.mly"
                ( [] )
# 29741 "reason_parser.ml"
         in
        
# 1520 "reason_parser.mly"
                                                     (_1)
# 29746 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_option_COMMA_ = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_module_complex_expr_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_module_arguments_comma_list = let _1 =
          let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 29779 "reason_parser.ml"
           in
          
# 4965 "reason_parser.mly"
                                     ( _1 )
# 29784 "reason_parser.ml"
          
        in
        
# 1520 "reason_parser.mly"
                                                     (_1)
# 29790 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_module_expr_body = Obj.magic _2 in
        let _1 : 'tv_loption_functor_parameters_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_module_binding_body = 
# 1754 "reason_parser.mly"
    ( mk_functor_mod _1 _2 )
# 29822 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_module_expr_body = Obj.magic _4 in
        let _3 : 'tv_module_type = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_loption_functor_parameters_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_module_binding_body = 
# 1756 "reason_parser.mly"
    ( let loc = mklocation _startpos__3_ _endpos__4_ in
      mk_functor_mod _1 (mkmod ~loc (Pmod_constraint(_4, _3))) )
# 29869 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_module_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_module_complex_expr = let _1 =
          let x = 
# 1497 "reason_parser.mly"
    ( _1 )
# 29895 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4896 "reason_parser.mly"
  ( {x with pmod_loc = {x.pmod_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 29903 "reason_parser.ml"
          
        in
        
# 1517 "reason_parser.mly"
    (_1)
# 29909 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_module_type = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_module_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_module_complex_expr = let _1 =
          let x = 
# 1499 "reason_parser.mly"
    ( mkmod(Pmod_constraint(_1, _3)) )
# 29949 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4896 "reason_parser.mly"
  ( {x with pmod_loc = {x.pmod_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 29957 "reason_parser.ml"
          
        in
        
# 1517 "reason_parser.mly"
    (_1)
# 29963 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_expr = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_module_complex_expr = let _1 =
          let x = 
# 1501 "reason_parser.mly"
    ( mkmod(Pmod_unpack _2) )
# 29996 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4896 "reason_parser.mly"
  ( {x with pmod_loc = {x.pmod_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 30004 "reason_parser.ml"
          
        in
        
# 1517 "reason_parser.mly"
    (_1)
# 30010 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_package_type = Obj.magic _5 in
        let _4 : 'tv_option_MODULE_ = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_expr = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_module_complex_expr = let _1 =
          let x =
            let _endpos = _endpos__5_ in
            let _symbolstartpos = _startpos__1_ in
            
# 1503 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      mkmod (Pmod_unpack(
           mkexp ~ghost:true ~loc (Pexp_constraint(_2, (mktyp ~ghost:true ~loc (Ptyp_package _5))))))
    )
# 30070 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__5_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4896 "reason_parser.mly"
  ( {x with pmod_loc = {x.pmod_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 30079 "reason_parser.ml"
          
        in
        
# 1517 "reason_parser.mly"
    (_1)
# 30085 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _8;
          MenhirLib.EngineTypes.startp = _startpos__8_;
          MenhirLib.EngineTypes.endp = _endpos__8_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _7;
            MenhirLib.EngineTypes.startp = _startpos__7_;
            MenhirLib.EngineTypes.endp = _endpos__7_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _6;
              MenhirLib.EngineTypes.startp = _startpos__6_;
              MenhirLib.EngineTypes.endp = _endpos__6_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _5;
                MenhirLib.EngineTypes.startp = _startpos__5_;
                MenhirLib.EngineTypes.endp = _endpos__5_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _4;
                  MenhirLib.EngineTypes.startp = _startpos__4_;
                  MenhirLib.EngineTypes.endp = _endpos__4_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _3;
                    MenhirLib.EngineTypes.startp = _startpos__3_;
                    MenhirLib.EngineTypes.endp = _endpos__3_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _2;
                      MenhirLib.EngineTypes.startp = _startpos__2_;
                      MenhirLib.EngineTypes.endp = _endpos__2_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _menhir_s;
                        MenhirLib.EngineTypes.semv = _1;
                        MenhirLib.EngineTypes.startp = _startpos__1_;
                        MenhirLib.EngineTypes.endp = _endpos__1_;
                        MenhirLib.EngineTypes.next = _menhir_stack;
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _8 : 'tv_package_type = Obj.magic _8 in
        let _7 : 'tv_option_MODULE_ = Obj.magic _7 in
        let _6 : unit = Obj.magic _6 in
        let _5 : 'tv_package_type = Obj.magic _5 in
        let _4 : 'tv_option_MODULE_ = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_expr = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__8_ in
        let _v : 'tv_module_complex_expr = let _1 =
          let x =
            let _endpos = _endpos__8_ in
            let _symbolstartpos = _startpos__1_ in
            
# 1508 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      mkmod (Pmod_unpack(
             mkexp ~ghost:true ~loc (Pexp_coerce(_2, Some(mktyp ~ghost:true ~loc (Ptyp_package _5)),
                                    mktyp ~ghost:true ~loc (Ptyp_package _8))))) )
# 30166 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__8_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4896 "reason_parser.mly"
  ( {x with pmod_loc = {x.pmod_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 30175 "reason_parser.ml"
          
        in
        
# 1517 "reason_parser.mly"
    (_1)
# 30181 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_package_type = Obj.magic _5 in
        let _4 : 'tv_option_MODULE_ = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_expr = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_module_complex_expr = let _1 =
          let x =
            let _endpos = _endpos__5_ in
            let _symbolstartpos = _startpos__1_ in
            
# 1513 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos and ghost = true in
      let mty = mktyp ~ghost ~loc (Ptyp_package _5) in
      mkmod (Pmod_unpack(mkexp ~ghost ~loc (Pexp_coerce(_2, None, mty))))
    )
# 30241 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__5_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4896 "reason_parser.mly"
  ( {x with pmod_loc = {x.pmod_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 30250 "reason_parser.ml"
          
        in
        
# 1517 "reason_parser.mly"
    (_1)
# 30256 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_module_type_body_COLON_ = Obj.magic _2 in
        let _1 : 'tv_loption_functor_parameters_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_module_declaration = 
# 1973 "reason_parser.mly"
  ( mk_functor_mty _1 _2 )
# 30288 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_module_expr = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 30318 "reason_parser.ml"
              
            in
            
# 1541 "reason_parser.mly"
    ( mkmod(Pmod_ident _1) )
# 30324 "reason_parser.ml"
            
          in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4896 "reason_parser.mly"
  ( {x with pmod_loc = {x.pmod_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 30332 "reason_parser.ml"
          
        in
        
# 1580 "reason_parser.mly"
    (_1)
# 30338 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_module_expr_structure = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_module_expr = let _1 =
          let x = 
# 1542 "reason_parser.mly"
                          ( _1 )
# 30364 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4896 "reason_parser.mly"
  ( {x with pmod_loc = {x.pmod_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 30372 "reason_parser.ml"
          
        in
        
# 1580 "reason_parser.mly"
    (_1)
# 30378 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _4 : 'tv_module_type = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_module_expr = Obj.magic _2 in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_module_expr = let _1 =
          let x =
            let _5 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 30437 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 30446 "reason_parser.ml"
              
            in
            
# 1544 "reason_parser.mly"
    ( unclosed_mod (with_txt _1 "(") (with_txt _5 ")"))
# 30452 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos_x_inlined1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4896 "reason_parser.mly"
  ( {x with pmod_loc = {x.pmod_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 30461 "reason_parser.ml"
          
        in
        
# 1580 "reason_parser.mly"
    (_1)
# 30467 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_module_complex_expr = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_module_expr = let _1 =
          let x = 
# 1546 "reason_parser.mly"
    ( _2 )
# 30507 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4896 "reason_parser.mly"
  ( {x with pmod_loc = {x.pmod_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 30515 "reason_parser.ml"
          
        in
        
# 1580 "reason_parser.mly"
    (_1)
# 30521 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_module_expr = let _1 =
          let x = 
# 1548 "reason_parser.mly"
    ( mkmod (Pmod_structure []) )
# 30554 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4896 "reason_parser.mly"
  ( {x with pmod_loc = {x.pmod_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 30562 "reason_parser.ml"
          
        in
        
# 1580 "reason_parser.mly"
    (_1)
# 30568 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_extension = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_module_expr = let _1 =
          let x = 
# 1550 "reason_parser.mly"
    ( mkmod (Pmod_extension _1) )
# 30594 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4896 "reason_parser.mly"
  ( {x with pmod_loc = {x.pmod_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 30602 "reason_parser.ml"
          
        in
        
# 1580 "reason_parser.mly"
    (_1)
# 30608 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_module_expr = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_option_preceded_COLON_simple_module_type__ = Obj.magic _3 in
        let _2 : 'tv_functor_parameters = Obj.magic _2 in
        let _1 : 'tv_either_ES6_FUN_FUN_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_module_expr = let _1 =
          let x =
            let _endpos = _endpos__5_ in
            
# 1558 "reason_parser.mly"
    ( let me = match _3 with
        | None -> _5
        | Some mt ->
          let loc = mklocation _startpos__3_ _endpos in
          mkmod ~loc (Pmod_constraint(_5, mt))
      in
      mk_functor_mod _2 me
    )
# 30671 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__5_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4896 "reason_parser.mly"
  ( {x with pmod_loc = {x.pmod_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 30680 "reason_parser.ml"
          
        in
        
# 1580 "reason_parser.mly"
    (_1)
# 30686 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_module_arguments = Obj.magic _2 in
        let _1 : 'tv_module_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_module_expr = let _1 =
          let x = 
# 1567 "reason_parser.mly"
    ( List.fold_left mkmod_app _1 _2 )
# 30719 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4896 "reason_parser.mly"
  ( {x with pmod_loc = {x.pmod_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 30727 "reason_parser.ml"
          
        in
        
# 1580 "reason_parser.mly"
    (_1)
# 30733 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _3 : 'tv_module_expr = Obj.magic _3 in
        let x : unit = Obj.magic x in
        let _1 : 'tv_module_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_module_expr = let _1 =
          let x =
            let _4 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 30785 "reason_parser.ml"
              
            in
            let _2 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 30794 "reason_parser.ml"
              
            in
            
# 1569 "reason_parser.mly"
    ( unclosed_mod (with_txt _2 "(") (with_txt _4 ")") )
# 30800 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos_x_inlined1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4896 "reason_parser.mly"
  ( {x with pmod_loc = {x.pmod_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 30809 "reason_parser.ml"
          
        in
        
# 1580 "reason_parser.mly"
    (_1)
# 30815 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _2 : 'tv_module_expr = Obj.magic _2 in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_module_expr = let _1 =
          let x =
            let _3 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 30860 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 30869 "reason_parser.ml"
              
            in
            
# 1571 "reason_parser.mly"
    ( unclosed_mod (with_txt _1 "(") (with_txt _3 ")") )
# 30875 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos_x_inlined1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4896 "reason_parser.mly"
  ( {x with pmod_loc = {x.pmod_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 30884 "reason_parser.ml"
          
        in
        
# 1580 "reason_parser.mly"
    (_1)
# 30890 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_module_expr = let _1 =
          let x =
            let _5 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 30949 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 30958 "reason_parser.ml"
              
            in
            
# 1573 "reason_parser.mly"
    ( unclosed_mod (with_txt _1 "(") (with_txt _5 ")") )
# 30964 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos_x_inlined1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4896 "reason_parser.mly"
  ( {x with pmod_loc = {x.pmod_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 30973 "reason_parser.ml"
          
        in
        
# 1580 "reason_parser.mly"
    (_1)
# 30979 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_module_expr = let _1 =
          let x =
            let _5 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 31038 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 31047 "reason_parser.ml"
              
            in
            
# 1575 "reason_parser.mly"
    ( unclosed_mod (with_txt _1 "(") (with_txt _5 ")") )
# 31053 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos_x_inlined1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4896 "reason_parser.mly"
  ( {x with pmod_loc = {x.pmod_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 31062 "reason_parser.ml"
          
        in
        
# 1580 "reason_parser.mly"
    (_1)
# 31068 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = x;
                MenhirLib.EngineTypes.startp = _startpos_x_;
                MenhirLib.EngineTypes.endp = _endpos_x_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_module_expr = let _1 =
          let x =
            let _4 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 31120 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 31129 "reason_parser.ml"
              
            in
            
# 1577 "reason_parser.mly"
    ( unclosed_mod (with_txt _1 "(") (with_txt _4 ")") )
# 31135 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos_x_inlined1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4896 "reason_parser.mly"
  ( {x with pmod_loc = {x.pmod_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 31144 "reason_parser.ml"
          
        in
        
# 1580 "reason_parser.mly"
    (_1)
# 31150 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_module_expr = Obj.magic _2 in
        let _1 : 'tv_attribute = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_module_expr = let _1 =
          let x = 
# 1579 "reason_parser.mly"
    ( {_2 with pmod_attributes = _1 :: _2.pmod_attributes} )
# 31183 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4896 "reason_parser.mly"
  ( {x with pmod_loc = {x.pmod_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 31191 "reason_parser.ml"
          
        in
        
# 1580 "reason_parser.mly"
    (_1)
# 31197 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : 'tv_module_expr = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_module_expr_body = let _1 = 
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 31229 "reason_parser.ml"
         in
        
# 1531 "reason_parser.mly"
                                                                      ( _1 )
# 31234 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_module_expr_structure = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_module_expr_body = 
# 1531 "reason_parser.mly"
                                                                      ( _1 )
# 31259 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_structure = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_module_expr_structure = let _endpos = _endpos__3_ in
        let _startpos = _startpos__1_ in
        
# 1535 "reason_parser.mly"
  ( mkmod ~loc:(mklocation _startpos _endpos) (Pmod_structure(_2)) )
# 31300 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_module_parameter = let _1 =
          let x =
            let _endpos = _endpos__2_ in
            let _startpos = _startpos__1_ in
            
# 1465 "reason_parser.mly"
    ( (Some (mkloc "*" (mklocation _startpos _endpos)), None) )
# 31336 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 31345 "reason_parser.ml"
          
        in
        
# 1470 "reason_parser.mly"
  (_1)
# 31351 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_module_type = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : (
# 1220 "reason_parser.mly"
       (string)
# 31386 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_module_parameter = let _1 =
          let x =
            let _1 =
              let x = 
# 1466 "reason_parser.mly"
                  (_1)
# 31397 "reason_parser.ml"
               in
              let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 31405 "reason_parser.ml"
              
            in
            
# 1467 "reason_parser.mly"
    ( (Some _1, Some _3) )
# 31411 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 31420 "reason_parser.ml"
          
        in
        
# 1470 "reason_parser.mly"
  (_1)
# 31426 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_module_type = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_module_parameter = let _1 =
          let x =
            let _1 =
              let x = 
# 1466 "reason_parser.mly"
                                    ("_")
# 31468 "reason_parser.ml"
               in
              let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 31476 "reason_parser.ml"
              
            in
            
# 1467 "reason_parser.mly"
    ( (Some _1, Some _3) )
# 31482 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 31491 "reason_parser.ml"
          
        in
        
# 1470 "reason_parser.mly"
  (_1)
# 31497 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_module_type = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_module_parameter = let _1 =
          let x = 
# 1469 "reason_parser.mly"
    ( (None, Some _1) )
# 31523 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 31531 "reason_parser.ml"
          
        in
        
# 1470 "reason_parser.mly"
  (_1)
# 31537 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _1_inlined2;
          MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
          MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _1_inlined2 : 'tv_lseparated_nonempty_list_aux_AND_with_constraint_ = Obj.magic _1_inlined2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_module_type = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_inlined2_ in
        let _v : 'tv_module_type = let _1 =
          let x =
            let _2 =
              let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in
              let _2 =
                let _1 = _1_inlined1 in
                
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 31582 "reason_parser.ml"
                
              in
              
# 1821 "reason_parser.mly"
                                                      ( _2 )
# 31588 "reason_parser.ml"
              
            in
            
# 1841 "reason_parser.mly"
    ( mkmty (Pmty_with(_1, _2)) )
# 31594 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_inlined2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4916 "reason_parser.mly"
  ( {x with pmty_loc = {x.pmty_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 31603 "reason_parser.ml"
          
        in
        
# 1894 "reason_parser.mly"
    (_1)
# 31609 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_simple_module_type = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_module_type = let _1 =
          let x = 
# 1843 "reason_parser.mly"
    (_1)
# 31635 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4916 "reason_parser.mly"
  ( {x with pmty_loc = {x.pmty_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 31643 "reason_parser.ml"
          
        in
        
# 1894 "reason_parser.mly"
    (_1)
# 31649 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _6;
          MenhirLib.EngineTypes.startp = _startpos__6_;
          MenhirLib.EngineTypes.endp = _endpos__6_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _5;
            MenhirLib.EngineTypes.startp = _startpos__5_;
            MenhirLib.EngineTypes.endp = _endpos__5_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _4;
              MenhirLib.EngineTypes.startp = _startpos__4_;
              MenhirLib.EngineTypes.endp = _endpos__4_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _3;
                MenhirLib.EngineTypes.startp = _startpos__3_;
                MenhirLib.EngineTypes.endp = _endpos__3_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _2;
                  MenhirLib.EngineTypes.startp = _startpos__2_;
                  MenhirLib.EngineTypes.endp = _endpos__2_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _1;
                    MenhirLib.EngineTypes.startp = _startpos__1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _6 : unit = Obj.magic _6 in
        let _5 : 'tv_module_expr = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__6_ in
        let _v : 'tv_module_type = let _1 =
          let x = 
# 1845 "reason_parser.mly"
    ( mkmty (Pmty_typeof _5) )
# 31710 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__6_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4916 "reason_parser.mly"
  ( {x with pmty_loc = {x.pmty_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 31718 "reason_parser.ml"
          
        in
        
# 1894 "reason_parser.mly"
    (_1)
# 31724 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_module_type = Obj.magic _2 in
        let _1 : 'tv_attribute = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_module_type = let _1 =
          let x = 
# 1847 "reason_parser.mly"
    ( {_2 with pmty_attributes = _1 :: _2.pmty_attributes} )
# 31757 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4916 "reason_parser.mly"
  ( {x with pmty_loc = {x.pmty_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 31765 "reason_parser.ml"
          
        in
        
# 1894 "reason_parser.mly"
    (_1)
# 31771 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_module_type = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_functor_parameters = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_module_type = let _1 =
          let x = 
# 1893 "reason_parser.mly"
    ( mk_functor_mty _1 _3 )
# 31811 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4916 "reason_parser.mly"
  ( {x with pmty_loc = {x.pmty_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 31819 "reason_parser.ml"
          
        in
        
# 1894 "reason_parser.mly"
    (_1)
# 31825 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_module_type = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_module_type_body_COLON_ = 
# 1977 "reason_parser.mly"
                      ( _2 )
# 31857 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_module_type_signature = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_module_type_body_COLON_ = 
# 1978 "reason_parser.mly"
                          ( _1 )
# 31882 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_module_type = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_module_type_body_EQUAL_ = 
# 1977 "reason_parser.mly"
                      ( _2 )
# 31914 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_module_type_signature = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_module_type_body_EQUAL_ = 
# 1978 "reason_parser.mly"
                          ( _1 )
# 31939 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_signature = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_module_type_signature = let _endpos = _endpos__3_ in
        let _startpos = _startpos__1_ in
        
# 1803 "reason_parser.mly"
  ( mkmty ~loc:(mklocation _startpos _endpos) (Pmty_signature _2) )
# 31980 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_ident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_mty_longident = 
# 4686 "reason_parser.mly"
                                 ( Lident _1 )
# 32005 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_ident = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_mod_ext_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_mty_longident = 
# 4687 "reason_parser.mly"
                                 ( Ldot(_1, _3) )
# 32044 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_mutable_flag = 
# 4744 "reason_parser.mly"
                  ( Immutable )
# 32062 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_mutable_flag = 
# 4745 "reason_parser.mly"
                  ( Mutable )
# 32087 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_mutable_or_virtual_flags = 
# 4754 "reason_parser.mly"
                  ( Immutable, Concrete )
# 32105 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_mutable_flag = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_mutable_or_virtual_flags = 
# 4755 "reason_parser.mly"
                         ( _2, Virtual )
# 32137 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_virtual_flag = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_mutable_or_virtual_flags = 
# 4756 "reason_parser.mly"
                         ( Mutable, _2 )
# 32169 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_non_arrowed_simple_core_type = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_non_arrowed_core_type = 
# 4417 "reason_parser.mly"
    ( _1 )
# 32194 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_non_arrowed_core_type = Obj.magic _2 in
        let _1 : 'tv_attribute = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_non_arrowed_core_type = 
# 4419 "reason_parser.mly"
    ( {_2 with ptyp_attributes = _1 :: _2.ptyp_attributes} )
# 32226 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_non_arrowed_simple_core_types = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_non_arrowed_simple_core_type = 
# 4454 "reason_parser.mly"
                                        ( _1 )
# 32251 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : 'tv_basic_core_type = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_non_arrowed_simple_core_type = let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4912 "reason_parser.mly"
  ( {x with ptyp_loc = {x.ptyp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 32279 "reason_parser.ml"
          
        in
        
# 4455 "reason_parser.mly"
                                       ( _1 )
# 32285 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_type_parameters = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_non_arrowed_simple_core_types = let _1 =
          let x = 
# 4447 "reason_parser.mly"
    ( match _1 with
      | [one] -> one
      | many -> mktyp (Ptyp_tuple many)
    )
# 32314 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4912 "reason_parser.mly"
  ( {x with ptyp_loc = {x.ptyp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 32322 "reason_parser.ml"
          
        in
        
# 4451 "reason_parser.mly"
    (_1)
# 32328 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_option_COMMA_ = Obj.magic _2 in
        let _1_inlined1 : 'tv_lseparated_nonempty_list_aux_COMMA_expr_optional_constraint_ = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_non_labeled_argument_list = let _1 =
          let _1 =
            let x =
              let _1 = _1_inlined1 in
              let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 32378 "reason_parser.ml"
               in
              
# 3221 "reason_parser.mly"
                                                                   ( _1 )
# 32383 "reason_parser.ml"
              
            in
            
# 200 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 32389 "reason_parser.ml"
            
          in
          
# 4978 "reason_parser.mly"
                                                       ( _1 )
# 32395 "reason_parser.ml"
          
        in
        
# 3224 "reason_parser.mly"
                                                ( _1 )
# 32401 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_non_labeled_argument_list = let _endpos = _endpos__2_ in
        let _startpos = _startpos__1_ in
        
# 3226 "reason_parser.mly"
    ( let loc = mklocation _startpos _endpos in
      [mkexp_constructor_unit loc loc] )
# 32436 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : (
# 1173 "reason_parser.mly"
       (string)
# 32457 "reason_parser.ml"
        ) = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_nonempty_list_LIDENT_ = 
# 221 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [ x ] )
# 32465 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = xs;
          MenhirLib.EngineTypes.startp = _startpos_xs_;
          MenhirLib.EngineTypes.endp = _endpos_xs_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let xs : 'tv_nonempty_list_LIDENT_ = Obj.magic xs in
        let x : (
# 1173 "reason_parser.mly"
       (string)
# 32493 "reason_parser.ml"
        ) = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_xs_ in
        let _v : 'tv_nonempty_list_LIDENT_ = 
# 223 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x :: xs )
# 32501 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : (
# 1212 "reason_parser.mly"
       (string * string option * string option)
# 32522 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_nonempty_list___anonymous_33_ = let x = 
# 3908 "reason_parser.mly"
                                            ( let (s, _, _) = _1 in s )
# 32530 "reason_parser.ml"
         in
        
# 221 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [ x ] )
# 32535 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = xs;
          MenhirLib.EngineTypes.startp = _startpos_xs_;
          MenhirLib.EngineTypes.endp = _endpos_xs_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let xs : 'tv_nonempty_list___anonymous_33_ = Obj.magic xs in
        let _1 : (
# 1212 "reason_parser.mly"
       (string * string option * string option)
# 32563 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_xs_ in
        let _v : 'tv_nonempty_list___anonymous_33_ = let x = 
# 3908 "reason_parser.mly"
                                            ( let (s, _, _) = _1 in s )
# 32571 "reason_parser.ml"
         in
        
# 223 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x :: xs )
# 32576 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : 'tv_attribute = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_nonempty_list_as_loc_attribute__ = let x =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 32604 "reason_parser.ml"
          
        in
        
# 221 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [ x ] )
# 32610 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = xs;
          MenhirLib.EngineTypes.startp = _startpos_xs_;
          MenhirLib.EngineTypes.endp = _endpos_xs_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let xs : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic xs in
        let x : 'tv_attribute = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_xs_ in
        let _v : 'tv_nonempty_list_as_loc_attribute__ = let x =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 32645 "reason_parser.ml"
          
        in
        
# 223 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x :: xs )
# 32651 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _4 : 'tv_either_extension_constructor_declaration_extension_constructor_rebind_ = Obj.magic _4 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_nonempty_list_attributed_ext_constructor_either_extension_constructor_declaration_extension_constructor_rebind___ = let x =
          let _3 = 
# 4843 "reason_parser.mly"
    ( [] )
# 32684 "reason_parser.ml"
           in
          let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 32689 "reason_parser.ml"
           in
          
# 4143 "reason_parser.mly"
                                        ( {_4 with pext_attributes = List.concat [_1; _3; _4.pext_attributes]} )
# 32694 "reason_parser.ml"
          
        in
        
# 221 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [ x ] )
# 32700 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_either_extension_constructor_declaration_extension_constructor_rebind_ = Obj.magic _4 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_nonempty_list_attributed_ext_constructor_either_extension_constructor_declaration_extension_constructor_rebind___ = let x =
          let _3 =
            let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 32741 "reason_parser.ml"
             in
            
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 32746 "reason_parser.ml"
            
          in
          let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 32752 "reason_parser.ml"
           in
          
# 4143 "reason_parser.mly"
                                        ( {_4 with pext_attributes = List.concat [_1; _3; _4.pext_attributes]} )
# 32757 "reason_parser.ml"
          
        in
        
# 221 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [ x ] )
# 32763 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_either_extension_constructor_declaration_extension_constructor_rebind_ = Obj.magic _4 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_nonempty_list_attributed_ext_constructor_either_extension_constructor_declaration_extension_constructor_rebind___ = let x =
          let _3 = 
# 4843 "reason_parser.mly"
    ( [] )
# 32803 "reason_parser.ml"
           in
          let _1 =
            let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 32809 "reason_parser.ml"
             in
            
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 32814 "reason_parser.ml"
            
          in
          
# 4143 "reason_parser.mly"
                                        ( {_4 with pext_attributes = List.concat [_1; _3; _4.pext_attributes]} )
# 32820 "reason_parser.ml"
          
        in
        
# 221 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [ x ] )
# 32826 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_either_extension_constructor_declaration_extension_constructor_rebind_ = Obj.magic _4 in
        let _1_inlined1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1_inlined1 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_nonempty_list_attributed_ext_constructor_either_extension_constructor_declaration_extension_constructor_rebind___ = let x =
          let _3 =
            let _1 = _1_inlined1 in
            let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 32875 "reason_parser.ml"
             in
            
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 32880 "reason_parser.ml"
            
          in
          let _1 =
            let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 32887 "reason_parser.ml"
             in
            
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 32892 "reason_parser.ml"
            
          in
          
# 4143 "reason_parser.mly"
                                        ( {_4 with pext_attributes = List.concat [_1; _3; _4.pext_attributes]} )
# 32898 "reason_parser.ml"
          
        in
        
# 221 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [ x ] )
# 32904 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = xs;
          MenhirLib.EngineTypes.startp = _startpos_xs_;
          MenhirLib.EngineTypes.endp = _endpos_xs_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let xs : 'tv_nonempty_list_attributed_ext_constructor_either_extension_constructor_declaration_extension_constructor_rebind___ = Obj.magic xs in
        let _4 : 'tv_either_extension_constructor_declaration_extension_constructor_rebind_ = Obj.magic _4 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos_xs_ in
        let _v : 'tv_nonempty_list_attributed_ext_constructor_either_extension_constructor_declaration_extension_constructor_rebind___ = let x =
          let _3 = 
# 4843 "reason_parser.mly"
    ( [] )
# 32944 "reason_parser.ml"
           in
          let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 32949 "reason_parser.ml"
           in
          
# 4143 "reason_parser.mly"
                                        ( {_4 with pext_attributes = List.concat [_1; _3; _4.pext_attributes]} )
# 32954 "reason_parser.ml"
          
        in
        
# 223 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x :: xs )
# 32960 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = xs;
          MenhirLib.EngineTypes.startp = _startpos_xs_;
          MenhirLib.EngineTypes.endp = _endpos_xs_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let xs : 'tv_nonempty_list_attributed_ext_constructor_either_extension_constructor_declaration_extension_constructor_rebind___ = Obj.magic xs in
        let _4 : 'tv_either_extension_constructor_declaration_extension_constructor_rebind_ = Obj.magic _4 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos_xs_ in
        let _v : 'tv_nonempty_list_attributed_ext_constructor_either_extension_constructor_declaration_extension_constructor_rebind___ = let x =
          let _3 =
            let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 33008 "reason_parser.ml"
             in
            
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 33013 "reason_parser.ml"
            
          in
          let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 33019 "reason_parser.ml"
           in
          
# 4143 "reason_parser.mly"
                                        ( {_4 with pext_attributes = List.concat [_1; _3; _4.pext_attributes]} )
# 33024 "reason_parser.ml"
          
        in
        
# 223 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x :: xs )
# 33030 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = xs;
          MenhirLib.EngineTypes.startp = _startpos_xs_;
          MenhirLib.EngineTypes.endp = _endpos_xs_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let xs : 'tv_nonempty_list_attributed_ext_constructor_either_extension_constructor_declaration_extension_constructor_rebind___ = Obj.magic xs in
        let _4 : 'tv_either_extension_constructor_declaration_extension_constructor_rebind_ = Obj.magic _4 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_xs_ in
        let _v : 'tv_nonempty_list_attributed_ext_constructor_either_extension_constructor_declaration_extension_constructor_rebind___ = let x =
          let _3 = 
# 4843 "reason_parser.mly"
    ( [] )
# 33077 "reason_parser.ml"
           in
          let _1 =
            let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 33083 "reason_parser.ml"
             in
            
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 33088 "reason_parser.ml"
            
          in
          
# 4143 "reason_parser.mly"
                                        ( {_4 with pext_attributes = List.concat [_1; _3; _4.pext_attributes]} )
# 33094 "reason_parser.ml"
          
        in
        
# 223 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x :: xs )
# 33100 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = xs;
          MenhirLib.EngineTypes.startp = _startpos_xs_;
          MenhirLib.EngineTypes.endp = _endpos_xs_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let xs : 'tv_nonempty_list_attributed_ext_constructor_either_extension_constructor_declaration_extension_constructor_rebind___ = Obj.magic xs in
        let _4 : 'tv_either_extension_constructor_declaration_extension_constructor_rebind_ = Obj.magic _4 in
        let _1_inlined1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1_inlined1 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_xs_ in
        let _v : 'tv_nonempty_list_attributed_ext_constructor_either_extension_constructor_declaration_extension_constructor_rebind___ = let x =
          let _3 =
            let _1 = _1_inlined1 in
            let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 33156 "reason_parser.ml"
             in
            
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 33161 "reason_parser.ml"
            
          in
          let _1 =
            let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 33168 "reason_parser.ml"
             in
            
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 33173 "reason_parser.ml"
            
          in
          
# 4143 "reason_parser.mly"
                                        ( {_4 with pext_attributes = List.concat [_1; _3; _4.pext_attributes]} )
# 33179 "reason_parser.ml"
          
        in
        
# 223 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x :: xs )
# 33185 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _4 : 'tv_extension_constructor_declaration = Obj.magic _4 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_nonempty_list_attributed_ext_constructor_extension_constructor_declaration__ = let x =
          let _3 = 
# 4843 "reason_parser.mly"
    ( [] )
# 33218 "reason_parser.ml"
           in
          let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 33223 "reason_parser.ml"
           in
          
# 4143 "reason_parser.mly"
                                        ( {_4 with pext_attributes = List.concat [_1; _3; _4.pext_attributes]} )
# 33228 "reason_parser.ml"
          
        in
        
# 221 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [ x ] )
# 33234 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_extension_constructor_declaration = Obj.magic _4 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_nonempty_list_attributed_ext_constructor_extension_constructor_declaration__ = let x =
          let _3 =
            let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 33275 "reason_parser.ml"
             in
            
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 33280 "reason_parser.ml"
            
          in
          let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 33286 "reason_parser.ml"
           in
          
# 4143 "reason_parser.mly"
                                        ( {_4 with pext_attributes = List.concat [_1; _3; _4.pext_attributes]} )
# 33291 "reason_parser.ml"
          
        in
        
# 221 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [ x ] )
# 33297 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_extension_constructor_declaration = Obj.magic _4 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_nonempty_list_attributed_ext_constructor_extension_constructor_declaration__ = let x =
          let _3 = 
# 4843 "reason_parser.mly"
    ( [] )
# 33337 "reason_parser.ml"
           in
          let _1 =
            let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 33343 "reason_parser.ml"
             in
            
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 33348 "reason_parser.ml"
            
          in
          
# 4143 "reason_parser.mly"
                                        ( {_4 with pext_attributes = List.concat [_1; _3; _4.pext_attributes]} )
# 33354 "reason_parser.ml"
          
        in
        
# 221 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [ x ] )
# 33360 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_extension_constructor_declaration = Obj.magic _4 in
        let _1_inlined1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1_inlined1 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_nonempty_list_attributed_ext_constructor_extension_constructor_declaration__ = let x =
          let _3 =
            let _1 = _1_inlined1 in
            let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 33409 "reason_parser.ml"
             in
            
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 33414 "reason_parser.ml"
            
          in
          let _1 =
            let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 33421 "reason_parser.ml"
             in
            
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 33426 "reason_parser.ml"
            
          in
          
# 4143 "reason_parser.mly"
                                        ( {_4 with pext_attributes = List.concat [_1; _3; _4.pext_attributes]} )
# 33432 "reason_parser.ml"
          
        in
        
# 221 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [ x ] )
# 33438 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = xs;
          MenhirLib.EngineTypes.startp = _startpos_xs_;
          MenhirLib.EngineTypes.endp = _endpos_xs_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let xs : 'tv_nonempty_list_attributed_ext_constructor_extension_constructor_declaration__ = Obj.magic xs in
        let _4 : 'tv_extension_constructor_declaration = Obj.magic _4 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos_xs_ in
        let _v : 'tv_nonempty_list_attributed_ext_constructor_extension_constructor_declaration__ = let x =
          let _3 = 
# 4843 "reason_parser.mly"
    ( [] )
# 33478 "reason_parser.ml"
           in
          let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 33483 "reason_parser.ml"
           in
          
# 4143 "reason_parser.mly"
                                        ( {_4 with pext_attributes = List.concat [_1; _3; _4.pext_attributes]} )
# 33488 "reason_parser.ml"
          
        in
        
# 223 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x :: xs )
# 33494 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = xs;
          MenhirLib.EngineTypes.startp = _startpos_xs_;
          MenhirLib.EngineTypes.endp = _endpos_xs_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let xs : 'tv_nonempty_list_attributed_ext_constructor_extension_constructor_declaration__ = Obj.magic xs in
        let _4 : 'tv_extension_constructor_declaration = Obj.magic _4 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos_xs_ in
        let _v : 'tv_nonempty_list_attributed_ext_constructor_extension_constructor_declaration__ = let x =
          let _3 =
            let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 33542 "reason_parser.ml"
             in
            
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 33547 "reason_parser.ml"
            
          in
          let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 33553 "reason_parser.ml"
           in
          
# 4143 "reason_parser.mly"
                                        ( {_4 with pext_attributes = List.concat [_1; _3; _4.pext_attributes]} )
# 33558 "reason_parser.ml"
          
        in
        
# 223 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x :: xs )
# 33564 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = xs;
          MenhirLib.EngineTypes.startp = _startpos_xs_;
          MenhirLib.EngineTypes.endp = _endpos_xs_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let xs : 'tv_nonempty_list_attributed_ext_constructor_extension_constructor_declaration__ = Obj.magic xs in
        let _4 : 'tv_extension_constructor_declaration = Obj.magic _4 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_xs_ in
        let _v : 'tv_nonempty_list_attributed_ext_constructor_extension_constructor_declaration__ = let x =
          let _3 = 
# 4843 "reason_parser.mly"
    ( [] )
# 33611 "reason_parser.ml"
           in
          let _1 =
            let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 33617 "reason_parser.ml"
             in
            
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 33622 "reason_parser.ml"
            
          in
          
# 4143 "reason_parser.mly"
                                        ( {_4 with pext_attributes = List.concat [_1; _3; _4.pext_attributes]} )
# 33628 "reason_parser.ml"
          
        in
        
# 223 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x :: xs )
# 33634 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = xs;
          MenhirLib.EngineTypes.startp = _startpos_xs_;
          MenhirLib.EngineTypes.endp = _endpos_xs_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let xs : 'tv_nonempty_list_attributed_ext_constructor_extension_constructor_declaration__ = Obj.magic xs in
        let _4 : 'tv_extension_constructor_declaration = Obj.magic _4 in
        let _1_inlined1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1_inlined1 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_xs_ in
        let _v : 'tv_nonempty_list_attributed_ext_constructor_extension_constructor_declaration__ = let x =
          let _3 =
            let _1 = _1_inlined1 in
            let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 33690 "reason_parser.ml"
             in
            
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 33695 "reason_parser.ml"
            
          in
          let _1 =
            let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 33702 "reason_parser.ml"
             in
            
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 33707 "reason_parser.ml"
            
          in
          
# 4143 "reason_parser.mly"
                                        ( {_4 with pext_attributes = List.concat [_1; _3; _4.pext_attributes]} )
# 33713 "reason_parser.ml"
          
        in
        
# 223 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x :: xs )
# 33719 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_ident = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_nonempty_list_name_tag_ = let x = 
# 4719 "reason_parser.mly"
                                  ( _2 )
# 33751 "reason_parser.ml"
         in
        
# 221 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [ x ] )
# 33756 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = xs;
          MenhirLib.EngineTypes.startp = _startpos_xs_;
          MenhirLib.EngineTypes.endp = _endpos_xs_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let xs : 'tv_nonempty_list_name_tag_ = Obj.magic xs in
        let _2 : 'tv_ident = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_xs_ in
        let _v : 'tv_nonempty_list_name_tag_ = let x = 
# 4719 "reason_parser.mly"
                                  ( _2 )
# 33795 "reason_parser.ml"
         in
        
# 223 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x :: xs )
# 33800 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : 'tv_constrain = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_nonempty_list_preceded_CONSTRAINT_constrain__ = let x = 
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 33832 "reason_parser.ml"
         in
        
# 221 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [ x ] )
# 33837 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = xs;
          MenhirLib.EngineTypes.startp = _startpos_xs_;
          MenhirLib.EngineTypes.endp = _endpos_xs_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let xs : 'tv_nonempty_list_preceded_CONSTRAINT_constrain__ = Obj.magic xs in
        let x : 'tv_constrain = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_xs_ in
        let _v : 'tv_nonempty_list_preceded_CONSTRAINT_constrain__ = let x = 
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 33876 "reason_parser.ml"
         in
        
# 223 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x :: xs )
# 33881 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : 'tv_ident = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_nonempty_list_preceded_QUOTE_ident__ = let x = 
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 33913 "reason_parser.ml"
         in
        
# 221 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [ x ] )
# 33918 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = xs;
          MenhirLib.EngineTypes.startp = _startpos_xs_;
          MenhirLib.EngineTypes.endp = _endpos_xs_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let xs : 'tv_nonempty_list_preceded_QUOTE_ident__ = Obj.magic xs in
        let x : 'tv_ident = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_xs_ in
        let _v : 'tv_nonempty_list_preceded_QUOTE_ident__ = let x = 
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 33957 "reason_parser.ml"
         in
        
# 223 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x :: xs )
# 33962 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_nonrec_flag = 
# 4729 "reason_parser.mly"
                  ( Recursive )
# 33980 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_nonrec_flag = 
# 4730 "reason_parser.mly"
                  ( Nonrecursive )
# 34005 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : 'tv_class_self_expr = Obj.magic x in
        let _1 : 'tv_loption_located_attributes_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_object_body = let _2 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 34040 "reason_parser.ml"
          
        in
        
# 2033 "reason_parser.mly"
    ( let attrs = List.map (fun x -> mkcf ~loc:x.loc (Pcf_attribute x.txt)) _1 in
      Cstr.mk _2 attrs )
# 34047 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_object_body_class_fields = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let x : 'tv_class_self_expr = Obj.magic x in
        let _1 : 'tv_loption_located_attributes_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_object_body = let _2 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 34096 "reason_parser.ml"
          
        in
        
# 2038 "reason_parser.mly"
    ( let attrs = List.map (fun x -> mkcf ~loc:x.loc (Pcf_attribute x.txt)) _1 in
      Cstr.mk _2 (attrs @ _4) )
# 34103 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_object_body_class_fields = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_object_body = let _endpos = _endpos__1_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _endpos in
        
# 2041 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _symbolstartpos in
      Cstr.mk (mkpat ~loc (Ppat_var (mkloc "this" loc))) _1 )
# 34134 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _2 : 'tv_option_SEMI_ = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_object_body_class_fields = let _1 = 
# 4964 "reason_parser.mly"
                ( [] )
# 34159 "reason_parser.ml"
         in
        
# 2028 "reason_parser.mly"
                                             ( List.concat _1 )
# 34164 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_option_SEMI_ = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_SEMI_class_field_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_object_body_class_fields = let _1 =
          let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 34197 "reason_parser.ml"
           in
          
# 4965 "reason_parser.mly"
                                     ( _1 )
# 34202 "reason_parser.ml"
          
        in
        
# 2028 "reason_parser.mly"
                                             ( List.concat _1 )
# 34208 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : (
# 1173 "reason_parser.mly"
       (string)
# 34229 "reason_parser.ml"
        ) = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_object_label_declaration = let _2 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 34240 "reason_parser.ml"
          
        in
        let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 34246 "reason_parser.ml"
         in
        
# 4505 "reason_parser.mly"
    ( (_2.txt, _1, mkct _2) )
# 34251 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : (
# 1173 "reason_parser.mly"
       (string)
# 34278 "reason_parser.ml"
        ) = Obj.magic x in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_object_label_declaration = let _2 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 34290 "reason_parser.ml"
          
        in
        let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 34297 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 34302 "reason_parser.ml"
          
        in
        
# 4505 "reason_parser.mly"
    ( (_2.txt, _1, mkct _2) )
# 34308 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_poly_type = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : (
# 1173 "reason_parser.mly"
       (string)
# 34343 "reason_parser.ml"
        ) = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_object_label_declaration = let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 34351 "reason_parser.ml"
         in
        
# 4507 "reason_parser.mly"
    ( (_2, _1, _4) )
# 34356 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_poly_type = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : (
# 1173 "reason_parser.mly"
       (string)
# 34397 "reason_parser.ml"
        ) = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_object_label_declaration = let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 34407 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 34412 "reason_parser.ml"
          
        in
        
# 4507 "reason_parser.mly"
    ( (_2, _1, _4) )
# 34418 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_option_COMMA_ = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_object_label_declaration_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_object_label_declarations = let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 34450 "reason_parser.ml"
         in
        
# 4511 "reason_parser.mly"
                                                                   ( _1 )
# 34455 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_object_record_type = 
# 4486 "reason_parser.mly"
    ( syntax_error () )
# 34487 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_string_literal_labels = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_object_record_type = let _endpos = _endpos__4_ in
        let _symbolstartpos = _startpos__1_ in
        
# 4488 "reason_parser.mly"
    ( (* `{. "foo": bar}` -> `Js.t({. foo: bar})` *)
      let loc = mklocation _symbolstartpos _endpos in
      mkBsObjTypeSugar ~loc ~closed:Closed _3
    )
# 34538 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_string_literal_labels = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_object_record_type = let _endpos = _endpos__4_ in
        let _symbolstartpos = _startpos__1_ in
        
# 4493 "reason_parser.mly"
    ( (* `{.. "foo": bar}` -> `Js.t({.. foo: bar})` *)
      let loc = mklocation _symbolstartpos _endpos in
      mkBsObjTypeSugar ~loc ~closed:Open _3
    )
# 34589 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_loption_object_label_declarations_ = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_object_record_type = 
# 4498 "reason_parser.mly"
    ( mktyp (Ptyp_object (_3, Closed)) )
# 34635 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_loption_object_label_declarations_ = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_object_record_type = 
# 4500 "reason_parser.mly"
    ( mktyp (Ptyp_object (_3, Open)) )
# 34681 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x : 'tv_mod_longident = Obj.magic x in
        let _3 : 'tv_override_flag = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_open_statement = let _4 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 34723 "reason_parser.ml"
          
        in
        let _endpos__4_ = _endpos_x_ in
        let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 34730 "reason_parser.ml"
         in
        let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
        let _endpos = _endpos__4_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 1968 "reason_parser.mly"
  ( Opn.mk _4 ~override:_3 ~attrs:_1 ~loc:(mklocation _symbolstartpos _endpos) )
# 34741 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let x : 'tv_mod_longident = Obj.magic x in
        let _3 : 'tv_override_flag = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_open_statement = let _4 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 34790 "reason_parser.ml"
          
        in
        let _endpos__4_ = _endpos_x_ in
        let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 34798 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 34803 "reason_parser.ml"
          
        in
        let _endpos = _endpos__4_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 1968 "reason_parser.mly"
  ( Opn.mk _4 ~override:_3 ~attrs:_1 ~loc:(mklocation _symbolstartpos _endpos) )
# 34814 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : (
# 1195 "reason_parser.mly"
       (string)
# 34835 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_operator = 
# 4623 "reason_parser.mly"
                      ( _1 )
# 34843 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : (
# 1196 "reason_parser.mly"
       (string)
# 34864 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_operator = 
# 4624 "reason_parser.mly"
                      ( _1 )
# 34872 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_operator = 
# 4625 "reason_parser.mly"
                      ( "!" )
# 34897 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : (
# 1147 "reason_parser.mly"
       (string)
# 34918 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_operator = let _1 = 
# 4590 "reason_parser.mly"
                      ( _1 )
# 34926 "reason_parser.ml"
         in
        
# 4626 "reason_parser.mly"
                      ( _1 )
# 34931 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : (
# 1148 "reason_parser.mly"
       (string)
# 34952 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_operator = let _1 = 
# 4591 "reason_parser.mly"
                      ( _1 )
# 34960 "reason_parser.ml"
         in
        
# 4626 "reason_parser.mly"
                      ( _1 )
# 34965 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : (
# 1149 "reason_parser.mly"
       (string)
# 34986 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_operator = let _1 = 
# 4592 "reason_parser.mly"
                      ( _1 )
# 34994 "reason_parser.ml"
         in
        
# 4626 "reason_parser.mly"
                      ( _1 )
# 34999 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : (
# 1150 "reason_parser.mly"
       (string)
# 35020 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_operator = let _1 = 
# 4593 "reason_parser.mly"
                      ( _1 )
# 35028 "reason_parser.ml"
         in
        
# 4626 "reason_parser.mly"
                      ( _1 )
# 35033 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_operator = let _1 = 
# 4595 "reason_parser.mly"
                      ( "/>" )
# 35058 "reason_parser.ml"
         in
        
# 4626 "reason_parser.mly"
                      ( _1 )
# 35063 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : (
# 1153 "reason_parser.mly"
       (string)
# 35084 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_operator = let _1 = 
# 4596 "reason_parser.mly"
                      ( _1 )
# 35092 "reason_parser.ml"
         in
        
# 4626 "reason_parser.mly"
                      ( _1 )
# 35097 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_operator = let _1 = 
# 4597 "reason_parser.mly"
                      ( "+" )
# 35122 "reason_parser.ml"
         in
        
# 4626 "reason_parser.mly"
                      ( _1 )
# 35127 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_operator = let _1 = 
# 4598 "reason_parser.mly"
                      ( "+." )
# 35152 "reason_parser.ml"
         in
        
# 4626 "reason_parser.mly"
                      ( _1 )
# 35157 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_operator = let _1 = 
# 4599 "reason_parser.mly"
                      ( "-" )
# 35182 "reason_parser.ml"
         in
        
# 4626 "reason_parser.mly"
                      ( _1 )
# 35187 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_operator = let _1 = 
# 4600 "reason_parser.mly"
                      ( "-." )
# 35212 "reason_parser.ml"
         in
        
# 4626 "reason_parser.mly"
                      ( _1 )
# 35217 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_operator = let _1 = 
# 4601 "reason_parser.mly"
                      ( "*" )
# 35242 "reason_parser.ml"
         in
        
# 4626 "reason_parser.mly"
                      ( _1 )
# 35247 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_operator = let _1 = 
# 4602 "reason_parser.mly"
                      ( "<" )
# 35272 "reason_parser.ml"
         in
        
# 4626 "reason_parser.mly"
                      ( _1 )
# 35277 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_operator = let _1 = 
# 4603 "reason_parser.mly"
                      ( ">" )
# 35302 "reason_parser.ml"
         in
        
# 4626 "reason_parser.mly"
                      ( _1 )
# 35307 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_operator = let _1 = 
# 4604 "reason_parser.mly"
                      ( "or" )
# 35332 "reason_parser.ml"
         in
        
# 4626 "reason_parser.mly"
                      ( _1 )
# 35337 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_operator = let _1 = 
# 4605 "reason_parser.mly"
                      ( "||" )
# 35362 "reason_parser.ml"
         in
        
# 4626 "reason_parser.mly"
                      ( _1 )
# 35367 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_operator = let _1 = 
# 4606 "reason_parser.mly"
                      ( "&" )
# 35392 "reason_parser.ml"
         in
        
# 4626 "reason_parser.mly"
                      ( _1 )
# 35397 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_operator = let _1 = 
# 4607 "reason_parser.mly"
                      ( "&&" )
# 35422 "reason_parser.ml"
         in
        
# 4626 "reason_parser.mly"
                      ( _1 )
# 35427 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_operator = let _1 = 
# 4608 "reason_parser.mly"
                      ( ":=" )
# 35452 "reason_parser.ml"
         in
        
# 4626 "reason_parser.mly"
                      ( _1 )
# 35457 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_operator = let _1 = 
# 4609 "reason_parser.mly"
                      ( "+=" )
# 35482 "reason_parser.ml"
         in
        
# 4626 "reason_parser.mly"
                      ( _1 )
# 35487 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_operator = let _1 = 
# 4610 "reason_parser.mly"
                      ( "%" )
# 35512 "reason_parser.ml"
         in
        
# 4626 "reason_parser.mly"
                      ( _1 )
# 35517 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_operator = let _1 = 
# 4617 "reason_parser.mly"
                      ( "<..>" )
# 35542 "reason_parser.ml"
         in
        
# 4626 "reason_parser.mly"
                      ( _1 )
# 35547 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_operator = let _1 = 
# 4618 "reason_parser.mly"
                      ( ">>" )
# 35579 "reason_parser.ml"
         in
        
# 4626 "reason_parser.mly"
                      ( _1 )
# 35584 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_operator = let _1 = 
# 4619 "reason_parser.mly"
                     ( ">..." )
# 35609 "reason_parser.ml"
         in
        
# 4626 "reason_parser.mly"
                      ( _1 )
# 35614 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_opt_LET_MODULE = 
# 4717 "reason_parser.mly"
                       ( () )
# 35639 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_opt_LET_MODULE = 
# 4717 "reason_parser.mly"
                                           ( () )
# 35671 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x : (
# 1220 "reason_parser.mly"
       (string)
# 35704 "reason_parser.ml"
        ) = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_opt_LET_MODULE = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_opt_LET_MODULE_REC_ident = let _3 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 35717 "reason_parser.ml"
          
        in
        
# 1687 "reason_parser.mly"
                                      ( _3 )
# 35723 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x : (
# 1173 "reason_parser.mly"
       (string)
# 35756 "reason_parser.ml"
        ) = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_opt_LET_MODULE = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_opt_LET_MODULE_REC_ident = let _3 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 35769 "reason_parser.ml"
          
        in
        
# 1689 "reason_parser.mly"
    ( let {loc} = _3 in
      err loc lowercase_module_msg )
# 35776 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : (
# 1220 "reason_parser.mly"
       (string)
# 35803 "reason_parser.ml"
        ) = Obj.magic x in
        let _1 : 'tv_opt_LET_MODULE = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_opt_LET_MODULE_ident = let _2 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 35815 "reason_parser.ml"
          
        in
        
# 1680 "reason_parser.mly"
                                  ( _2 )
# 35821 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : (
# 1173 "reason_parser.mly"
       (string)
# 35848 "reason_parser.ml"
        ) = Obj.magic x in
        let _1 : 'tv_opt_LET_MODULE = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_opt_LET_MODULE_ident = let _2 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 35860 "reason_parser.ml"
          
        in
        
# 1682 "reason_parser.mly"
    ( let {loc} = _2 in
      err loc lowercase_module_msg )
# 35867 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_option_COMMA_ = 
# 114 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( None )
# 35885 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_option_COMMA_ = 
# 116 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 35910 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_option_DOT_ = 
# 114 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( None )
# 35928 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_option_DOT_ = 
# 116 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 35953 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_option_DOTDOTDOT_ = 
# 114 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( None )
# 35971 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_option_DOTDOTDOT_ = 
# 116 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 35996 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_option_LET_ = 
# 114 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( None )
# 36014 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_option_LET_ = 
# 116 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 36039 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_option_MODULE_ = 
# 114 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( None )
# 36057 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_option_MODULE_ = 
# 116 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 36082 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_option_OF_ = 
# 114 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( None )
# 36100 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_option_OF_ = 
# 116 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 36125 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_option_SEMI_ = 
# 114 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( None )
# 36143 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_option_SEMI_ = 
# 116 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 36168 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_option_constructor_arguments_ = 
# 114 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( None )
# 36186 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : 'tv_constructor_arguments = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_option_constructor_arguments_ = 
# 116 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 36211 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_option_item_extension_sugar_ = 
# 114 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( None )
# 36229 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : 'tv_item_extension_sugar = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_option_item_extension_sugar_ = 
# 116 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 36254 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_option_preceded_AS_LIDENT__ = 
# 114 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( None )
# 36272 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : (
# 1173 "reason_parser.mly"
       (string)
# 36299 "reason_parser.ml"
        ) = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_option_preceded_AS_LIDENT__ = let x = 
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 36308 "reason_parser.ml"
         in
        
# 116 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 36313 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_option_preceded_COLON_class_constructor_type__ = 
# 114 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( None )
# 36331 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : 'tv_class_constructor_type = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_option_preceded_COLON_class_constructor_type__ = let x = 
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 36363 "reason_parser.ml"
         in
        
# 116 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 36368 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_option_preceded_COLON_core_type__ = 
# 114 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( None )
# 36386 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : 'tv_core_type = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_option_preceded_COLON_core_type__ = let x = 
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 36418 "reason_parser.ml"
         in
        
# 116 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 36423 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_option_preceded_COLON_expr__ = 
# 114 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( None )
# 36441 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : 'tv_expr = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_option_preceded_COLON_expr__ = let x = 
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 36473 "reason_parser.ml"
         in
        
# 116 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 36478 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_option_preceded_COLON_non_arrowed_core_type__ = 
# 114 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( None )
# 36496 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : 'tv_non_arrowed_core_type = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_option_preceded_COLON_non_arrowed_core_type__ = let x = 
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 36528 "reason_parser.ml"
         in
        
# 116 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 36533 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_option_preceded_COLON_poly_type__ = 
# 114 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( None )
# 36551 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : 'tv_poly_type = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_option_preceded_COLON_poly_type__ = let x = 
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 36583 "reason_parser.ml"
         in
        
# 116 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 36588 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_option_preceded_COLON_simple_module_type__ = 
# 114 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( None )
# 36606 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : 'tv_simple_module_type = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_option_preceded_COLON_simple_module_type__ = let x = 
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 36638 "reason_parser.ml"
         in
        
# 116 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 36643 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_option_preceded_COLONGREATER_core_type__ = 
# 114 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( None )
# 36661 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : 'tv_core_type = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_option_preceded_COLONGREATER_core_type__ = let x = 
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 36693 "reason_parser.ml"
         in
        
# 116 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 36698 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_option_preceded_WHEN_expr__ = 
# 114 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( None )
# 36716 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : 'tv_expr = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_option_preceded_WHEN_expr__ = let x = 
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 36748 "reason_parser.ml"
         in
        
# 116 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 36753 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_option_type_constraint_ = 
# 114 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( None )
# 36771 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : 'tv_type_constraint = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_option_type_constraint_ = 
# 116 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 36796 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_optional = 
# 4891 "reason_parser.mly"
    ( fun x -> Labelled x )
# 36814 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_optional = 
# 4892 "reason_parser.mly"
             ( fun x -> Optional x )
# 36839 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_optional_expr_extension = 
# 2809 "reason_parser.mly"
                ( fun exp -> exp )
# 36857 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_item_extension_sugar = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_optional_expr_extension = 
# 2810 "reason_parser.mly"
                         ( fun exp -> expression_extension _1 exp  )
# 36882 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_override_flag = 
# 4760 "reason_parser.mly"
                  ( Fresh )
# 36900 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_override_flag = 
# 4761 "reason_parser.mly"
                  ( Override )
# 36925 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_module_type = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_package_type = 
# 4522 "reason_parser.mly"
              ( package_type_of_module_type _1 )
# 36950 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_braced_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_parenthesized_expr = 
# 2970 "reason_parser.mly"
    ( _1 )
# 36975 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_parenthesized_expr = let _endpos = _endpos__3_ in
        let _startpos = _startpos__1_ in
        
# 2972 "reason_parser.mly"
    ( let loc = mklocation _startpos _endpos in
      mkexp_constructor_unit ~uncurried:true loc loc )
# 37017 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_expr_list = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_parenthesized_expr = let _endpos = _endpos__3_ in
        let _startpos = _startpos__1_ in
        
# 2975 "reason_parser.mly"
    ( may_tuple _startpos _endpos _2 )
# 37058 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_core_type = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : (
# 1383 "reason_parser.mly"
      (Ast_404.Parsetree.core_type)
# 37090 "reason_parser.ml"
        ) = 
# 1447 "reason_parser.mly"
  ( apply_mapper_to_type _1 reason_mapper )
# 37094 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : (
# 1385 "reason_parser.mly"
      (Ast_404.Parsetree.expression)
# 37126 "reason_parser.ml"
        ) = 
# 1452 "reason_parser.mly"
  ( apply_mapper_to_expr _1 reason_mapper )
# 37130 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_pattern = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : (
# 1387 "reason_parser.mly"
      (Ast_404.Parsetree.pattern)
# 37162 "reason_parser.ml"
        ) = 
# 1457 "reason_parser.mly"
  ( apply_mapper_to_pattern _1 reason_mapper )
# 37166 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_pattern_without_or = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_pattern = 
# 3633 "reason_parser.mly"
                       ( _1 )
# 37191 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_pattern = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_pattern = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_pattern = let _1 =
          let x = 
# 3634 "reason_parser.mly"
                                          ( mkpat(Ppat_or(_1, _3)) )
# 37231 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 37239 "reason_parser.ml"
          
        in
        
# 3634 "reason_parser.mly"
                                                                      ( _1 )
# 37245 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_option_COMMA_ = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_opt_spread_pattern__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_pattern_comma_list_extension = let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 37277 "reason_parser.ml"
         in
        
# 3866 "reason_parser.mly"
  ( match List.rev _1 with
    (* spread syntax is only allowed at the end *)
    | ((dotdotdot, p) as hd)::ps ->
      let (ps, spreadPat) = match dotdotdot with
      | Some _ -> (ps, Some p)
      | None -> (hd::ps, None)
      in
      let msg = "List pattern matches only supports one `...` spread, at the end.
Explanation: a list spread at the tail is efficient, but a spread in the middle would create new list(s); out of performance concern, our pattern matching currently guarantees to never create new intermediate data." in
      let patList = filter_raise_spread_syntax msg ps in
      (List.rev patList, spreadPat)
    | [] -> [], None
  )
# 37294 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_simple_pattern_direct_argument = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_pattern_constructor_argument = 
# 3642 "reason_parser.mly"
    ( [_1] )
# 37319 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_option_COMMA_ = Obj.magic _2 in
        let _1_inlined1 : 'tv_lseparated_nonempty_list_aux_COMMA_pattern_optional_constraint_ = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_pattern_constructor_argument = let _1 =
          let _1 =
            let x =
              let _1 = _1_inlined1 in
              let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 37369 "reason_parser.ml"
               in
              
# 3638 "reason_parser.mly"
                                                                      ( _1 )
# 37374 "reason_parser.ml"
              
            in
            
# 200 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 37380 "reason_parser.ml"
            
          in
          
# 4978 "reason_parser.mly"
                                                       ( _1 )
# 37386 "reason_parser.ml"
          
        in
        
# 3644 "reason_parser.mly"
    ( _1 )
# 37392 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_pattern = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_pattern_optional_constraint = let _1 =
          let x = 
# 3834 "reason_parser.mly"
                            ( _1 )
# 37418 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 37426 "reason_parser.ml"
          
        in
        
# 3853 "reason_parser.mly"
    (_1)
# 37432 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_core_type = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_pattern = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_pattern_optional_constraint = let _1 =
          let x = 
# 3836 "reason_parser.mly"
    ( mkpat(Ppat_constraint(_1, _3)) )
# 37472 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 37480 "reason_parser.ml"
          
        in
        
# 3853 "reason_parser.mly"
    (_1)
# 37486 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = x;
                MenhirLib.EngineTypes.startp = _startpos_x_;
                MenhirLib.EngineTypes.endp = _endpos_x_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_package_type = Obj.magic _5 in
        let _4 : 'tv_option_MODULE_ = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let x : (
# 1220 "reason_parser.mly"
       (string)
# 37534 "reason_parser.ml"
        ) = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_pattern_optional_constraint = let _1 =
          let x =
            let _2 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 37548 "reason_parser.ml"
              
            in
            
# 3845 "reason_parser.mly"
    ( mkpat(
        Ppat_constraint(
          mkpat(Ppat_unpack(_2)),
          let loc = match _4 with
          | Some _ -> mklocation _startpos__4_ _endpos__5_
          | None -> mklocation _startpos__5_ _endpos__5_
          in
          mktyp ~loc (Ptyp_package(_5)))) )
# 37561 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__5_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 37570 "reason_parser.ml"
          
        in
        
# 3853 "reason_parser.mly"
    (_1)
# 37576 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_simple_pattern = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_pattern_without_or = let _1 =
          let x = 
# 3665 "reason_parser.mly"
                   ( _1 )
# 37602 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 37610 "reason_parser.ml"
          
        in
        
# 3728 "reason_parser.mly"
    (_1)
# 37616 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x : 'tv_val_ident = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_pattern_without_or = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_pattern_without_or = let _1 =
          let x =
            let _3 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 37660 "reason_parser.ml"
              
            in
            
# 3668 "reason_parser.mly"
    ( mkpat(Ppat_alias(_1, _3)) )
# 37666 "reason_parser.ml"
            
          in
          let _startpos_x_ = _startpos__1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 37675 "reason_parser.ml"
          
        in
        
# 3728 "reason_parser.mly"
    (_1)
# 37681 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x : unit = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_pattern_without_or = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_pattern_without_or = let _1 =
          let x =
            let _3 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 37725 "reason_parser.ml"
              
            in
            
# 3671 "reason_parser.mly"
    ( expecting_pat (with_txt _3 "identifier") )
# 37731 "reason_parser.ml"
            
          in
          let _startpos_x_ = _startpos__1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 37740 "reason_parser.ml"
          
        in
        
# 3728 "reason_parser.mly"
    (_1)
# 37746 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_pattern_constructor_argument = Obj.magic _2 in
        let x : 'tv_constr_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_pattern_without_or = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 37783 "reason_parser.ml"
              
            in
            let _startpos__1_ = _startpos_x_ in
            let _endpos = _endpos__2_ in
            let _symbolstartpos = _startpos__1_ in
            
# 3688 "reason_parser.mly"
    ( match is_pattern_list_single_any _2 with
      | Some singleAnyPat ->
        mkpat (Ppat_construct(_1, Some singleAnyPat))
      | None ->
        let loc = mklocation _symbolstartpos _endpos in
        let argPattern = simple_pattern_list_to_tuple ~loc _2 in
        mkExplicitArityTuplePat (Ppat_construct(_1, Some argPattern))
    )
# 37799 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__2_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 37808 "reason_parser.ml"
          
        in
        
# 3728 "reason_parser.mly"
    (_1)
# 37814 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _2 : 'tv_simple_pattern = Obj.magic _2 in
        let _2_inlined1 : 'tv_ident = Obj.magic _2_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_pattern_without_or = let _1 =
          let x =
            let _1 =
              let _2 = _2_inlined1 in
              
# 4719 "reason_parser.mly"
                                  ( _2 )
# 37857 "reason_parser.ml"
              
            in
            
# 3697 "reason_parser.mly"
                            ( mkpat (Ppat_variant(_1, Some _2)) )
# 37863 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 37872 "reason_parser.ml"
          
        in
        
# 3728 "reason_parser.mly"
    (_1)
# 37878 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_pattern_without_or = Obj.magic _3 in
        let x : unit = Obj.magic x in
        let _1 : 'tv_pattern_without_or = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_pattern_without_or = let _1 =
          let x =
            let _2 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 37922 "reason_parser.ml"
              
            in
            
# 3700 "reason_parser.mly"
    ( raiseSyntaxErrorFromSyntaxUtils _2.loc
        ":: is not supported in Reason, please use [hd, ...tl] instead" )
# 37929 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 37938 "reason_parser.ml"
          
        in
        
# 3728 "reason_parser.mly"
    (_1)
# 37944 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x : unit = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_pattern_without_or = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_pattern_without_or = let _1 =
          let x =
            let _3 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 37988 "reason_parser.ml"
              
            in
            
# 3704 "reason_parser.mly"
    ( expecting_pat (with_txt _3 "pattern") )
# 37994 "reason_parser.ml"
            
          in
          let _startpos_x_ = _startpos__1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 38003 "reason_parser.ml"
          
        in
        
# 3728 "reason_parser.mly"
    (_1)
# 38009 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _8;
          MenhirLib.EngineTypes.startp = _startpos__8_;
          MenhirLib.EngineTypes.endp = _endpos__8_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _7;
            MenhirLib.EngineTypes.startp = _startpos__7_;
            MenhirLib.EngineTypes.endp = _endpos__7_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _6;
              MenhirLib.EngineTypes.startp = _startpos__6_;
              MenhirLib.EngineTypes.endp = _endpos__6_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _5;
                MenhirLib.EngineTypes.startp = _startpos__5_;
                MenhirLib.EngineTypes.endp = _endpos__5_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _4;
                  MenhirLib.EngineTypes.startp = _startpos__4_;
                  MenhirLib.EngineTypes.endp = _endpos__4_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _3;
                    MenhirLib.EngineTypes.startp = _startpos__3_;
                    MenhirLib.EngineTypes.endp = _endpos__3_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _2;
                      MenhirLib.EngineTypes.startp = _startpos__2_;
                      MenhirLib.EngineTypes.endp = _endpos__2_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _menhir_s;
                        MenhirLib.EngineTypes.semv = _1;
                        MenhirLib.EngineTypes.startp = _startpos__1_;
                        MenhirLib.EngineTypes.endp = _endpos__1_;
                        MenhirLib.EngineTypes.next = _menhir_stack;
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _8 : unit = Obj.magic _8 in
        let _7 : 'tv_pattern_without_or = Obj.magic _7 in
        let _6 : unit = Obj.magic _6 in
        let _5 : 'tv_pattern_without_or = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__8_ in
        let _v : 'tv_pattern_without_or = let _1 =
          let x =
            let _endpos = _endpos__8_ in
            let _symbolstartpos = _startpos__1_ in
            
# 3707 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      mkpat_cons (mkpat ~ghost:true ~loc (Ppat_tuple[_5;_7])) loc
    )
# 38089 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__8_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 38098 "reason_parser.ml"
          
        in
        
# 3728 "reason_parser.mly"
    (_1)
# 38104 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _7;
            MenhirLib.EngineTypes.startp = _startpos__7_;
            MenhirLib.EngineTypes.endp = _endpos__7_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _6;
              MenhirLib.EngineTypes.startp = _startpos__6_;
              MenhirLib.EngineTypes.endp = _endpos__6_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _5;
                MenhirLib.EngineTypes.startp = _startpos__5_;
                MenhirLib.EngineTypes.endp = _endpos__5_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _4;
                  MenhirLib.EngineTypes.startp = _startpos__4_;
                  MenhirLib.EngineTypes.endp = _endpos__4_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _3;
                    MenhirLib.EngineTypes.startp = _startpos__3_;
                    MenhirLib.EngineTypes.endp = _endpos__3_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _2;
                      MenhirLib.EngineTypes.startp = _startpos__2_;
                      MenhirLib.EngineTypes.endp = _endpos__2_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _menhir_s;
                        MenhirLib.EngineTypes.semv = x;
                        MenhirLib.EngineTypes.startp = _startpos_x_;
                        MenhirLib.EngineTypes.endp = _endpos_x_;
                        MenhirLib.EngineTypes.next = _menhir_stack;
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _7 : 'tv_pattern_without_or = Obj.magic _7 in
        let _6 : unit = Obj.magic _6 in
        let _5 : 'tv_pattern_without_or = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_pattern_without_or = let _1 =
          let x =
            let _8 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 38184 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 38193 "reason_parser.ml"
              
            in
            
# 3713 "reason_parser.mly"
    ( unclosed_pat (with_txt _1 "(") (with_txt _8 ")") )
# 38199 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos_x_inlined1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 38208 "reason_parser.ml"
          
        in
        
# 3728 "reason_parser.mly"
    (_1)
# 38214 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_pattern_without_or = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_pattern_without_or = let _1 =
          let x = 
# 3716 "reason_parser.mly"
    ( mkpat(Ppat_exception _2) )
# 38247 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 38255 "reason_parser.ml"
          
        in
        
# 3728 "reason_parser.mly"
    (_1)
# 38261 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_simple_pattern = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_pattern_without_or = let _1 =
          let x = 
# 3718 "reason_parser.mly"
                        ( mkpat(Ppat_lazy _2) )
# 38294 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 38302 "reason_parser.ml"
          
        in
        
# 3728 "reason_parser.mly"
    (_1)
# 38308 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_pattern_without_or = Obj.magic _2 in
        let _1 : 'tv_attribute = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_pattern_without_or = let _1 =
          let x = 
# 3726 "reason_parser.mly"
    ( {_2 with ppat_attributes = _1 :: _2.ppat_attributes} )
# 38341 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 38349 "reason_parser.ml"
          
        in
        
# 3728 "reason_parser.mly"
    (_1)
# 38355 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_structure = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_payload = 
# 4860 "reason_parser.mly"
                                    ( PStr _1 )
# 38380 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_signature = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_payload = 
# 4861 "reason_parser.mly"
                                    ( PSig _2 )
# 38412 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_core_type = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_payload = 
# 4862 "reason_parser.mly"
                                    ( PTyp _2 )
# 38444 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_pattern = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_payload = 
# 4863 "reason_parser.mly"
                                    ( PPat (_2, None) )
# 38476 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_expr = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_pattern = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_payload = 
# 4864 "reason_parser.mly"
                                    ( PPat (_2, Some _4) )
# 38522 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_simple_pattern_ident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_payload = let _endpos = _endpos__3_ in
        let _symbolstartpos = _startpos__1_ in
        
# 4884 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      let expr = Exp.fun_ ~loc Nolabel None _1 _3 in
      PStr([mkstrexp expr []])
    )
# 38566 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_core_type = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_poly_type = let _1 =
          let x = 
# 4205 "reason_parser.mly"
    ( _1 )
# 38592 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4912 "reason_parser.mly"
  ( {x with ptyp_loc = {x.ptyp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 38600 "reason_parser.ml"
          
        in
        
# 4208 "reason_parser.mly"
    (_1)
# 38606 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_core_type = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_preceded_QUOTE_ident__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_poly_type = let _1 =
          let x = 
# 4207 "reason_parser.mly"
    ( mktyp(Ptyp_poly(_1, _3)) )
# 38646 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4912 "reason_parser.mly"
  ( {x with ptyp_loc = {x.ptyp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 38654 "reason_parser.ml"
          
        in
        
# 4208 "reason_parser.mly"
    (_1)
# 38660 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_nonempty_list___anonymous_33_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_primitive_declaration = 
# 3908 "reason_parser.mly"
                                                                         (_1)
# 38685 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_package_type = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_protected_type = let _endpos = _endpos__2_ in
        let _symbolstartpos = _startpos__1_ in
        
# 4437 "reason_parser.mly"
                        (
      let loc = mklocation _symbolstartpos _endpos in
      { (mktyp(Ptyp_package _2)) with ptyp_loc = loc }
    )
# 38722 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_core_type = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_protected_type = 
# 4441 "reason_parser.mly"
              ( _1 )
# 38747 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_rec_flag = 
# 4724 "reason_parser.mly"
                  ( Nonrecursive )
# 38765 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_rec_flag = 
# 4725 "reason_parser.mly"
                  ( Recursive )
# 38790 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_option_COMMA_ = Obj.magic _3 in
        let _1_inlined1 : 'tv_lseparated_nonempty_list_aux_COMMA_record_label_declaration_ = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_record_declaration = let _2 =
          let _1 = _1_inlined1 in
          
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 38838 "reason_parser.ml"
          
        in
        
# 4108 "reason_parser.mly"
  ( _2 )
# 38844 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2_inlined2;
            MenhirLib.EngineTypes.startp = _startpos__2_inlined2_;
            MenhirLib.EngineTypes.endp = _endpos__2_inlined2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2_inlined1;
                MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
                MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _1_inlined2;
                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _1_inlined1;
                      MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _;
                        MenhirLib.EngineTypes.semv = _2;
                        MenhirLib.EngineTypes.startp = _startpos__2_;
                        MenhirLib.EngineTypes.endp = _endpos__2_;
                        MenhirLib.EngineTypes.next = {
                          MenhirLib.EngineTypes.state = _menhir_s;
                          MenhirLib.EngineTypes.semv = _1;
                          MenhirLib.EngineTypes.startp = _startpos__1_;
                          MenhirLib.EngineTypes.endp = _endpos__1_;
                          MenhirLib.EngineTypes.next = _menhir_stack;
                        };
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_option_COMMA_ = Obj.magic _4 in
        let _2_inlined2 : 'tv_llist_aux_preceded_COMMA_opt_spread_lbl_expr___ = Obj.magic _2_inlined2 in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
        let x : 'tv_label_longident = Obj.magic x in
        let _1_inlined2 : 'tv_option_DOTDOTDOT_ = Obj.magic _1_inlined2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _2 : 'tv_expr_optional_constraint = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_record_expr = let _3 =
          let (_startpos__1_inlined1_, _2, _1_inlined1, _1) = (_startpos__1_inlined2_, _2_inlined2, _1_inlined2, _1_inlined1) in
          let _1 =
            let _2 = _2_inlined1 in
            let x =
              let (_startpos__1_, _1) = (_startpos__1_inlined1_, _1_inlined1) in
              let _2 =
                let _1 =
                  let _1 =
                    let _endpos = _endpos_x_ in
                    let _symbolstartpos = _startpos_x_ in
                    
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 38936 "reason_parser.ml"
                    
                  in
                  
# 3525 "reason_parser.mly"
                                       ( (_1, _3) )
# 38942 "reason_parser.ml"
                  
                in
                
# 3533 "reason_parser.mly"
                        (_1)
# 38948 "reason_parser.ml"
                
              in
              let _endpos__2_ = _endpos__3_ in
              
# 4946 "reason_parser.mly"
    ( let dotdotdot = match _1 with
      | Some _ -> Some (mklocation _startpos__1_ _endpos__2_)
      | None -> None
      in
      (dotdotdot, _2)
    )
# 38960 "reason_parser.ml"
              
            in
            
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 38966 "reason_parser.ml"
            
          in
          
# 4954 "reason_parser.mly"
                                          ( _1 :: List.rev _2 )
# 38972 "reason_parser.ml"
          
        in
        
# 3496 "reason_parser.mly"
    ( let exprList = filter_raise_spread_syntax record_exp_spread_msg _3
      in (Some _2, exprList)
    )
# 38980 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _1_inlined2;
                MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
                MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _1_inlined1;
                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _2;
                    MenhirLib.EngineTypes.startp = _startpos__2_;
                    MenhirLib.EngineTypes.endp = _endpos__2_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _menhir_s;
                      MenhirLib.EngineTypes.semv = _1;
                      MenhirLib.EngineTypes.startp = _startpos__1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_;
                      MenhirLib.EngineTypes.next = _menhir_stack;
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_option_COMMA_ = Obj.magic _4 in
        let _2_inlined1 : 'tv_llist_aux_preceded_COMMA_opt_spread_lbl_expr___ = Obj.magic _2_inlined1 in
        let x : 'tv_label_longident = Obj.magic x in
        let _1_inlined2 : 'tv_option_DOTDOTDOT_ = Obj.magic _1_inlined2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _2 : 'tv_expr_optional_constraint = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_record_expr = let _3 =
          let (_startpos__1_inlined1_, _2, _1_inlined1, _1) = (_startpos__1_inlined2_, _2_inlined1, _1_inlined2, _1_inlined1) in
          let _1 =
            let x =
              let (_startpos__1_, _1) = (_startpos__1_inlined1_, _1_inlined1) in
              let _2 =
                let _1 =
                  let _1 =
                    let _endpos = _endpos_x_ in
                    let _symbolstartpos = _startpos_x_ in
                    
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 39057 "reason_parser.ml"
                    
                  in
                  
# 3529 "reason_parser.mly"
                            ( (_1, exp_of_label _1) )
# 39063 "reason_parser.ml"
                  
                in
                
# 3534 "reason_parser.mly"
                    (_1)
# 39069 "reason_parser.ml"
                
              in
              let _endpos__2_ = _endpos_x_ in
              
# 4946 "reason_parser.mly"
    ( let dotdotdot = match _1 with
      | Some _ -> Some (mklocation _startpos__1_ _endpos__2_)
      | None -> None
      in
      (dotdotdot, _2)
    )
# 39081 "reason_parser.ml"
              
            in
            
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 39087 "reason_parser.ml"
            
          in
          
# 4954 "reason_parser.mly"
                                          ( _1 :: List.rev _2 )
# 39093 "reason_parser.ml"
          
        in
        
# 3496 "reason_parser.mly"
    ( let exprList = filter_raise_spread_syntax record_exp_spread_msg _3
      in (Some _2, exprList)
    )
# 39101 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_option_COMMA_ = Obj.magic _5 in
        let _1_inlined1 : 'tv_lseparated_nonempty_list_aux_COMMA_opt_spread_lbl_expr__ = Obj.magic _1_inlined1 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_expr_optional_constraint = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_record_expr = let _4 =
          let _1 = _1_inlined1 in
          
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 39156 "reason_parser.ml"
          
        in
        
# 3502 "reason_parser.mly"
    ( let loc = mklocation _startpos__3_ _endpos__3_ in
      raise_record_trailing_semi_error loc
    )
# 39164 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2_inlined2;
            MenhirLib.EngineTypes.startp = _startpos__2_inlined2_;
            MenhirLib.EngineTypes.endp = _endpos__2_inlined2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2_inlined1;
                MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
                MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _1_inlined2;
                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _1_inlined1;
                      MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _;
                        MenhirLib.EngineTypes.semv = _2;
                        MenhirLib.EngineTypes.startp = _startpos__2_;
                        MenhirLib.EngineTypes.endp = _endpos__2_;
                        MenhirLib.EngineTypes.next = {
                          MenhirLib.EngineTypes.state = _menhir_s;
                          MenhirLib.EngineTypes.semv = _1;
                          MenhirLib.EngineTypes.startp = _startpos__1_;
                          MenhirLib.EngineTypes.endp = _endpos__1_;
                          MenhirLib.EngineTypes.next = _menhir_stack;
                        };
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _2_inlined2 : 'tv_llist_aux_preceded_COMMA_opt_spread_lbl_expr___ = Obj.magic _2_inlined2 in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
        let x : 'tv_label_longident = Obj.magic x in
        let _1_inlined2 : 'tv_option_DOTDOTDOT_ = Obj.magic _1_inlined2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _2 : 'tv_expr_optional_constraint = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_record_expr = let _3 =
          let (_startpos__1_inlined1_, _2, _1_inlined1, _1) = (_startpos__1_inlined2_, _2_inlined2, _1_inlined2, _1_inlined1) in
          let _1 =
            let _2 = _2_inlined1 in
            let x =
              let (_startpos__1_, _1) = (_startpos__1_inlined1_, _1_inlined1) in
              let _2 =
                let _1 =
                  let _1 =
                    let _endpos = _endpos_x_ in
                    let _symbolstartpos = _startpos_x_ in
                    
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 39256 "reason_parser.ml"
                    
                  in
                  
# 3525 "reason_parser.mly"
                                       ( (_1, _3) )
# 39262 "reason_parser.ml"
                  
                in
                
# 3533 "reason_parser.mly"
                        (_1)
# 39268 "reason_parser.ml"
                
              in
              let _endpos__2_ = _endpos__3_ in
              
# 4946 "reason_parser.mly"
    ( let dotdotdot = match _1 with
      | Some _ -> Some (mklocation _startpos__1_ _endpos__2_)
      | None -> None
      in
      (dotdotdot, _2)
    )
# 39280 "reason_parser.ml"
              
            in
            
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 39286 "reason_parser.ml"
            
          in
          
# 4954 "reason_parser.mly"
                                          ( _1 :: List.rev _2 )
# 39292 "reason_parser.ml"
          
        in
        
# 3508 "reason_parser.mly"
    ( let loc = mklocation _startpos__4_ _endpos__4_ in
      raise_record_trailing_semi_error loc
    )
# 39300 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _1_inlined2;
                MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
                MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _1_inlined1;
                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _2;
                    MenhirLib.EngineTypes.startp = _startpos__2_;
                    MenhirLib.EngineTypes.endp = _endpos__2_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _menhir_s;
                      MenhirLib.EngineTypes.semv = _1;
                      MenhirLib.EngineTypes.startp = _startpos__1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_;
                      MenhirLib.EngineTypes.next = _menhir_stack;
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _2_inlined1 : 'tv_llist_aux_preceded_COMMA_opt_spread_lbl_expr___ = Obj.magic _2_inlined1 in
        let x : 'tv_label_longident = Obj.magic x in
        let _1_inlined2 : 'tv_option_DOTDOTDOT_ = Obj.magic _1_inlined2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _2 : 'tv_expr_optional_constraint = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_record_expr = let _3 =
          let (_startpos__1_inlined1_, _2, _1_inlined1, _1) = (_startpos__1_inlined2_, _2_inlined1, _1_inlined2, _1_inlined1) in
          let _1 =
            let x =
              let (_startpos__1_, _1) = (_startpos__1_inlined1_, _1_inlined1) in
              let _2 =
                let _1 =
                  let _1 =
                    let _endpos = _endpos_x_ in
                    let _symbolstartpos = _startpos_x_ in
                    
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 39377 "reason_parser.ml"
                    
                  in
                  
# 3529 "reason_parser.mly"
                            ( (_1, exp_of_label _1) )
# 39383 "reason_parser.ml"
                  
                in
                
# 3534 "reason_parser.mly"
                    (_1)
# 39389 "reason_parser.ml"
                
              in
              let _endpos__2_ = _endpos_x_ in
              
# 4946 "reason_parser.mly"
    ( let dotdotdot = match _1 with
      | Some _ -> Some (mklocation _startpos__1_ _endpos__2_)
      | None -> None
      in
      (dotdotdot, _2)
    )
# 39401 "reason_parser.ml"
              
            in
            
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 39407 "reason_parser.ml"
            
          in
          
# 4954 "reason_parser.mly"
                                          ( _1 :: List.rev _2 )
# 39413 "reason_parser.ml"
          
        in
        
# 3508 "reason_parser.mly"
    ( let loc = mklocation _startpos__4_ _endpos__4_ in
      raise_record_trailing_semi_error loc
    )
# 39421 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = x;
                MenhirLib.EngineTypes.startp = _startpos_x_;
                MenhirLib.EngineTypes.endp = _endpos_x_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _2 : 'tv_option_COMMA_ = Obj.magic _2 in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
        let x : 'tv_label_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_record_expr = let _1 =
          let _2 = _2_inlined1 in
          let _1 =
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 39472 "reason_parser.ml"
            
          in
          
# 3525 "reason_parser.mly"
                                       ( (_1, _3) )
# 39478 "reason_parser.ml"
          
        in
        
# 3512 "reason_parser.mly"
    ( (None, [_1]) )
# 39484 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = x;
                MenhirLib.EngineTypes.startp = _startpos_x_;
                MenhirLib.EngineTypes.endp = _endpos_x_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _2 : unit = Obj.magic _2 in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
        let x : 'tv_label_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_record_expr = let _1 =
          let _2 = _2_inlined1 in
          let _1 =
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 39535 "reason_parser.ml"
            
          in
          
# 3525 "reason_parser.mly"
                                       ( (_1, _3) )
# 39541 "reason_parser.ml"
          
        in
        
# 3514 "reason_parser.mly"
    ( let loc = mklocation _startpos__2_ _endpos__2_ in
      raise_record_trailing_semi_error loc )
# 39548 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3_inlined2;
              MenhirLib.EngineTypes.startp = _startpos__3_inlined2_;
              MenhirLib.EngineTypes.endp = _endpos__3_inlined2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2_inlined2;
                MenhirLib.EngineTypes.startp = _startpos__2_inlined2_;
                MenhirLib.EngineTypes.endp = _endpos__2_inlined2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = x_inlined1;
                  MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
                  MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _1_inlined1;
                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _1;
                      MenhirLib.EngineTypes.startp = _startpos__1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _;
                        MenhirLib.EngineTypes.semv = _3_inlined1;
                        MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
                        MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
                        MenhirLib.EngineTypes.next = {
                          MenhirLib.EngineTypes.state = _;
                          MenhirLib.EngineTypes.semv = _2_inlined1;
                          MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
                          MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
                          MenhirLib.EngineTypes.next = {
                            MenhirLib.EngineTypes.state = _menhir_s;
                            MenhirLib.EngineTypes.semv = x;
                            MenhirLib.EngineTypes.startp = _startpos_x_;
                            MenhirLib.EngineTypes.endp = _endpos_x_;
                            MenhirLib.EngineTypes.next = _menhir_stack;
                          };
                        };
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_option_COMMA_ = Obj.magic _3 in
        let _2 : 'tv_llist_aux_preceded_COMMA_opt_spread_lbl_expr___ = Obj.magic _2 in
        let _3_inlined2 : 'tv_expr = Obj.magic _3_inlined2 in
        let _2_inlined2 : unit = Obj.magic _2_inlined2 in
        let x_inlined1 : 'tv_label_longident = Obj.magic x_inlined1 in
        let _1_inlined1 : 'tv_option_DOTDOTDOT_ = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _3_inlined1 : 'tv_expr = Obj.magic _3_inlined1 in
        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
        let x : 'tv_label_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_record_expr = let _2 =
          let (_endpos_x_, _startpos_x_, _endpos__3_, _3, _2_inlined1, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, _endpos__3_inlined2_, _3_inlined2, _2_inlined2, x_inlined1) in
          let _1 =
            let _2 = _2_inlined1 in
            let x =
              let (_startpos__1_, _1) = (_startpos__1_inlined1_, _1_inlined1) in
              let _2 =
                let _1 =
                  let _1 =
                    let _endpos = _endpos_x_ in
                    let _symbolstartpos = _startpos_x_ in
                    
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 39647 "reason_parser.ml"
                    
                  in
                  
# 3525 "reason_parser.mly"
                                       ( (_1, _3) )
# 39653 "reason_parser.ml"
                  
                in
                
# 3533 "reason_parser.mly"
                        (_1)
# 39659 "reason_parser.ml"
                
              in
              let _endpos__2_ = _endpos__3_ in
              
# 4946 "reason_parser.mly"
    ( let dotdotdot = match _1 with
      | Some _ -> Some (mklocation _startpos__1_ _endpos__2_)
      | None -> None
      in
      (dotdotdot, _2)
    )
# 39671 "reason_parser.ml"
              
            in
            
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 39677 "reason_parser.ml"
            
          in
          
# 4954 "reason_parser.mly"
                                          ( _1 :: List.rev _2 )
# 39683 "reason_parser.ml"
          
        in
        let _1 =
          let (_3, _2) = (_3_inlined1, _2_inlined1) in
          let _1 =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 39695 "reason_parser.ml"
              
            in
            
# 3525 "reason_parser.mly"
                                       ( (_1, _3) )
# 39701 "reason_parser.ml"
            
          in
          
# 3533 "reason_parser.mly"
                        (_1)
# 39707 "reason_parser.ml"
          
        in
        
# 3517 "reason_parser.mly"
    ( let exprList = filter_raise_spread_syntax record_exp_spread_msg _2 in
      (None, _1 :: exprList) )
# 39714 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x_inlined1;
              MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _1_inlined1;
                MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _3_inlined1;
                    MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
                    MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _2_inlined1;
                      MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
                      MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _menhir_s;
                        MenhirLib.EngineTypes.semv = x;
                        MenhirLib.EngineTypes.startp = _startpos_x_;
                        MenhirLib.EngineTypes.endp = _endpos_x_;
                        MenhirLib.EngineTypes.next = _menhir_stack;
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_option_COMMA_ = Obj.magic _3 in
        let _2 : 'tv_llist_aux_preceded_COMMA_opt_spread_lbl_expr___ = Obj.magic _2 in
        let x_inlined1 : 'tv_label_longident = Obj.magic x_inlined1 in
        let _1_inlined1 : 'tv_option_DOTDOTDOT_ = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _3_inlined1 : 'tv_expr = Obj.magic _3_inlined1 in
        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
        let x : 'tv_label_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_record_expr = let _2 =
          let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
          let _1 =
            let x =
              let (_startpos__1_, _1) = (_startpos__1_inlined1_, _1_inlined1) in
              let _2 =
                let _1 =
                  let _1 =
                    let _endpos = _endpos_x_ in
                    let _symbolstartpos = _startpos_x_ in
                    
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 39798 "reason_parser.ml"
                    
                  in
                  
# 3529 "reason_parser.mly"
                            ( (_1, exp_of_label _1) )
# 39804 "reason_parser.ml"
                  
                in
                
# 3534 "reason_parser.mly"
                    (_1)
# 39810 "reason_parser.ml"
                
              in
              let _endpos__2_ = _endpos_x_ in
              
# 4946 "reason_parser.mly"
    ( let dotdotdot = match _1 with
      | Some _ -> Some (mklocation _startpos__1_ _endpos__2_)
      | None -> None
      in
      (dotdotdot, _2)
    )
# 39822 "reason_parser.ml"
              
            in
            
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 39828 "reason_parser.ml"
            
          in
          
# 4954 "reason_parser.mly"
                                          ( _1 :: List.rev _2 )
# 39834 "reason_parser.ml"
          
        in
        let _1 =
          let (_3, _2) = (_3_inlined1, _2_inlined1) in
          let _1 =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 39846 "reason_parser.ml"
              
            in
            
# 3525 "reason_parser.mly"
                                       ( (_1, _3) )
# 39852 "reason_parser.ml"
            
          in
          
# 3533 "reason_parser.mly"
                        (_1)
# 39858 "reason_parser.ml"
          
        in
        
# 3517 "reason_parser.mly"
    ( let exprList = filter_raise_spread_syntax record_exp_spread_msg _2 in
      (None, _1 :: exprList) )
# 39865 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2_inlined1;
                MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
                MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = x_inlined1;
                  MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
                  MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _1_inlined1;
                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _1;
                      MenhirLib.EngineTypes.startp = _startpos__1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _menhir_s;
                        MenhirLib.EngineTypes.semv = x;
                        MenhirLib.EngineTypes.startp = _startpos_x_;
                        MenhirLib.EngineTypes.endp = _endpos_x_;
                        MenhirLib.EngineTypes.next = _menhir_stack;
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_option_COMMA_ = Obj.magic _3 in
        let _2 : 'tv_llist_aux_preceded_COMMA_opt_spread_lbl_expr___ = Obj.magic _2 in
        let _3_inlined1 : 'tv_expr = Obj.magic _3_inlined1 in
        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
        let x_inlined1 : 'tv_label_longident = Obj.magic x_inlined1 in
        let _1_inlined1 : 'tv_option_DOTDOTDOT_ = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let x : 'tv_label_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_record_expr = let _2 =
          let (_endpos_x_, _startpos_x_, _endpos__3_, _3, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, _endpos__3_inlined1_, _3_inlined1, x_inlined1) in
          let _1 =
            let _2 = _2_inlined1 in
            let x =
              let (_startpos__1_, _1) = (_startpos__1_inlined1_, _1_inlined1) in
              let _2 =
                let _1 =
                  let _1 =
                    let _endpos = _endpos_x_ in
                    let _symbolstartpos = _startpos_x_ in
                    
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 39950 "reason_parser.ml"
                    
                  in
                  
# 3525 "reason_parser.mly"
                                       ( (_1, _3) )
# 39956 "reason_parser.ml"
                  
                in
                
# 3533 "reason_parser.mly"
                        (_1)
# 39962 "reason_parser.ml"
                
              in
              let _endpos__2_ = _endpos__3_ in
              
# 4946 "reason_parser.mly"
    ( let dotdotdot = match _1 with
      | Some _ -> Some (mklocation _startpos__1_ _endpos__2_)
      | None -> None
      in
      (dotdotdot, _2)
    )
# 39974 "reason_parser.ml"
              
            in
            
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 39980 "reason_parser.ml"
            
          in
          
# 4954 "reason_parser.mly"
                                          ( _1 :: List.rev _2 )
# 39986 "reason_parser.ml"
          
        in
        let _1 =
          let _1 =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 39997 "reason_parser.ml"
              
            in
            
# 3529 "reason_parser.mly"
                            ( (_1, exp_of_label _1) )
# 40003 "reason_parser.ml"
            
          in
          
# 3534 "reason_parser.mly"
                    (_1)
# 40009 "reason_parser.ml"
          
        in
        
# 3517 "reason_parser.mly"
    ( let exprList = filter_raise_spread_syntax record_exp_spread_msg _2 in
      (None, _1 :: exprList) )
# 40016 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x_inlined1;
              MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _1_inlined1;
                MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = x;
                    MenhirLib.EngineTypes.startp = _startpos_x_;
                    MenhirLib.EngineTypes.endp = _endpos_x_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_option_COMMA_ = Obj.magic _3 in
        let _2 : 'tv_llist_aux_preceded_COMMA_opt_spread_lbl_expr___ = Obj.magic _2 in
        let x_inlined1 : 'tv_label_longident = Obj.magic x_inlined1 in
        let _1_inlined1 : 'tv_option_DOTDOTDOT_ = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let x : 'tv_label_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_record_expr = let _2 =
          let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
          let _1 =
            let x =
              let (_startpos__1_, _1) = (_startpos__1_inlined1_, _1_inlined1) in
              let _2 =
                let _1 =
                  let _1 =
                    let _endpos = _endpos_x_ in
                    let _symbolstartpos = _startpos_x_ in
                    
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 40086 "reason_parser.ml"
                    
                  in
                  
# 3529 "reason_parser.mly"
                            ( (_1, exp_of_label _1) )
# 40092 "reason_parser.ml"
                  
                in
                
# 3534 "reason_parser.mly"
                    (_1)
# 40098 "reason_parser.ml"
                
              in
              let _endpos__2_ = _endpos_x_ in
              
# 4946 "reason_parser.mly"
    ( let dotdotdot = match _1 with
      | Some _ -> Some (mklocation _startpos__1_ _endpos__2_)
      | None -> None
      in
      (dotdotdot, _2)
    )
# 40110 "reason_parser.ml"
              
            in
            
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 40116 "reason_parser.ml"
            
          in
          
# 4954 "reason_parser.mly"
                                          ( _1 :: List.rev _2 )
# 40122 "reason_parser.ml"
          
        in
        let _1 =
          let _1 =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 40133 "reason_parser.ml"
              
            in
            
# 3529 "reason_parser.mly"
                            ( (_1, exp_of_label _1) )
# 40139 "reason_parser.ml"
            
          in
          
# 3534 "reason_parser.mly"
                    (_1)
# 40145 "reason_parser.ml"
          
        in
        
# 3517 "reason_parser.mly"
    ( let exprList = filter_raise_spread_syntax record_exp_spread_msg _2 in
      (None, _1 :: exprList) )
# 40152 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3_inlined2;
              MenhirLib.EngineTypes.startp = _startpos__3_inlined2_;
              MenhirLib.EngineTypes.endp = _endpos__3_inlined2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2_inlined2;
                MenhirLib.EngineTypes.startp = _startpos__2_inlined2_;
                MenhirLib.EngineTypes.endp = _endpos__2_inlined2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = x_inlined1;
                  MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
                  MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _1_inlined1;
                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _1;
                      MenhirLib.EngineTypes.startp = _startpos__1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _;
                        MenhirLib.EngineTypes.semv = _3_inlined1;
                        MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
                        MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
                        MenhirLib.EngineTypes.next = {
                          MenhirLib.EngineTypes.state = _;
                          MenhirLib.EngineTypes.semv = _2_inlined1;
                          MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
                          MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
                          MenhirLib.EngineTypes.next = {
                            MenhirLib.EngineTypes.state = _menhir_s;
                            MenhirLib.EngineTypes.semv = x;
                            MenhirLib.EngineTypes.startp = _startpos_x_;
                            MenhirLib.EngineTypes.endp = _endpos_x_;
                            MenhirLib.EngineTypes.next = _menhir_stack;
                          };
                        };
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_llist_aux_preceded_COMMA_opt_spread_lbl_expr___ = Obj.magic _2 in
        let _3_inlined2 : 'tv_expr = Obj.magic _3_inlined2 in
        let _2_inlined2 : unit = Obj.magic _2_inlined2 in
        let x_inlined1 : 'tv_label_longident = Obj.magic x_inlined1 in
        let _1_inlined1 : 'tv_option_DOTDOTDOT_ = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _3_inlined1 : 'tv_expr = Obj.magic _3_inlined1 in
        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
        let x : 'tv_label_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_record_expr = let _2 =
          let (_endpos_x_, _startpos_x_, _endpos__3_, _3, _2_inlined1, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, _endpos__3_inlined2_, _3_inlined2, _2_inlined2, x_inlined1) in
          let _1 =
            let _2 = _2_inlined1 in
            let x =
              let (_startpos__1_, _1) = (_startpos__1_inlined1_, _1_inlined1) in
              let _2 =
                let _1 =
                  let _1 =
                    let _endpos = _endpos_x_ in
                    let _symbolstartpos = _startpos_x_ in
                    
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 40251 "reason_parser.ml"
                    
                  in
                  
# 3525 "reason_parser.mly"
                                       ( (_1, _3) )
# 40257 "reason_parser.ml"
                  
                in
                
# 3533 "reason_parser.mly"
                        (_1)
# 40263 "reason_parser.ml"
                
              in
              let _endpos__2_ = _endpos__3_ in
              
# 4946 "reason_parser.mly"
    ( let dotdotdot = match _1 with
      | Some _ -> Some (mklocation _startpos__1_ _endpos__2_)
      | None -> None
      in
      (dotdotdot, _2)
    )
# 40275 "reason_parser.ml"
              
            in
            
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 40281 "reason_parser.ml"
            
          in
          
# 4954 "reason_parser.mly"
                                          ( _1 :: List.rev _2 )
# 40287 "reason_parser.ml"
          
        in
        let _1 =
          let (_3, _2) = (_3_inlined1, _2_inlined1) in
          let _1 =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 40299 "reason_parser.ml"
              
            in
            
# 3525 "reason_parser.mly"
                                       ( (_1, _3) )
# 40305 "reason_parser.ml"
            
          in
          
# 3533 "reason_parser.mly"
                        (_1)
# 40311 "reason_parser.ml"
          
        in
        
# 3520 "reason_parser.mly"
    ( let loc = mklocation _startpos__3_ _endpos__3_ in
      raise_record_trailing_semi_error loc )
# 40318 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x_inlined1;
              MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _1_inlined1;
                MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _3_inlined1;
                    MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
                    MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _2_inlined1;
                      MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
                      MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _menhir_s;
                        MenhirLib.EngineTypes.semv = x;
                        MenhirLib.EngineTypes.startp = _startpos_x_;
                        MenhirLib.EngineTypes.endp = _endpos_x_;
                        MenhirLib.EngineTypes.next = _menhir_stack;
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_llist_aux_preceded_COMMA_opt_spread_lbl_expr___ = Obj.magic _2 in
        let x_inlined1 : 'tv_label_longident = Obj.magic x_inlined1 in
        let _1_inlined1 : 'tv_option_DOTDOTDOT_ = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _3_inlined1 : 'tv_expr = Obj.magic _3_inlined1 in
        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
        let x : 'tv_label_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_record_expr = let _2 =
          let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
          let _1 =
            let x =
              let (_startpos__1_, _1) = (_startpos__1_inlined1_, _1_inlined1) in
              let _2 =
                let _1 =
                  let _1 =
                    let _endpos = _endpos_x_ in
                    let _symbolstartpos = _startpos_x_ in
                    
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 40402 "reason_parser.ml"
                    
                  in
                  
# 3529 "reason_parser.mly"
                            ( (_1, exp_of_label _1) )
# 40408 "reason_parser.ml"
                  
                in
                
# 3534 "reason_parser.mly"
                    (_1)
# 40414 "reason_parser.ml"
                
              in
              let _endpos__2_ = _endpos_x_ in
              
# 4946 "reason_parser.mly"
    ( let dotdotdot = match _1 with
      | Some _ -> Some (mklocation _startpos__1_ _endpos__2_)
      | None -> None
      in
      (dotdotdot, _2)
    )
# 40426 "reason_parser.ml"
              
            in
            
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 40432 "reason_parser.ml"
            
          in
          
# 4954 "reason_parser.mly"
                                          ( _1 :: List.rev _2 )
# 40438 "reason_parser.ml"
          
        in
        let _1 =
          let (_3, _2) = (_3_inlined1, _2_inlined1) in
          let _1 =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 40450 "reason_parser.ml"
              
            in
            
# 3525 "reason_parser.mly"
                                       ( (_1, _3) )
# 40456 "reason_parser.ml"
            
          in
          
# 3533 "reason_parser.mly"
                        (_1)
# 40462 "reason_parser.ml"
          
        in
        
# 3520 "reason_parser.mly"
    ( let loc = mklocation _startpos__3_ _endpos__3_ in
      raise_record_trailing_semi_error loc )
# 40469 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2_inlined1;
                MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
                MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = x_inlined1;
                  MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
                  MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _1_inlined1;
                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _1;
                      MenhirLib.EngineTypes.startp = _startpos__1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _menhir_s;
                        MenhirLib.EngineTypes.semv = x;
                        MenhirLib.EngineTypes.startp = _startpos_x_;
                        MenhirLib.EngineTypes.endp = _endpos_x_;
                        MenhirLib.EngineTypes.next = _menhir_stack;
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_llist_aux_preceded_COMMA_opt_spread_lbl_expr___ = Obj.magic _2 in
        let _3_inlined1 : 'tv_expr = Obj.magic _3_inlined1 in
        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
        let x_inlined1 : 'tv_label_longident = Obj.magic x_inlined1 in
        let _1_inlined1 : 'tv_option_DOTDOTDOT_ = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let x : 'tv_label_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_record_expr = let _2 =
          let (_endpos_x_, _startpos_x_, _endpos__3_, _3, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, _endpos__3_inlined1_, _3_inlined1, x_inlined1) in
          let _1 =
            let _2 = _2_inlined1 in
            let x =
              let (_startpos__1_, _1) = (_startpos__1_inlined1_, _1_inlined1) in
              let _2 =
                let _1 =
                  let _1 =
                    let _endpos = _endpos_x_ in
                    let _symbolstartpos = _startpos_x_ in
                    
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 40554 "reason_parser.ml"
                    
                  in
                  
# 3525 "reason_parser.mly"
                                       ( (_1, _3) )
# 40560 "reason_parser.ml"
                  
                in
                
# 3533 "reason_parser.mly"
                        (_1)
# 40566 "reason_parser.ml"
                
              in
              let _endpos__2_ = _endpos__3_ in
              
# 4946 "reason_parser.mly"
    ( let dotdotdot = match _1 with
      | Some _ -> Some (mklocation _startpos__1_ _endpos__2_)
      | None -> None
      in
      (dotdotdot, _2)
    )
# 40578 "reason_parser.ml"
              
            in
            
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 40584 "reason_parser.ml"
            
          in
          
# 4954 "reason_parser.mly"
                                          ( _1 :: List.rev _2 )
# 40590 "reason_parser.ml"
          
        in
        let _1 =
          let _1 =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 40601 "reason_parser.ml"
              
            in
            
# 3529 "reason_parser.mly"
                            ( (_1, exp_of_label _1) )
# 40607 "reason_parser.ml"
            
          in
          
# 3534 "reason_parser.mly"
                    (_1)
# 40613 "reason_parser.ml"
          
        in
        
# 3520 "reason_parser.mly"
    ( let loc = mklocation _startpos__3_ _endpos__3_ in
      raise_record_trailing_semi_error loc )
# 40620 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x_inlined1;
              MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _1_inlined1;
                MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = x;
                    MenhirLib.EngineTypes.startp = _startpos_x_;
                    MenhirLib.EngineTypes.endp = _endpos_x_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_llist_aux_preceded_COMMA_opt_spread_lbl_expr___ = Obj.magic _2 in
        let x_inlined1 : 'tv_label_longident = Obj.magic x_inlined1 in
        let _1_inlined1 : 'tv_option_DOTDOTDOT_ = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let x : 'tv_label_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_record_expr = let _2 =
          let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
          let _1 =
            let x =
              let (_startpos__1_, _1) = (_startpos__1_inlined1_, _1_inlined1) in
              let _2 =
                let _1 =
                  let _1 =
                    let _endpos = _endpos_x_ in
                    let _symbolstartpos = _startpos_x_ in
                    
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 40690 "reason_parser.ml"
                    
                  in
                  
# 3529 "reason_parser.mly"
                            ( (_1, exp_of_label _1) )
# 40696 "reason_parser.ml"
                  
                in
                
# 3534 "reason_parser.mly"
                    (_1)
# 40702 "reason_parser.ml"
                
              in
              let _endpos__2_ = _endpos_x_ in
              
# 4946 "reason_parser.mly"
    ( let dotdotdot = match _1 with
      | Some _ -> Some (mklocation _startpos__1_ _endpos__2_)
      | None -> None
      in
      (dotdotdot, _2)
    )
# 40714 "reason_parser.ml"
              
            in
            
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 40720 "reason_parser.ml"
            
          in
          
# 4954 "reason_parser.mly"
                                          ( _1 :: List.rev _2 )
# 40726 "reason_parser.ml"
          
        in
        let _1 =
          let _1 =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 40737 "reason_parser.ml"
              
            in
            
# 3529 "reason_parser.mly"
                            ( (_1, exp_of_label _1) )
# 40743 "reason_parser.ml"
            
          in
          
# 3534 "reason_parser.mly"
                    (_1)
# 40749 "reason_parser.ml"
          
        in
        
# 3520 "reason_parser.mly"
    ( let loc = mklocation _startpos__3_ _endpos__3_ in
      raise_record_trailing_semi_error loc )
# 40756 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_string_literal_exprs_maybe_punned = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_expr_optional_constraint = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_record_expr_with_string_keys = 
# 3539 "reason_parser.mly"
    ( (Some _2, _4) )
# 40802 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_option_COMMA_ = Obj.magic _4 in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : (
# 1212 "reason_parser.mly"
       (string * string option * string option)
# 40844 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_record_expr_with_string_keys = let _endpos = _endpos__4_ in
        let _symbolstartpos = _startpos__1_ in
        
# 3541 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      let (s, _, _) = _1 in
      let lident_lident_loc = mkloc (Lident s) loc in
      (None, [(lident_lident_loc, _3)])
    )
# 40858 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_string_literal_exprs_maybe_punned = Obj.magic _2 in
        let _1 : 'tv_string_literal_expr_maybe_punned_with_comma = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_record_expr_with_string_keys = 
# 3546 "reason_parser.mly"
                                                                                  (
    (None, _1 :: _2)
  )
# 40892 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : (
# 1173 "reason_parser.mly"
       (string)
# 40919 "reason_parser.ml"
        ) = Obj.magic x in
        let _2 : 'tv_mutable_flag = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_record_label_declaration = let _3 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 40931 "reason_parser.ml"
          
        in
        let (_endpos__3_, _startpos__3_) = (_endpos_x_, _startpos_x_) in
        let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 40938 "reason_parser.ml"
         in
        let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          if _startpos__2_ != _endpos__2_ then
            _startpos__2_
          else
            _startpos__3_ in
        
# 4097 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      Type.field _3 (mkct _3) ~attrs:_1 ~mut:_2 ~loc
    )
# 40954 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x : (
# 1173 "reason_parser.mly"
       (string)
# 40987 "reason_parser.ml"
        ) = Obj.magic x in
        let _2 : 'tv_mutable_flag = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_record_label_declaration = let _3 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 41000 "reason_parser.ml"
          
        in
        let (_endpos__3_, _startpos__3_) = (_endpos_x_, _startpos_x_) in
        let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 41008 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 41013 "reason_parser.ml"
          
        in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          if _startpos__2_ != _endpos__2_ then
            _startpos__2_
          else
            _startpos__3_ in
        
# 4097 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      Type.field _3 (mkct _3) ~attrs:_1 ~mut:_2 ~loc
    )
# 41029 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_poly_type = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let x : (
# 1173 "reason_parser.mly"
       (string)
# 41070 "reason_parser.ml"
        ) = Obj.magic x in
        let _2 : 'tv_mutable_flag = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_record_label_declaration = let _3 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 41082 "reason_parser.ml"
          
        in
        let _startpos__3_ = _startpos_x_ in
        let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 41089 "reason_parser.ml"
         in
        let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
        let _endpos = _endpos__5_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          if _startpos__2_ != _endpos__2_ then
            _startpos__2_
          else
            _startpos__3_ in
        
# 4101 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      Type.field _3 _5 ~attrs:_1 ~mut:_2 ~loc
    )
# 41105 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_poly_type = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let x : (
# 1173 "reason_parser.mly"
       (string)
# 41152 "reason_parser.ml"
        ) = Obj.magic x in
        let _2 : 'tv_mutable_flag = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_record_label_declaration = let _3 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 41165 "reason_parser.ml"
          
        in
        let _startpos__3_ = _startpos_x_ in
        let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 41173 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 41178 "reason_parser.ml"
          
        in
        let _endpos = _endpos__5_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          if _startpos__2_ != _endpos__2_ then
            _startpos__2_
          else
            _startpos__3_ in
        
# 4101 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      Type.field _3 _5 ~attrs:_1 ~mut:_2 ~loc
    )
# 41194 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_tag_field = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_row_field = 
# 4531 "reason_parser.mly"
                          ( _1 )
# 41219 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_non_arrowed_core_type = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_row_field = 
# 4532 "reason_parser.mly"
                          ( Rinherit _1 )
# 41244 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_list_bar_row_field_ = Obj.magic _2 in
        let _1 : 'tv_row_field = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_row_field_list = 
# 4526 "reason_parser.mly"
                             ( _1 :: _2 )
# 41276 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_list_bar_row_field_ = Obj.magic _2 in
        let _1 : 'tv_bar_row_field = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_row_field_list = 
# 4527 "reason_parser.mly"
                                 ( _1 :: _2 )
# 41308 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : 'tv_non_arrowed_simple_core_types = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_separated_nonempty_list_AMPERSAND_non_arrowed_simple_core_types_ = 
# 241 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( [ x ] )
# 41333 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = xs;
          MenhirLib.EngineTypes.startp = _startpos_xs_;
          MenhirLib.EngineTypes.endp = _endpos_xs_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let xs : 'tv_separated_nonempty_list_AMPERSAND_non_arrowed_simple_core_types_ = Obj.magic xs in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_non_arrowed_simple_core_types = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_xs_ in
        let _v : 'tv_separated_nonempty_list_AMPERSAND_non_arrowed_simple_core_types_ = 
# 243 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x :: xs )
# 41372 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_seq_expr_no_seq = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_seq_expr = let _1 =
          let x = 
# 2520 "reason_parser.mly"
    ( _1 )
# 41398 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 41406 "reason_parser.ml"
          
        in
        
# 2528 "reason_parser.mly"
    ( _1 )
# 41412 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : 'tv_seq_expr_no_seq = Obj.magic x in
        let _1 : 'tv_item_extension_sugar = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_seq_expr = let _1 =
          let x =
            let _2 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 41449 "reason_parser.ml"
              
            in
            
# 2522 "reason_parser.mly"
    ( expression_extension _1 _2 )
# 41455 "reason_parser.ml"
            
          in
          let _startpos_x_ = _startpos__1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 41464 "reason_parser.ml"
          
        in
        
# 2528 "reason_parser.mly"
    ( _1 )
# 41470 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_seq_expr = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_seq_expr = let _1 =
          let x = 
# 2524 "reason_parser.mly"
    ( mkexp (Pexp_sequence(_1, _3)) )
# 41510 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 41518 "reason_parser.ml"
          
        in
        
# 2528 "reason_parser.mly"
    ( _1 )
# 41524 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_seq_expr = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_expr = Obj.magic _2 in
        let _1 : 'tv_item_extension_sugar = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_seq_expr = let _1 =
          let x = 
# 2526 "reason_parser.mly"
    ( let loc = mklocation _startpos__1_ _endpos__2_ in
      mkexp (Pexp_sequence(expression_extension ~loc _1 _2, _4)) )
# 41572 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__4_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 41580 "reason_parser.ml"
          
        in
        
# 2528 "reason_parser.mly"
    ( _1 )
# 41586 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_option_SEMI_ = Obj.magic _2 in
        let _1 : 'tv_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_seq_expr_no_seq = 
# 2498 "reason_parser.mly"
             ( _1 )
# 41618 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_seq_expr = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_module_binding_body = Obj.magic _2 in
        let _1 : 'tv_opt_LET_MODULE_ident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_seq_expr_no_seq = 
# 2500 "reason_parser.mly"
  ( mkexp (Pexp_letmodule(_1, _2, _4)) )
# 41664 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _7;
          MenhirLib.EngineTypes.startp = _startpos__7_;
          MenhirLib.EngineTypes.endp = _endpos__7_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _6;
            MenhirLib.EngineTypes.startp = _startpos__6_;
            MenhirLib.EngineTypes.endp = _endpos__6_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _4;
                MenhirLib.EngineTypes.startp = _startpos__4_;
                MenhirLib.EngineTypes.endp = _endpos__4_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _3;
                  MenhirLib.EngineTypes.startp = _startpos__3_;
                  MenhirLib.EngineTypes.endp = _endpos__3_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _2;
                    MenhirLib.EngineTypes.startp = _startpos__2_;
                    MenhirLib.EngineTypes.endp = _endpos__2_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _7 : 'tv_seq_expr = Obj.magic _7 in
        let _6 : unit = Obj.magic _6 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _4 : 'tv_override_flag = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_option_LET_ = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__7_ in
        let _v : 'tv_seq_expr_no_seq = let _5 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 41727 "reason_parser.ml"
          
        in
        let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 41733 "reason_parser.ml"
         in
        
# 2502 "reason_parser.mly"
  ( let exp = mkexp (Pexp_open(_4, _5, _7)) in
    { exp with pexp_attributes = _1 }
  )
# 41740 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _7;
          MenhirLib.EngineTypes.startp = _startpos__7_;
          MenhirLib.EngineTypes.endp = _endpos__7_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _6;
            MenhirLib.EngineTypes.startp = _startpos__6_;
            MenhirLib.EngineTypes.endp = _endpos__6_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _4;
                MenhirLib.EngineTypes.startp = _startpos__4_;
                MenhirLib.EngineTypes.endp = _endpos__4_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _3;
                  MenhirLib.EngineTypes.startp = _startpos__3_;
                  MenhirLib.EngineTypes.endp = _endpos__3_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _2;
                    MenhirLib.EngineTypes.startp = _startpos__2_;
                    MenhirLib.EngineTypes.endp = _endpos__2_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _menhir_s;
                      MenhirLib.EngineTypes.semv = _1;
                      MenhirLib.EngineTypes.startp = _startpos__1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_;
                      MenhirLib.EngineTypes.next = _menhir_stack;
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _7 : 'tv_seq_expr = Obj.magic _7 in
        let _6 : unit = Obj.magic _6 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _4 : 'tv_override_flag = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_option_LET_ = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__7_ in
        let _v : 'tv_seq_expr_no_seq = let _5 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 41810 "reason_parser.ml"
          
        in
        let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 41817 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 41822 "reason_parser.ml"
          
        in
        
# 2502 "reason_parser.mly"
  ( let exp = mkexp (Pexp_open(_4, _5, _7)) in
    { exp with pexp_attributes = _1 }
  )
# 41830 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_seq_expr = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_str_exception_declaration = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_seq_expr_no_seq = 
# 2505 "reason_parser.mly"
                                          (
   mkexp (Pexp_letexception (_1, _3)) )
# 41870 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_seq_expr = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_let_bindings = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_seq_expr_no_seq = 
# 2508 "reason_parser.mly"
  ( let loc = mklocation _startpos__1_ _endpos__3_ in
    expr_of_let_bindings ~loc _1 _3
  )
# 41911 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_option_SEMI_ = Obj.magic _2 in
        let _1 : 'tv_let_bindings = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_seq_expr_no_seq = let _endpos = _endpos__2_ in
        let _symbolstartpos = _startpos__1_ in
        
# 2512 "reason_parser.mly"
  ( let loc = mklocation _symbolstartpos _endpos in
    expr_of_let_bindings ~loc _1 (ghunit ~loc ())
  )
# 41947 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _3 : 'tv_extension_constructor_declaration = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_sig_exception_declaration = let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 41979 "reason_parser.ml"
         in
        
# 4072 "reason_parser.mly"
  ( {_3 with pext_attributes = _3.pext_attributes @ _1} )
# 41984 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_extension_constructor_declaration = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_sig_exception_declaration = let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 42024 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 42029 "reason_parser.ml"
          
        in
        
# 4072 "reason_parser.mly"
  ( {_3 with pext_attributes = _3.pext_attributes @ _1} )
# 42035 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = constructors;
          MenhirLib.EngineTypes.startp = _startpos_constructors_;
          MenhirLib.EngineTypes.endp = _endpos_constructors_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = priv;
            MenhirLib.EngineTypes.startp = _startpos_priv_;
            MenhirLib.EngineTypes.endp = _endpos_priv_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _6;
              MenhirLib.EngineTypes.startp = _startpos__6_;
              MenhirLib.EngineTypes.endp = _endpos__6_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = params;
                MenhirLib.EngineTypes.startp = _startpos_params_;
                MenhirLib.EngineTypes.endp = _endpos_params_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = flag;
                    MenhirLib.EngineTypes.startp = _startpos_flag_;
                    MenhirLib.EngineTypes.endp = _endpos_flag_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _menhir_s;
                      MenhirLib.EngineTypes.semv = _2;
                      MenhirLib.EngineTypes.startp = _startpos__2_;
                      MenhirLib.EngineTypes.endp = _endpos__2_;
                      MenhirLib.EngineTypes.next = _menhir_stack;
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let constructors : 'tv_attributed_ext_constructors_extension_constructor_declaration_ = Obj.magic constructors in
        let priv : 'tv_embedded_private_flag_ = Obj.magic priv in
        let _6 : unit = Obj.magic _6 in
        let params : 'tv_type_variables_with_variance = Obj.magic params in
        let _1 : (
# 1173 "reason_parser.mly"
       (string)
# 42096 "reason_parser.ml"
        ) = Obj.magic _1 in
        let flag : 'tv_nonrec_flag = Obj.magic flag in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos_constructors_ in
        let _v : 'tv_sig_type_extension = let ident =
          let x = 
# 4659 "reason_parser.mly"
                                  ( Lident _1 )
# 42107 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 42115 "reason_parser.ml"
          
        in
        let attrs = 
# 4843 "reason_parser.mly"
    ( [] )
# 42121 "reason_parser.ml"
         in
        
# 4136 "reason_parser.mly"
  ( if flag <> Recursive then
      not_expecting _startpos_flag_ _endpos_flag_ "nonrec flag";
    Te.mk ~params ~priv ~attrs ident constructors
  )
# 42129 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = constructors;
          MenhirLib.EngineTypes.startp = _startpos_constructors_;
          MenhirLib.EngineTypes.endp = _endpos_constructors_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = priv;
            MenhirLib.EngineTypes.startp = _startpos_priv_;
            MenhirLib.EngineTypes.endp = _endpos_priv_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _6;
              MenhirLib.EngineTypes.startp = _startpos__6_;
              MenhirLib.EngineTypes.endp = _endpos__6_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = params;
                MenhirLib.EngineTypes.startp = _startpos_params_;
                MenhirLib.EngineTypes.endp = _endpos_params_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _3;
                  MenhirLib.EngineTypes.startp = _startpos__3_;
                  MenhirLib.EngineTypes.endp = _endpos__3_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _2_inlined1;
                    MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
                    MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _1;
                      MenhirLib.EngineTypes.startp = _startpos__1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _;
                        MenhirLib.EngineTypes.semv = flag;
                        MenhirLib.EngineTypes.startp = _startpos_flag_;
                        MenhirLib.EngineTypes.endp = _endpos_flag_;
                        MenhirLib.EngineTypes.next = {
                          MenhirLib.EngineTypes.state = _menhir_s;
                          MenhirLib.EngineTypes.semv = _2;
                          MenhirLib.EngineTypes.startp = _startpos__2_;
                          MenhirLib.EngineTypes.endp = _endpos__2_;
                          MenhirLib.EngineTypes.next = _menhir_stack;
                        };
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let constructors : 'tv_attributed_ext_constructors_extension_constructor_declaration_ = Obj.magic constructors in
        let priv : 'tv_embedded_private_flag_ = Obj.magic priv in
        let _6 : unit = Obj.magic _6 in
        let params : 'tv_type_variables_with_variance = Obj.magic params in
        let _3 : (
# 1173 "reason_parser.mly"
       (string)
# 42202 "reason_parser.ml"
        ) = Obj.magic _3 in
        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
        let _1 : 'tv_mod_ext_longident = Obj.magic _1 in
        let flag : 'tv_nonrec_flag = Obj.magic flag in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos_constructors_ in
        let _v : 'tv_sig_type_extension = let ident =
          let _2 = _2_inlined1 in
          let x = 
# 4660 "reason_parser.mly"
                                  ( Ldot(_1, _3) )
# 42216 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 42224 "reason_parser.ml"
          
        in
        let attrs = 
# 4843 "reason_parser.mly"
    ( [] )
# 42230 "reason_parser.ml"
         in
        
# 4136 "reason_parser.mly"
  ( if flag <> Recursive then
      not_expecting _startpos_flag_ _endpos_flag_ "nonrec flag";
    Te.mk ~params ~priv ~attrs ident constructors
  )
# 42238 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = constructors;
          MenhirLib.EngineTypes.startp = _startpos_constructors_;
          MenhirLib.EngineTypes.endp = _endpos_constructors_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = priv;
            MenhirLib.EngineTypes.startp = _startpos_priv_;
            MenhirLib.EngineTypes.endp = _endpos_priv_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _6;
              MenhirLib.EngineTypes.startp = _startpos__6_;
              MenhirLib.EngineTypes.endp = _endpos__6_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = params;
                MenhirLib.EngineTypes.startp = _startpos_params_;
                MenhirLib.EngineTypes.endp = _endpos_params_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _1_inlined1;
                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = flag;
                    MenhirLib.EngineTypes.startp = _startpos_flag_;
                    MenhirLib.EngineTypes.endp = _endpos_flag_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _2;
                      MenhirLib.EngineTypes.startp = _startpos__2_;
                      MenhirLib.EngineTypes.endp = _endpos__2_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _menhir_s;
                        MenhirLib.EngineTypes.semv = _1;
                        MenhirLib.EngineTypes.startp = _startpos__1_;
                        MenhirLib.EngineTypes.endp = _endpos__1_;
                        MenhirLib.EngineTypes.next = _menhir_stack;
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let constructors : 'tv_attributed_ext_constructors_extension_constructor_declaration_ = Obj.magic constructors in
        let priv : 'tv_embedded_private_flag_ = Obj.magic priv in
        let _6 : unit = Obj.magic _6 in
        let params : 'tv_type_variables_with_variance = Obj.magic params in
        let _1_inlined1 : (
# 1173 "reason_parser.mly"
       (string)
# 42305 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let flag : 'tv_nonrec_flag = Obj.magic flag in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_constructors_ in
        let _v : 'tv_sig_type_extension = let ident =
          let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
          let x = 
# 4659 "reason_parser.mly"
                                  ( Lident _1 )
# 42318 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 42326 "reason_parser.ml"
          
        in
        let attrs =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 42333 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 42338 "reason_parser.ml"
          
        in
        
# 4136 "reason_parser.mly"
  ( if flag <> Recursive then
      not_expecting _startpos_flag_ _endpos_flag_ "nonrec flag";
    Te.mk ~params ~priv ~attrs ident constructors
  )
# 42347 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = constructors;
          MenhirLib.EngineTypes.startp = _startpos_constructors_;
          MenhirLib.EngineTypes.endp = _endpos_constructors_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = priv;
            MenhirLib.EngineTypes.startp = _startpos_priv_;
            MenhirLib.EngineTypes.endp = _endpos_priv_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _6;
              MenhirLib.EngineTypes.startp = _startpos__6_;
              MenhirLib.EngineTypes.endp = _endpos__6_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = params;
                MenhirLib.EngineTypes.startp = _startpos_params_;
                MenhirLib.EngineTypes.endp = _endpos_params_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _3;
                  MenhirLib.EngineTypes.startp = _startpos__3_;
                  MenhirLib.EngineTypes.endp = _endpos__3_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _2_inlined1;
                    MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
                    MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _1_inlined1;
                      MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _;
                        MenhirLib.EngineTypes.semv = flag;
                        MenhirLib.EngineTypes.startp = _startpos_flag_;
                        MenhirLib.EngineTypes.endp = _endpos_flag_;
                        MenhirLib.EngineTypes.next = {
                          MenhirLib.EngineTypes.state = _;
                          MenhirLib.EngineTypes.semv = _2;
                          MenhirLib.EngineTypes.startp = _startpos__2_;
                          MenhirLib.EngineTypes.endp = _endpos__2_;
                          MenhirLib.EngineTypes.next = {
                            MenhirLib.EngineTypes.state = _menhir_s;
                            MenhirLib.EngineTypes.semv = _1;
                            MenhirLib.EngineTypes.startp = _startpos__1_;
                            MenhirLib.EngineTypes.endp = _endpos__1_;
                            MenhirLib.EngineTypes.next = _menhir_stack;
                          };
                        };
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let constructors : 'tv_attributed_ext_constructors_extension_constructor_declaration_ = Obj.magic constructors in
        let priv : 'tv_embedded_private_flag_ = Obj.magic priv in
        let _6 : unit = Obj.magic _6 in
        let params : 'tv_type_variables_with_variance = Obj.magic params in
        let _3 : (
# 1173 "reason_parser.mly"
       (string)
# 42426 "reason_parser.ml"
        ) = Obj.magic _3 in
        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
        let _1_inlined1 : 'tv_mod_ext_longident = Obj.magic _1_inlined1 in
        let flag : 'tv_nonrec_flag = Obj.magic flag in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_constructors_ in
        let _v : 'tv_sig_type_extension = let ident =
          let (_startpos__1_, _2, _1) = (_startpos__1_inlined1_, _2_inlined1, _1_inlined1) in
          let x = 
# 4660 "reason_parser.mly"
                                  ( Ldot(_1, _3) )
# 42441 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 42449 "reason_parser.ml"
          
        in
        let attrs =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 42456 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 42461 "reason_parser.ml"
          
        in
        
# 4136 "reason_parser.mly"
  ( if flag <> Recursive then
      not_expecting _startpos_flag_ _endpos_flag_ "nonrec flag";
    Te.mk ~params ~priv ~attrs ident constructors
  )
# 42470 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_signature = 
# 1897 "reason_parser.mly"
                ( [] )
# 42488 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_signature_items = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_signature = 
# 1898 "reason_parser.mly"
                    ( _1 )
# 42513 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_signature = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_signature_items = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_signature = 
# 1899 "reason_parser.mly"
                                   ( _1 @ _3 )
# 42552 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_core_type = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let x : 'tv_val_ident = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_signature_item = let _3 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 42601 "reason_parser.ml"
          
        in
        let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 42607 "reason_parser.ml"
         in
        let _endpos = _endpos__5_ in
        
# 1905 "reason_parser.mly"
    ( let loc = mklocation _startpos__2_ _endpos in
      Psig_value (Val.mk _3 _5 ~attrs:_1 ~loc)
    )
# 42615 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_core_type = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let x : 'tv_val_ident = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_signature_item = let _3 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 42671 "reason_parser.ml"
          
        in
        let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 42678 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 42683 "reason_parser.ml"
          
        in
        let _endpos = _endpos__5_ in
        
# 1905 "reason_parser.mly"
    ( let loc = mklocation _startpos__2_ _endpos in
      Psig_value (Val.mk _3 _5 ~attrs:_1 ~loc)
    )
# 42692 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _7;
          MenhirLib.EngineTypes.startp = _startpos__7_;
          MenhirLib.EngineTypes.endp = _endpos__7_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _6;
            MenhirLib.EngineTypes.startp = _startpos__6_;
            MenhirLib.EngineTypes.endp = _endpos__6_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _5;
              MenhirLib.EngineTypes.startp = _startpos__5_;
              MenhirLib.EngineTypes.endp = _endpos__5_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _4;
                MenhirLib.EngineTypes.startp = _startpos__4_;
                MenhirLib.EngineTypes.endp = _endpos__4_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _2;
                    MenhirLib.EngineTypes.startp = _startpos__2_;
                    MenhirLib.EngineTypes.endp = _endpos__2_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _7 : 'tv_primitive_declaration = Obj.magic _7 in
        let _6 : unit = Obj.magic _6 in
        let _5 : 'tv_core_type = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let x : 'tv_val_ident = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__7_ in
        let _v : 'tv_signature_item = let _3 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 42755 "reason_parser.ml"
          
        in
        let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 42761 "reason_parser.ml"
         in
        let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
        let _endpos = _endpos__7_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 1910 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      Psig_value (Val.mk _3 _5 ~prim:_7 ~attrs:_1 ~loc)
    )
# 42774 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _7;
          MenhirLib.EngineTypes.startp = _startpos__7_;
          MenhirLib.EngineTypes.endp = _endpos__7_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _6;
            MenhirLib.EngineTypes.startp = _startpos__6_;
            MenhirLib.EngineTypes.endp = _endpos__6_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _5;
              MenhirLib.EngineTypes.startp = _startpos__5_;
              MenhirLib.EngineTypes.endp = _endpos__5_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _4;
                MenhirLib.EngineTypes.startp = _startpos__4_;
                MenhirLib.EngineTypes.endp = _endpos__4_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _2;
                    MenhirLib.EngineTypes.startp = _startpos__2_;
                    MenhirLib.EngineTypes.endp = _endpos__2_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _menhir_s;
                      MenhirLib.EngineTypes.semv = _1;
                      MenhirLib.EngineTypes.startp = _startpos__1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_;
                      MenhirLib.EngineTypes.next = _menhir_stack;
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _7 : 'tv_primitive_declaration = Obj.magic _7 in
        let _6 : unit = Obj.magic _6 in
        let _5 : 'tv_core_type = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let x : 'tv_val_ident = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__7_ in
        let _v : 'tv_signature_item = let _3 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 42844 "reason_parser.ml"
          
        in
        let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 42851 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 42856 "reason_parser.ml"
          
        in
        let _endpos = _endpos__7_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 1910 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      Psig_value (Val.mk _3 _5 ~prim:_7 ~attrs:_1 ~loc)
    )
# 42869 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_type_declarations = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_signature_item = 
# 1914 "reason_parser.mly"
    ( let (nonrec_flag, tyl) = _1 in Psig_type (nonrec_flag, tyl) )
# 42894 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_sig_type_extension = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_signature_item = 
# 1916 "reason_parser.mly"
    ( Psig_typext _1 )
# 42919 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_sig_exception_declaration = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_signature_item = 
# 1918 "reason_parser.mly"
    ( Psig_exception _1 )
# 42944 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _3 : 'tv_module_declaration = Obj.magic _3 in
        let _2 : 'tv_opt_LET_MODULE_ident = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_signature_item = let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 42976 "reason_parser.ml"
         in
        let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 1920 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      Psig_module (Md.mk _2 _3 ~attrs:_1 ~loc)
    )
# 42989 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_module_declaration = Obj.magic _3 in
        let _2 : 'tv_opt_LET_MODULE_ident = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_signature_item = let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 43029 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 43034 "reason_parser.ml"
          
        in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 1920 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      Psig_module (Md.mk _2 _3 ~attrs:_1 ~loc)
    )
# 43047 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x : 'tv_mod_longident = Obj.magic x in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_opt_LET_MODULE_ident = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_signature_item = let _4 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 43089 "reason_parser.ml"
          
        in
        let (_endpos__4_, _startpos__4_) = (_endpos_x_, _startpos_x_) in
        let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 43096 "reason_parser.ml"
         in
        let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
        let _endpos = _endpos__4_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 1924 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      let loc_mod = mklocation _startpos__4_ _endpos__4_ in
      Psig_module (
        Md.mk
            _2
            (Mty.alias ~loc:loc_mod _4)
            ~attrs:_1
            ~loc
            )
    )
# 43116 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let x : 'tv_mod_longident = Obj.magic x in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_opt_LET_MODULE_ident = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_signature_item = let _4 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 43165 "reason_parser.ml"
          
        in
        let (_endpos__4_, _startpos__4_) = (_endpos_x_, _startpos_x_) in
        let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 43173 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 43178 "reason_parser.ml"
          
        in
        let _endpos = _endpos__4_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 1924 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      let loc_mod = mklocation _startpos__4_ _endpos__4_ in
      Psig_module (
        Md.mk
            _2
            (Mty.alias ~loc:loc_mod _4)
            ~attrs:_1
            ~loc
            )
    )
# 43198 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_list_and_module_rec_declaration_ = Obj.magic _4 in
        let _3 : 'tv_module_type_body_COLON_ = Obj.magic _3 in
        let _2 : 'tv_opt_LET_MODULE_REC_ident = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_signature_item = let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 43237 "reason_parser.ml"
         in
        let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 1936 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos__3_ in
      Psig_recmodule (Md.mk _2 _3 ~attrs:_1 ~loc :: _4) )
# 43248 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_list_and_module_rec_declaration_ = Obj.magic _4 in
        let _3 : 'tv_module_type_body_COLON_ = Obj.magic _3 in
        let _2 : 'tv_opt_LET_MODULE_REC_ident = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_signature_item = let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 43295 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 43300 "reason_parser.ml"
          
        in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 1936 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos__3_ in
      Psig_recmodule (Md.mk _2 _3 ~attrs:_1 ~loc :: _4) )
# 43311 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x : 'tv_ident = Obj.magic x in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_signature_item = let _4 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 43353 "reason_parser.ml"
          
        in
        let _endpos__4_ = _endpos_x_ in
        let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 43360 "reason_parser.ml"
         in
        let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
        let _endpos = _endpos__4_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 1939 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      Psig_modtype (Mtd.mk _4 ~attrs:_1 ~loc)
    )
# 43373 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let x : 'tv_ident = Obj.magic x in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_signature_item = let _4 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 43422 "reason_parser.ml"
          
        in
        let _endpos__4_ = _endpos_x_ in
        let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 43430 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 43435 "reason_parser.ml"
          
        in
        let _endpos = _endpos__4_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 1939 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      Psig_modtype (Mtd.mk _4 ~attrs:_1 ~loc)
    )
# 43448 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_module_type_body_EQUAL_ = Obj.magic _5 in
        let x : 'tv_ident = Obj.magic x in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_signature_item = let _4 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 43497 "reason_parser.ml"
          
        in
        let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 43503 "reason_parser.ml"
         in
        let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
        let _endpos = _endpos__5_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 1943 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      Psig_modtype (Mtd.mk _4 ~typ:_5 ~loc ~attrs:_1)
    )
# 43516 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_module_type_body_EQUAL_ = Obj.magic _5 in
        let x : 'tv_ident = Obj.magic x in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_signature_item = let _4 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 43572 "reason_parser.ml"
          
        in
        let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 43579 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 43584 "reason_parser.ml"
          
        in
        let _endpos = _endpos__5_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 1943 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      Psig_modtype (Mtd.mk _4 ~typ:_5 ~loc ~attrs:_1)
    )
# 43597 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_open_statement = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_signature_item = 
# 1947 "reason_parser.mly"
    ( Psig_open _1 )
# 43622 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _3 : 'tv_module_type = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_signature_item = let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 43654 "reason_parser.ml"
         in
        let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 1949 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      Psig_include (Incl.mk _3 ~attrs:_1 ~loc)
    )
# 43667 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_module_type = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_signature_item = let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 43707 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 43712 "reason_parser.ml"
          
        in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 1949 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      Psig_include (Incl.mk _3 ~attrs:_1 ~loc)
    )
# 43725 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_class_descriptions = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_signature_item = 
# 1953 "reason_parser.mly"
    ( Psig_class _1 )
# 43750 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_class_type_declarations = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_signature_item = 
# 1955 "reason_parser.mly"
    ( Psig_class_type _1 )
# 43775 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _2 : 'tv_item_extension = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_signature_item = let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 43800 "reason_parser.ml"
         in
        
# 1957 "reason_parser.mly"
    ( Psig_extension (_2, _1) )
# 43805 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_item_extension = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_signature_item = let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 43838 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 43843 "reason_parser.ml"
          
        in
        
# 1957 "reason_parser.mly"
    ( Psig_extension (_2, _1) )
# 43849 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : 'tv_signature_item = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_signature_items = let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 43877 "reason_parser.ml"
          
        in
        
# 1961 "reason_parser.mly"
                           ( [mksig ~loc:_1.loc _1.txt] )
# 43883 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_signature_items = let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 43908 "reason_parser.ml"
         in
        
# 1963 "reason_parser.mly"
    ( List.map (fun x -> mksig ~loc:x.loc (Psig_attribute x.txt)) _1 )
# 43913 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_constant = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_signed_constant = 
# 4573 "reason_parser.mly"
                 ( _1 )
# 43938 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : (
# 1156 "reason_parser.mly"
       (string * char option)
# 43965 "reason_parser.ml"
        ) = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_signed_constant = 
# 4574 "reason_parser.mly"
                 ( let (n, m) = _2 in ([], Pconst_integer("-" ^ n, m)) )
# 43974 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : (
# 1136 "reason_parser.mly"
       (string * char option)
# 44001 "reason_parser.ml"
        ) = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_signed_constant = 
# 4575 "reason_parser.mly"
                 ( let (f, m) = _2 in ([], Pconst_float("-" ^ f, m)) )
# 44010 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : (
# 1156 "reason_parser.mly"
       (string * char option)
# 44037 "reason_parser.ml"
        ) = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_signed_constant = 
# 4576 "reason_parser.mly"
                 ( let (n, m) = _2 in ([], Pconst_integer (n, m)) )
# 44046 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : (
# 1136 "reason_parser.mly"
       (string * char option)
# 44073 "reason_parser.ml"
        ) = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_signed_constant = 
# 4577 "reason_parser.mly"
                 ( let (f, m) = _2 in ([], Pconst_float(f, m)) )
# 44082 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : 'tv_val_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 44112 "reason_parser.ml"
              
            in
            
# 2999 "reason_parser.mly"
                          ( mkexp (Pexp_ident _1) )
# 44118 "reason_parser.ml"
            
          in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 44126 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 44132 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_constant = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x = 
# 3001 "reason_parser.mly"
    ( let attrs, cst = _1 in mkexp ~attrs (Pexp_constant cst) )
# 44158 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 44166 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 44172 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_jsx = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x = 
# 3002 "reason_parser.mly"
                          ( _1 )
# 44198 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 44206 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 44212 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_simple_expr_direct_argument = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x = 
# 3003 "reason_parser.mly"
                                ( _1 )
# 44238 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 44246 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 44252 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_option_COMMA_ = Obj.magic _3 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _1 =
              let _2 = 
# 4964 "reason_parser.mly"
                ( [] )
# 44294 "reason_parser.ml"
               in
              
# 2983 "reason_parser.mly"
  ( let msg = "Arrays can't use the `...` spread currently. Please use `concat` or other Array helpers." in
    filter_raise_spread_syntax msg _2
  )
# 44301 "reason_parser.ml"
              
            in
            
# 3005 "reason_parser.mly"
    ( mkexp (Pexp_array _1) )
# 44307 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__4_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 44316 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 44322 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_option_COMMA_ = Obj.magic _3 in
        let _1_inlined1 : 'tv_lseparated_nonempty_list_aux_COMMA_opt_spread_expr_optional_constraint__ = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _1 =
              let _2 =
                let _1 = _1_inlined1 in
                let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 44373 "reason_parser.ml"
                 in
                
# 4965 "reason_parser.mly"
                                     ( _1 )
# 44378 "reason_parser.ml"
                
              in
              
# 2983 "reason_parser.mly"
  ( let msg = "Arrays can't use the `...` spread currently. Please use `concat` or other Array helpers." in
    filter_raise_spread_syntax msg _2
  )
# 44386 "reason_parser.ml"
              
            in
            
# 3005 "reason_parser.mly"
    ( mkexp (Pexp_array _1) )
# 44392 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__4_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 44401 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 44407 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : 'tv_constr_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 44437 "reason_parser.ml"
              
            in
            
# 3009 "reason_parser.mly"
    ( mkexp (Pexp_construct (_1, None)) )
# 44443 "reason_parser.ml"
            
          in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 44451 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 44457 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_ident = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _1 = 
# 4719 "reason_parser.mly"
                                  ( _2 )
# 44491 "reason_parser.ml"
             in
            
# 3011 "reason_parser.mly"
    ( mkexp (Pexp_variant (_1, None)) )
# 44496 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 44505 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 44511 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_expr_list = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _endpos = _endpos__3_ in
            let _startpos = _startpos__1_ in
            
# 3013 "reason_parser.mly"
    ( may_tuple _startpos _endpos _2 )
# 44554 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 44563 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 44569 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _2 : 'tv_expr_list = Obj.magic _2 in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _3 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 44614 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 44623 "reason_parser.ml"
              
            in
            
# 3015 "reason_parser.mly"
    ( unclosed_exp (with_txt _1 "(") (with_txt _3 ")") )
# 44629 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos_x_inlined1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 44638 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 44644 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : (
# 1196 "reason_parser.mly"
       (string)
# 44671 "reason_parser.ml"
        ) = Obj.magic x in
        let _1 : 'tv_simple_expr_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _2 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 44685 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos__1_ in
              let _startpos = _startpos__1_ in
              
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 44694 "reason_parser.ml"
              
            in
            
# 3017 "reason_parser.mly"
    ( mkexp(Pexp_apply(mkoperator _2, [Nolabel, _1])) )
# 44700 "reason_parser.ml"
            
          in
          let _startpos_x_ = _startpos__1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 44709 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 44715 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_expr_list = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 44773 "reason_parser.ml"
              
            in
            
# 3019 "reason_parser.mly"
    ( mkexp(Pexp_open(Fresh, _1, may_tuple _startpos__3_ _endpos__5_ _4)) )
# 44779 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__5_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 44788 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 44794 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _4 : 'tv_expr_list = Obj.magic _4 in
        let x : unit = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_mod_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _5 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 44853 "reason_parser.ml"
              
            in
            let _3 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 44862 "reason_parser.ml"
              
            in
            
# 3021 "reason_parser.mly"
    ( unclosed_exp (with_txt _3 "(") (with_txt _5 ")") )
# 44868 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos_x_inlined1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 44877 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 44883 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x : 'tv_label_longident = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_simple_expr_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _3 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 44927 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos__1_ in
              let _startpos = _startpos__1_ in
              
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 44936 "reason_parser.ml"
              
            in
            
# 3023 "reason_parser.mly"
    ( mkexp(Pexp_field(_1, _3)) )
# 44942 "reason_parser.ml"
            
          in
          let _startpos_x_ = _startpos__1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 44951 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 44957 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = x;
                MenhirLib.EngineTypes.startp = _startpos_x_;
                MenhirLib.EngineTypes.endp = _endpos_x_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 45008 "reason_parser.ml"
              
            in
            let _startpos__1_ = _startpos_x_ in
            let _endpos = _endpos__4_ in
            let _symbolstartpos = _startpos__1_ in
            
# 3025 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      let pat = mkpat (Ppat_var (mkloc "this" loc)) in
      mkexp(Pexp_open (Fresh, _1,
                       mkexp(Pexp_object(Cstr.mk pat []))))
    )
# 45021 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__4_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 45030 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 45036 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_simple_expr_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos__1_ in
              let _startpos = _startpos__1_ in
              
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 45087 "reason_parser.ml"
              
            in
            let _endpos = _endpos__4_ in
            let _symbolstartpos = _startpos__1_ in
            
# 3031 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      let exp = Pexp_ident(array_function ~loc "Array" "get") in
      mkexp(Pexp_apply(mkexp ~ghost:true ~loc exp, [Nolabel,_1; Nolabel,_3]))
    )
# 45098 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__4_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 45107 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 45113 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _3 : 'tv_expr = Obj.magic _3 in
        let x : unit = Obj.magic x in
        let _1 : 'tv_simple_expr_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _4 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 45165 "reason_parser.ml"
              
            in
            let _2 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 45174 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos__1_ in
              let _startpos = _startpos__1_ in
              
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 45183 "reason_parser.ml"
              
            in
            
# 3036 "reason_parser.mly"
    ( unclosed_exp (with_txt _2 "(") (with_txt _4 ")") )
# 45189 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos_x_inlined1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 45198 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 45204 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_expr = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_simple_expr_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos__1_ in
              let _startpos = _startpos__1_ in
              
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 45262 "reason_parser.ml"
              
            in
            let _endpos = _endpos__5_ in
            let _symbolstartpos = _startpos__1_ in
            
# 3038 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      let exp = Pexp_ident(array_function ~loc "String" "get") in
      mkexp(Pexp_apply(mkexp ~ghost:true ~loc exp, [Nolabel,_1; Nolabel,_4]))
    )
# 45273 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__5_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 45282 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 45288 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _4 : 'tv_expr = Obj.magic _4 in
        let x : unit = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_simple_expr_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _5 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 45347 "reason_parser.ml"
              
            in
            let _3 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 45356 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos__1_ in
              let _startpos = _startpos__1_ in
              
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 45365 "reason_parser.ml"
              
            in
            
# 3043 "reason_parser.mly"
    ( unclosed_exp (with_txt _3 "[") (with_txt _5 "]") )
# 45371 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos_x_inlined1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 45380 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 45386 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined2;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _1_inlined1;
                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _1;
                    MenhirLib.EngineTypes.startp = _startpos__1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_option_COMMA_ = Obj.magic _4 in
        let _1_inlined2 : 'tv_lseparated_nonempty_list_aux_COMMA_expr_ = Obj.magic _1_inlined2 in
        let _2 : unit = Obj.magic _2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_simple_expr_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _2 =
              let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in
              let _3 =
                let _1 = _1_inlined1 in
                
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 45452 "reason_parser.ml"
                
              in
              
# 2988 "reason_parser.mly"
                                                                 ( _3 )
# 45458 "reason_parser.ml"
              
            in
            let _endpos__2_ = _endpos__5_ in
            let _1 =
              let _endpos = _endpos__1_ in
              let _startpos = _startpos__1_ in
              
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 45468 "reason_parser.ml"
              
            in
            let _endpos = _endpos__2_ in
            let _symbolstartpos = _startpos__1_ in
            
# 3045 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      bigarray_get ~loc _1 _2 )
# 45477 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__5_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 45486 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 45492 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_record_expr = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 45550 "reason_parser.ml"
              
            in
            let _startpos__1_ = _startpos_x_ in
            let _endpos = _endpos__5_ in
            let _symbolstartpos = _startpos__1_ in
            
# 3048 "reason_parser.mly"
    ( let (exten, fields) = _4 in
      let loc = mklocation _symbolstartpos _endpos in
      let rec_exp = mkexp ~loc (Pexp_record (fields, exten)) in
      mkexp(Pexp_open(Fresh, _1, rec_exp))
    )
# 45563 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__5_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 45572 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 45578 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _4 : 'tv_record_expr = Obj.magic _4 in
        let x : unit = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_mod_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _5 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 45637 "reason_parser.ml"
              
            in
            let _3 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 45646 "reason_parser.ml"
              
            in
            
# 3054 "reason_parser.mly"
    ( unclosed_exp (with_txt _3 "{") (with_txt _5 "}") )
# 45652 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos_x_inlined1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 45661 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 45667 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_record_expr_with_string_keys = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 45725 "reason_parser.ml"
              
            in
            let _startpos__1_ = _startpos_x_ in
            let _endpos = _endpos__5_ in
            let _symbolstartpos = _startpos__1_ in
            
# 3056 "reason_parser.mly"
    ( let (exten, fields) = _4 in
      let loc = mklocation _symbolstartpos _endpos in
      let rec_exp = mkexp ~loc (Pexp_extension (mkloc ("bs.obj") loc,
             PStr [mkstrexp (mkexp ~loc (Pexp_record(fields, exten))) []]))
      in
      mkexp(Pexp_open(Fresh, _1, rec_exp))
    )
# 45740 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__5_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 45749 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 45755 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _4 : 'tv_record_expr_with_string_keys = Obj.magic _4 in
        let x : unit = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_mod_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _5 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 45814 "reason_parser.ml"
              
            in
            let _3 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 45823 "reason_parser.ml"
              
            in
            
# 3064 "reason_parser.mly"
    ( unclosed_exp (with_txt _3 "{") (with_txt _5 "}") )
# 45829 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos_x_inlined1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 45838 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 45844 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_expr_list = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 45902 "reason_parser.ml"
              
            in
            let _startpos__1_ = _startpos_x_ in
            let _endpos = _endpos__5_ in
            let _symbolstartpos = _startpos__1_ in
            
# 3066 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      let rec_exp = Exp.mk ~loc ~attrs:[] (Pexp_array _4) in
      mkexp(Pexp_open(Fresh, _1, rec_exp))
    )
# 45914 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__5_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 45923 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 45929 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _4 : 'tv_expr_list = Obj.magic _4 in
        let x : unit = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_mod_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _5 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 45988 "reason_parser.ml"
              
            in
            let _3 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 45997 "reason_parser.ml"
              
            in
            
# 3071 "reason_parser.mly"
    ( unclosed_exp (with_txt _3 "[|") (with_txt _5 "|]") )
# 46003 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos_x_inlined1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 46012 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 46018 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_jsx_without_leading_less = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 46076 "reason_parser.ml"
              
            in
            
# 3074 "reason_parser.mly"
    ( let seq, ext_opt = [_4], None in
      let loc = mklocation _startpos__4_ _endpos__4_ in
      let list_exp = make_real_exp (mktailexp_extension loc seq ext_opt) in
      let list_exp = { list_exp with pexp_loc = loc } in
      mkexp (Pexp_open (Fresh, _1, list_exp))
    )
# 46087 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__5_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 46096 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 46102 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = x;
                MenhirLib.EngineTypes.startp = _startpos_x_;
                MenhirLib.EngineTypes.endp = _endpos_x_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 46153 "reason_parser.ml"
              
            in
            
# 3081 "reason_parser.mly"
    ( let loc = mklocation _startpos__3_ _endpos__4_ in
      let list_exp = make_real_exp (mktailexp_extension loc [] None) in
      let list_exp = { list_exp with pexp_loc = loc } in
      mkexp (Pexp_open (Fresh, _1, list_exp))
    )
# 46163 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__4_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 46172 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 46178 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_expr_comma_seq_extension = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 46236 "reason_parser.ml"
              
            in
            
# 3087 "reason_parser.mly"
    ( let seq, ext_opt = _4 in
      let loc = mklocation _startpos__4_ _endpos__4_ in
      let list_exp = make_real_exp (mktailexp_extension loc seq ext_opt) in
      let list_exp = { list_exp with pexp_loc = loc } in
      mkexp (Pexp_open (Fresh, _1, list_exp))
    )
# 46247 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__5_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 46256 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 46262 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _1 : 'tv_simple_expr_call = Obj.magic _1 in
        let x : (
# 1195 "reason_parser.mly"
       (string)
# 46290 "reason_parser.ml"
        ) = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _2 =
              let _endpos = _endpos__1_ in
              let _startpos = _startpos__1_ in
              
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 46303 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 46312 "reason_parser.ml"
              
            in
            
# 3094 "reason_parser.mly"
    ( mkexp(Pexp_apply(mkoperator _1, [Nolabel, _2])) )
# 46318 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 46327 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 46333 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : 'tv_class_longident = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _2 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 46370 "reason_parser.ml"
              
            in
            
# 3104 "reason_parser.mly"
    ( mkexp (Pexp_new _2) )
# 46376 "reason_parser.ml"
            
          in
          let _startpos_x_ = _startpos__1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 46385 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 46391 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _6;
          MenhirLib.EngineTypes.startp = _startpos__6_;
          MenhirLib.EngineTypes.endp = _endpos__6_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _5;
            MenhirLib.EngineTypes.startp = _startpos__5_;
            MenhirLib.EngineTypes.endp = _endpos__5_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _3;
                MenhirLib.EngineTypes.startp = _startpos__3_;
                MenhirLib.EngineTypes.endp = _endpos__3_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _2;
                  MenhirLib.EngineTypes.startp = _startpos__2_;
                  MenhirLib.EngineTypes.endp = _endpos__2_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = x;
                    MenhirLib.EngineTypes.startp = _startpos_x_;
                    MenhirLib.EngineTypes.endp = _endpos_x_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _6 : unit = Obj.magic _6 in
        let _5 : 'tv_option_COMMA_ = Obj.magic _5 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_field_expr_ = Obj.magic _1 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__6_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _4 =
              let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 46454 "reason_parser.ml"
               in
              
# 3606 "reason_parser.mly"
                                                                     ( _1 )
# 46459 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 46468 "reason_parser.ml"
              
            in
            let _startpos__1_ = _startpos_x_ in
            let _endpos = _endpos__6_ in
            let _symbolstartpos = _startpos__1_ in
            
# 3106 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      let exp = Exp.mk ~loc ~attrs:[] (Pexp_override _4) in
      mkexp (Pexp_open(Fresh, _1, exp))
    )
# 46480 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__6_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 46489 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 46495 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _5;
            MenhirLib.EngineTypes.startp = _startpos__5_;
            MenhirLib.EngineTypes.endp = _endpos__5_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = x;
                MenhirLib.EngineTypes.startp = _startpos_x_;
                MenhirLib.EngineTypes.endp = _endpos_x_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _2;
                  MenhirLib.EngineTypes.startp = _startpos__2_;
                  MenhirLib.EngineTypes.endp = _endpos__2_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _1;
                    MenhirLib.EngineTypes.startp = _startpos__1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _5 : 'tv_option_COMMA_ = Obj.magic _5 in
        let _1_inlined1 : 'tv_lseparated_nonempty_list_aux_COMMA_field_expr_ = Obj.magic _1_inlined1 in
        let x : unit = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_mod_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _6 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 46561 "reason_parser.ml"
              
            in
            let _4 =
              let _1 = _1_inlined1 in
              let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 46569 "reason_parser.ml"
               in
              
# 3606 "reason_parser.mly"
                                                                     ( _1 )
# 46574 "reason_parser.ml"
              
            in
            let _3 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 46583 "reason_parser.ml"
              
            in
            
# 3111 "reason_parser.mly"
    ( unclosed_exp (with_txt _3 "{<") (with_txt _6 ">}") )
# 46589 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos_x_inlined1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 46598 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 46604 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _1_inlined1;
          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _1_inlined1 : (
# 1173 "reason_parser.mly"
       (string)
# 46637 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_simple_expr_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_inlined1_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _3 =
              let _1 = _1_inlined1 in
              
# 4721 "reason_parser.mly"
                      ( _1 )
# 46651 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos__1_ in
              let _startpos = _startpos__1_ in
              
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 46660 "reason_parser.ml"
              
            in
            
# 3113 "reason_parser.mly"
    ( mkexp (Pexp_send(_1, _3)) )
# 46666 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_inlined1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 46675 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 46681 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_simple_expr_no_call = Obj.magic _3 in
        let x : (
# 1208 "reason_parser.mly"
       (string)
# 46715 "reason_parser.ml"
        ) = Obj.magic x in
        let _1 : 'tv_simple_expr_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _2 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 46729 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos__1_ in
              let _startpos = _startpos__1_ in
              
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 46738 "reason_parser.ml"
              
            in
            
# 3115 "reason_parser.mly"
    ( mkinfixop _1 (mkoperator _2) _3 )
# 46744 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 46753 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 46759 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _1_inlined1;
          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _1_inlined1 : 'tv_simple_expr_call = Obj.magic _1_inlined1 in
        let x : unit = Obj.magic x in
        let _1 : 'tv_simple_expr_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_inlined1_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _3 =
              let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
              let _endpos = _endpos__1_ in
              let _startpos = _startpos__1_ in
              
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 46804 "reason_parser.ml"
              
            in
            let _2 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 46813 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos__1_ in
              let _startpos = _startpos__1_ in
              
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 46822 "reason_parser.ml"
              
            in
            
# 3117 "reason_parser.mly"
    ( let op = { _2 with txt = "#=" } in
      mkinfixop _1 (mkoperator op) _3 )
# 46829 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_inlined1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 46838 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 46844 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_simple_expr_no_call = Obj.magic _3 in
        let x : unit = Obj.magic x in
        let _1 : 'tv_simple_expr_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _2 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 46888 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos__1_ in
              let _startpos = _startpos__1_ in
              
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 46897 "reason_parser.ml"
              
            in
            
# 3120 "reason_parser.mly"
    ( mkinfixop _1 (mkoperator {_2 with txt = "|."}) _3 )
# 46903 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 46912 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 46918 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _8;
          MenhirLib.EngineTypes.startp = _startpos__8_;
          MenhirLib.EngineTypes.endp = _endpos__8_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _7;
            MenhirLib.EngineTypes.startp = _startpos__7_;
            MenhirLib.EngineTypes.endp = _endpos__7_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _6;
              MenhirLib.EngineTypes.startp = _startpos__6_;
              MenhirLib.EngineTypes.endp = _endpos__6_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _5;
                MenhirLib.EngineTypes.startp = _startpos__5_;
                MenhirLib.EngineTypes.endp = _endpos__5_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _4;
                  MenhirLib.EngineTypes.startp = _startpos__4_;
                  MenhirLib.EngineTypes.endp = _endpos__4_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _3;
                    MenhirLib.EngineTypes.startp = _startpos__3_;
                    MenhirLib.EngineTypes.endp = _endpos__3_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _2;
                      MenhirLib.EngineTypes.startp = _startpos__2_;
                      MenhirLib.EngineTypes.endp = _endpos__2_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _menhir_s;
                        MenhirLib.EngineTypes.semv = x;
                        MenhirLib.EngineTypes.startp = _startpos_x_;
                        MenhirLib.EngineTypes.endp = _endpos_x_;
                        MenhirLib.EngineTypes.next = _menhir_stack;
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _8 : unit = Obj.magic _8 in
        let _7 : 'tv_package_type = Obj.magic _7 in
        let _6 : unit = Obj.magic _6 in
        let _5 : 'tv_module_expr = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__8_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 46997 "reason_parser.ml"
              
            in
            let _startpos__1_ = _startpos_x_ in
            let _endpos = _endpos__8_ in
            let _symbolstartpos = _startpos__1_ in
            
# 3122 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      mkexp (Pexp_open(Fresh, _1,
        mkexp ~loc (Pexp_constraint (mkexp ~ghost:true ~loc (Pexp_pack _5),
                                     mktyp ~ghost:true ~loc (Ptyp_package _7)))))
    )
# 47010 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__8_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 47019 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 47025 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _6;
            MenhirLib.EngineTypes.startp = _startpos__6_;
            MenhirLib.EngineTypes.endp = _endpos__6_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _5;
              MenhirLib.EngineTypes.startp = _startpos__5_;
              MenhirLib.EngineTypes.endp = _endpos__5_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _4;
                MenhirLib.EngineTypes.startp = _startpos__4_;
                MenhirLib.EngineTypes.endp = _endpos__4_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _2;
                    MenhirLib.EngineTypes.startp = _startpos__2_;
                    MenhirLib.EngineTypes.endp = _endpos__2_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _menhir_s;
                      MenhirLib.EngineTypes.semv = _1;
                      MenhirLib.EngineTypes.startp = _startpos__1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_;
                      MenhirLib.EngineTypes.next = _menhir_stack;
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _6 : unit = Obj.magic _6 in
        let _5 : 'tv_module_expr = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let x : unit = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_mod_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x =
            let _7 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 47098 "reason_parser.ml"
              
            in
            let _3 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 47107 "reason_parser.ml"
              
            in
            
# 3128 "reason_parser.mly"
    ( unclosed_exp (with_txt _3 "(") (with_txt _7 ")"))
# 47113 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos_x_inlined1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 47122 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 47128 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_extension = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_simple_expr_call = let _1 =
          let x = 
# 3130 "reason_parser.mly"
    ( mkexp (Pexp_extension _1) )
# 47154 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 47162 "reason_parser.ml"
          
        in
        
# 3165 "reason_parser.mly"
                                                         ( (_1, []) )
# 47168 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_labeled_arguments = Obj.magic _2 in
        let _1 : 'tv_simple_expr_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_simple_expr_call = 
# 3167 "reason_parser.mly"
    ( let (body, args) = _1 in
      (body, List.rev_append _2 args) )
# 47201 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_expr_comma_seq_extension = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_simple_expr_call = 
# 3170 "reason_parser.mly"
    ( let seq, ext_opt = _2 in
      let loc = mklocation _startpos__2_ _endpos__2_ in
      (make_real_exp (mktailexp_extension loc seq ext_opt), [])
    )
# 47243 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_simple_expr_template_constructor = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_simple_expr_call = 
# 3174 "reason_parser.mly"
                                     ( (_1, []) )
# 47268 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_braced_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_simple_expr_direct_argument = 
# 3189 "reason_parser.mly"
                ( _1 )
# 47293 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_expr_comma_seq_extension = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_jsx_without_leading_less = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_simple_expr_direct_argument = 
# 3191 "reason_parser.mly"
    ( let entireLoc = mklocation _startpos__1_ _endpos__4_ in
      let (seq, ext_opt) = _4 in
      mktailexp_extension entireLoc (_2::seq) ext_opt
    )
# 47349 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_jsx_without_leading_less = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_simple_expr_direct_argument = 
# 3196 "reason_parser.mly"
    ( let entireLoc = mklocation _startpos__1_ _endpos__3_ in
      mktailexp_extension entireLoc (_2::[]) None
    )
# 47390 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_jsx_without_leading_less = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_simple_expr_direct_argument = 
# 3200 "reason_parser.mly"
    ( let entireLoc = mklocation _startpos__1_ _endpos__4_ in
      mktailexp_extension entireLoc [_2] None
    )
# 47438 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_option_COMMA_ = Obj.magic _3 in
        let _1_inlined1 : 'tv_lseparated_nonempty_list_aux_COMMA_field_expr_ = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_simple_expr_direct_argument = let _2 =
          let _1 = _1_inlined1 in
          let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 47486 "reason_parser.ml"
           in
          
# 3606 "reason_parser.mly"
                                                                     ( _1 )
# 47491 "reason_parser.ml"
          
        in
        
# 3204 "reason_parser.mly"
    ( mkexp (Pexp_override _2) )
# 47497 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = x;
                MenhirLib.EngineTypes.startp = _startpos_x_;
                MenhirLib.EngineTypes.endp = _endpos_x_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _3 : 'tv_option_COMMA_ = Obj.magic _3 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_field_expr_ = Obj.magic _1 in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_expr_direct_argument = let _4 =
          let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 47547 "reason_parser.ml"
          
        in
        let _2 =
          let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 47554 "reason_parser.ml"
           in
          
# 3606 "reason_parser.mly"
                                                                     ( _1 )
# 47559 "reason_parser.ml"
          
        in
        let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 47568 "reason_parser.ml"
          
        in
        
# 3206 "reason_parser.mly"
    ( unclosed_exp (with_txt _1 "{<") (with_txt _4 ">}" ) )
# 47574 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_simple_expr_direct_argument = 
# 3208 "reason_parser.mly"
    ( mkexp (Pexp_override []))
# 47606 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_module_expr = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_simple_expr_direct_argument = 
# 3210 "reason_parser.mly"
    ( mkexp (Pexp_pack _3) )
# 47652 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _6;
          MenhirLib.EngineTypes.startp = _startpos__6_;
          MenhirLib.EngineTypes.endp = _endpos__6_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _5;
            MenhirLib.EngineTypes.startp = _startpos__5_;
            MenhirLib.EngineTypes.endp = _endpos__5_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _4;
              MenhirLib.EngineTypes.startp = _startpos__4_;
              MenhirLib.EngineTypes.endp = _endpos__4_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _3;
                MenhirLib.EngineTypes.startp = _startpos__3_;
                MenhirLib.EngineTypes.endp = _endpos__3_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _2;
                  MenhirLib.EngineTypes.startp = _startpos__2_;
                  MenhirLib.EngineTypes.endp = _endpos__2_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _1;
                    MenhirLib.EngineTypes.startp = _startpos__1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _6 : unit = Obj.magic _6 in
        let _5 : 'tv_package_type = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_module_expr = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__6_ in
        let _v : 'tv_simple_expr_direct_argument = let _endpos = _endpos__6_ in
        let _symbolstartpos = _startpos__1_ in
        
# 3212 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      mkexp (Pexp_constraint (mkexp ~ghost:true ~loc (Pexp_pack _3),
                              mktyp ~ghost:true ~loc (Ptyp_package _5)))
    )
# 47717 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_module_expr = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_expr_direct_argument = let _5 =
          let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 47774 "reason_parser.ml"
          
        in
        let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 47783 "reason_parser.ml"
          
        in
        
# 3217 "reason_parser.mly"
    ( unclosed_exp (with_txt _1 "(") (with_txt _5 ")") )
# 47789 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : 'tv_val_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 47819 "reason_parser.ml"
              
            in
            
# 2999 "reason_parser.mly"
                          ( mkexp (Pexp_ident _1) )
# 47825 "reason_parser.ml"
            
          in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 47833 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 47839 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_constant = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x = 
# 3001 "reason_parser.mly"
    ( let attrs, cst = _1 in mkexp ~attrs (Pexp_constant cst) )
# 47865 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 47873 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 47879 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_jsx = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x = 
# 3002 "reason_parser.mly"
                          ( _1 )
# 47905 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 47913 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 47919 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_simple_expr_direct_argument = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x = 
# 3003 "reason_parser.mly"
                                ( _1 )
# 47945 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 47953 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 47959 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_option_COMMA_ = Obj.magic _3 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _1 =
              let _2 = 
# 4964 "reason_parser.mly"
                ( [] )
# 48001 "reason_parser.ml"
               in
              
# 2983 "reason_parser.mly"
  ( let msg = "Arrays can't use the `...` spread currently. Please use `concat` or other Array helpers." in
    filter_raise_spread_syntax msg _2
  )
# 48008 "reason_parser.ml"
              
            in
            
# 3005 "reason_parser.mly"
    ( mkexp (Pexp_array _1) )
# 48014 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__4_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 48023 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 48029 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_option_COMMA_ = Obj.magic _3 in
        let _1_inlined1 : 'tv_lseparated_nonempty_list_aux_COMMA_opt_spread_expr_optional_constraint__ = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _1 =
              let _2 =
                let _1 = _1_inlined1 in
                let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 48080 "reason_parser.ml"
                 in
                
# 4965 "reason_parser.mly"
                                     ( _1 )
# 48085 "reason_parser.ml"
                
              in
              
# 2983 "reason_parser.mly"
  ( let msg = "Arrays can't use the `...` spread currently. Please use `concat` or other Array helpers." in
    filter_raise_spread_syntax msg _2
  )
# 48093 "reason_parser.ml"
              
            in
            
# 3005 "reason_parser.mly"
    ( mkexp (Pexp_array _1) )
# 48099 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__4_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 48108 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 48114 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : 'tv_constr_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 48144 "reason_parser.ml"
              
            in
            
# 3009 "reason_parser.mly"
    ( mkexp (Pexp_construct (_1, None)) )
# 48150 "reason_parser.ml"
            
          in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 48158 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 48164 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_ident = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _1 = 
# 4719 "reason_parser.mly"
                                  ( _2 )
# 48198 "reason_parser.ml"
             in
            
# 3011 "reason_parser.mly"
    ( mkexp (Pexp_variant (_1, None)) )
# 48203 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 48212 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 48218 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_expr_list = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _endpos = _endpos__3_ in
            let _startpos = _startpos__1_ in
            
# 3013 "reason_parser.mly"
    ( may_tuple _startpos _endpos _2 )
# 48261 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 48270 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 48276 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _2 : 'tv_expr_list = Obj.magic _2 in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _3 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 48321 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 48330 "reason_parser.ml"
              
            in
            
# 3015 "reason_parser.mly"
    ( unclosed_exp (with_txt _1 "(") (with_txt _3 ")") )
# 48336 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos_x_inlined1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 48345 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 48351 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : (
# 1196 "reason_parser.mly"
       (string)
# 48378 "reason_parser.ml"
        ) = Obj.magic x in
        let _1 : 'tv_simple_expr_no_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _2 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 48392 "reason_parser.ml"
              
            in
            
# 3017 "reason_parser.mly"
    ( mkexp(Pexp_apply(mkoperator _2, [Nolabel, _1])) )
# 48398 "reason_parser.ml"
            
          in
          let _startpos_x_ = _startpos__1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 48407 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 48413 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_expr_list = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 48471 "reason_parser.ml"
              
            in
            
# 3019 "reason_parser.mly"
    ( mkexp(Pexp_open(Fresh, _1, may_tuple _startpos__3_ _endpos__5_ _4)) )
# 48477 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__5_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 48486 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 48492 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _4 : 'tv_expr_list = Obj.magic _4 in
        let x : unit = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_mod_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _5 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 48551 "reason_parser.ml"
              
            in
            let _3 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 48560 "reason_parser.ml"
              
            in
            
# 3021 "reason_parser.mly"
    ( unclosed_exp (with_txt _3 "(") (with_txt _5 ")") )
# 48566 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos_x_inlined1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 48575 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 48581 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x : 'tv_label_longident = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_simple_expr_no_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _3 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 48625 "reason_parser.ml"
              
            in
            
# 3023 "reason_parser.mly"
    ( mkexp(Pexp_field(_1, _3)) )
# 48631 "reason_parser.ml"
            
          in
          let _startpos_x_ = _startpos__1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 48640 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 48646 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = x;
                MenhirLib.EngineTypes.startp = _startpos_x_;
                MenhirLib.EngineTypes.endp = _endpos_x_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 48697 "reason_parser.ml"
              
            in
            let _startpos__1_ = _startpos_x_ in
            let _endpos = _endpos__4_ in
            let _symbolstartpos = _startpos__1_ in
            
# 3025 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      let pat = mkpat (Ppat_var (mkloc "this" loc)) in
      mkexp(Pexp_open (Fresh, _1,
                       mkexp(Pexp_object(Cstr.mk pat []))))
    )
# 48710 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__4_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 48719 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 48725 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_simple_expr_no_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _endpos = _endpos__4_ in
            let _symbolstartpos = _startpos__1_ in
            
# 3031 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      let exp = Pexp_ident(array_function ~loc "Array" "get") in
      mkexp(Pexp_apply(mkexp ~ghost:true ~loc exp, [Nolabel,_1; Nolabel,_3]))
    )
# 48778 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__4_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 48787 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 48793 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _3 : 'tv_expr = Obj.magic _3 in
        let x : unit = Obj.magic x in
        let _1 : 'tv_simple_expr_no_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _4 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 48845 "reason_parser.ml"
              
            in
            let _2 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 48854 "reason_parser.ml"
              
            in
            
# 3036 "reason_parser.mly"
    ( unclosed_exp (with_txt _2 "(") (with_txt _4 ")") )
# 48860 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos_x_inlined1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 48869 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 48875 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_expr = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_simple_expr_no_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _endpos = _endpos__5_ in
            let _symbolstartpos = _startpos__1_ in
            
# 3038 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      let exp = Pexp_ident(array_function ~loc "String" "get") in
      mkexp(Pexp_apply(mkexp ~ghost:true ~loc exp, [Nolabel,_1; Nolabel,_4]))
    )
# 48935 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__5_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 48944 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 48950 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _4 : 'tv_expr = Obj.magic _4 in
        let x : unit = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_simple_expr_no_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _5 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 49009 "reason_parser.ml"
              
            in
            let _3 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 49018 "reason_parser.ml"
              
            in
            
# 3043 "reason_parser.mly"
    ( unclosed_exp (with_txt _3 "[") (with_txt _5 "]") )
# 49024 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos_x_inlined1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 49033 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 49039 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined2;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _1_inlined1;
                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _1;
                    MenhirLib.EngineTypes.startp = _startpos__1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_option_COMMA_ = Obj.magic _4 in
        let _1_inlined2 : 'tv_lseparated_nonempty_list_aux_COMMA_expr_ = Obj.magic _1_inlined2 in
        let _2 : unit = Obj.magic _2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_simple_expr_no_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _2 =
              let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in
              let _3 =
                let _1 = _1_inlined1 in
                
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 49105 "reason_parser.ml"
                
              in
              
# 2988 "reason_parser.mly"
                                                                 ( _3 )
# 49111 "reason_parser.ml"
              
            in
            let _endpos__2_ = _endpos__5_ in
            let _endpos = _endpos__2_ in
            let _symbolstartpos = _startpos__1_ in
            
# 3045 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      bigarray_get ~loc _1 _2 )
# 49121 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__5_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 49130 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 49136 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_record_expr = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 49194 "reason_parser.ml"
              
            in
            let _startpos__1_ = _startpos_x_ in
            let _endpos = _endpos__5_ in
            let _symbolstartpos = _startpos__1_ in
            
# 3048 "reason_parser.mly"
    ( let (exten, fields) = _4 in
      let loc = mklocation _symbolstartpos _endpos in
      let rec_exp = mkexp ~loc (Pexp_record (fields, exten)) in
      mkexp(Pexp_open(Fresh, _1, rec_exp))
    )
# 49207 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__5_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 49216 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 49222 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _4 : 'tv_record_expr = Obj.magic _4 in
        let x : unit = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_mod_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _5 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 49281 "reason_parser.ml"
              
            in
            let _3 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 49290 "reason_parser.ml"
              
            in
            
# 3054 "reason_parser.mly"
    ( unclosed_exp (with_txt _3 "{") (with_txt _5 "}") )
# 49296 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos_x_inlined1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 49305 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 49311 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_record_expr_with_string_keys = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 49369 "reason_parser.ml"
              
            in
            let _startpos__1_ = _startpos_x_ in
            let _endpos = _endpos__5_ in
            let _symbolstartpos = _startpos__1_ in
            
# 3056 "reason_parser.mly"
    ( let (exten, fields) = _4 in
      let loc = mklocation _symbolstartpos _endpos in
      let rec_exp = mkexp ~loc (Pexp_extension (mkloc ("bs.obj") loc,
             PStr [mkstrexp (mkexp ~loc (Pexp_record(fields, exten))) []]))
      in
      mkexp(Pexp_open(Fresh, _1, rec_exp))
    )
# 49384 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__5_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 49393 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 49399 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _4 : 'tv_record_expr_with_string_keys = Obj.magic _4 in
        let x : unit = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_mod_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _5 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 49458 "reason_parser.ml"
              
            in
            let _3 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 49467 "reason_parser.ml"
              
            in
            
# 3064 "reason_parser.mly"
    ( unclosed_exp (with_txt _3 "{") (with_txt _5 "}") )
# 49473 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos_x_inlined1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 49482 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 49488 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_expr_list = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 49546 "reason_parser.ml"
              
            in
            let _startpos__1_ = _startpos_x_ in
            let _endpos = _endpos__5_ in
            let _symbolstartpos = _startpos__1_ in
            
# 3066 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      let rec_exp = Exp.mk ~loc ~attrs:[] (Pexp_array _4) in
      mkexp(Pexp_open(Fresh, _1, rec_exp))
    )
# 49558 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__5_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 49567 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 49573 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _4 : 'tv_expr_list = Obj.magic _4 in
        let x : unit = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_mod_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _5 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 49632 "reason_parser.ml"
              
            in
            let _3 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 49641 "reason_parser.ml"
              
            in
            
# 3071 "reason_parser.mly"
    ( unclosed_exp (with_txt _3 "[|") (with_txt _5 "|]") )
# 49647 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos_x_inlined1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 49656 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 49662 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_jsx_without_leading_less = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 49720 "reason_parser.ml"
              
            in
            
# 3074 "reason_parser.mly"
    ( let seq, ext_opt = [_4], None in
      let loc = mklocation _startpos__4_ _endpos__4_ in
      let list_exp = make_real_exp (mktailexp_extension loc seq ext_opt) in
      let list_exp = { list_exp with pexp_loc = loc } in
      mkexp (Pexp_open (Fresh, _1, list_exp))
    )
# 49731 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__5_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 49740 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 49746 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = x;
                MenhirLib.EngineTypes.startp = _startpos_x_;
                MenhirLib.EngineTypes.endp = _endpos_x_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 49797 "reason_parser.ml"
              
            in
            
# 3081 "reason_parser.mly"
    ( let loc = mklocation _startpos__3_ _endpos__4_ in
      let list_exp = make_real_exp (mktailexp_extension loc [] None) in
      let list_exp = { list_exp with pexp_loc = loc } in
      mkexp (Pexp_open (Fresh, _1, list_exp))
    )
# 49807 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__4_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 49816 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 49822 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_expr_comma_seq_extension = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 49880 "reason_parser.ml"
              
            in
            
# 3087 "reason_parser.mly"
    ( let seq, ext_opt = _4 in
      let loc = mklocation _startpos__4_ _endpos__4_ in
      let list_exp = make_real_exp (mktailexp_extension loc seq ext_opt) in
      let list_exp = { list_exp with pexp_loc = loc } in
      mkexp (Pexp_open (Fresh, _1, list_exp))
    )
# 49891 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__5_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 49900 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 49906 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_simple_expr_no_call = Obj.magic _2 in
        let x : (
# 1195 "reason_parser.mly"
       (string)
# 49934 "reason_parser.ml"
        ) = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 49947 "reason_parser.ml"
              
            in
            
# 3094 "reason_parser.mly"
    ( mkexp(Pexp_apply(mkoperator _1, [Nolabel, _2])) )
# 49953 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__2_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 49962 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 49968 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : 'tv_class_longident = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _2 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 50005 "reason_parser.ml"
              
            in
            
# 3104 "reason_parser.mly"
    ( mkexp (Pexp_new _2) )
# 50011 "reason_parser.ml"
            
          in
          let _startpos_x_ = _startpos__1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 50020 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 50026 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _6;
          MenhirLib.EngineTypes.startp = _startpos__6_;
          MenhirLib.EngineTypes.endp = _endpos__6_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _5;
            MenhirLib.EngineTypes.startp = _startpos__5_;
            MenhirLib.EngineTypes.endp = _endpos__5_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _3;
                MenhirLib.EngineTypes.startp = _startpos__3_;
                MenhirLib.EngineTypes.endp = _endpos__3_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _2;
                  MenhirLib.EngineTypes.startp = _startpos__2_;
                  MenhirLib.EngineTypes.endp = _endpos__2_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = x;
                    MenhirLib.EngineTypes.startp = _startpos_x_;
                    MenhirLib.EngineTypes.endp = _endpos_x_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _6 : unit = Obj.magic _6 in
        let _5 : 'tv_option_COMMA_ = Obj.magic _5 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_field_expr_ = Obj.magic _1 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__6_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _4 =
              let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 50089 "reason_parser.ml"
               in
              
# 3606 "reason_parser.mly"
                                                                     ( _1 )
# 50094 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 50103 "reason_parser.ml"
              
            in
            let _startpos__1_ = _startpos_x_ in
            let _endpos = _endpos__6_ in
            let _symbolstartpos = _startpos__1_ in
            
# 3106 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      let exp = Exp.mk ~loc ~attrs:[] (Pexp_override _4) in
      mkexp (Pexp_open(Fresh, _1, exp))
    )
# 50115 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__6_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 50124 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 50130 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _5;
            MenhirLib.EngineTypes.startp = _startpos__5_;
            MenhirLib.EngineTypes.endp = _endpos__5_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = x;
                MenhirLib.EngineTypes.startp = _startpos_x_;
                MenhirLib.EngineTypes.endp = _endpos_x_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _2;
                  MenhirLib.EngineTypes.startp = _startpos__2_;
                  MenhirLib.EngineTypes.endp = _endpos__2_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _1;
                    MenhirLib.EngineTypes.startp = _startpos__1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _5 : 'tv_option_COMMA_ = Obj.magic _5 in
        let _1_inlined1 : 'tv_lseparated_nonempty_list_aux_COMMA_field_expr_ = Obj.magic _1_inlined1 in
        let x : unit = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_mod_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _6 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 50196 "reason_parser.ml"
              
            in
            let _4 =
              let _1 = _1_inlined1 in
              let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 50204 "reason_parser.ml"
               in
              
# 3606 "reason_parser.mly"
                                                                     ( _1 )
# 50209 "reason_parser.ml"
              
            in
            let _3 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 50218 "reason_parser.ml"
              
            in
            
# 3111 "reason_parser.mly"
    ( unclosed_exp (with_txt _3 "{<") (with_txt _6 ">}") )
# 50224 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos_x_inlined1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 50233 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 50239 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _1_inlined1;
          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _1_inlined1 : (
# 1173 "reason_parser.mly"
       (string)
# 50272 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_simple_expr_no_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_inlined1_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _3 =
              let _1 = _1_inlined1 in
              
# 4721 "reason_parser.mly"
                      ( _1 )
# 50286 "reason_parser.ml"
              
            in
            
# 3113 "reason_parser.mly"
    ( mkexp (Pexp_send(_1, _3)) )
# 50292 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_inlined1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 50301 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 50307 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_simple_expr_no_call = Obj.magic _3 in
        let x : (
# 1208 "reason_parser.mly"
       (string)
# 50341 "reason_parser.ml"
        ) = Obj.magic x in
        let _1 : 'tv_simple_expr_no_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _2 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 50355 "reason_parser.ml"
              
            in
            
# 3115 "reason_parser.mly"
    ( mkinfixop _1 (mkoperator _2) _3 )
# 50361 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 50370 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 50376 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _1_inlined1;
          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _1_inlined1 : 'tv_simple_expr_call = Obj.magic _1_inlined1 in
        let x : unit = Obj.magic x in
        let _1 : 'tv_simple_expr_no_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_inlined1_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _3 =
              let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
              let _endpos = _endpos__1_ in
              let _startpos = _startpos__1_ in
              
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 50421 "reason_parser.ml"
              
            in
            let _2 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 50430 "reason_parser.ml"
              
            in
            
# 3117 "reason_parser.mly"
    ( let op = { _2 with txt = "#=" } in
      mkinfixop _1 (mkoperator op) _3 )
# 50437 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_inlined1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 50446 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 50452 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_simple_expr_no_call = Obj.magic _3 in
        let x : unit = Obj.magic x in
        let _1 : 'tv_simple_expr_no_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _2 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 50496 "reason_parser.ml"
              
            in
            
# 3120 "reason_parser.mly"
    ( mkinfixop _1 (mkoperator {_2 with txt = "|."}) _3 )
# 50502 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 50511 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 50517 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _8;
          MenhirLib.EngineTypes.startp = _startpos__8_;
          MenhirLib.EngineTypes.endp = _endpos__8_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _7;
            MenhirLib.EngineTypes.startp = _startpos__7_;
            MenhirLib.EngineTypes.endp = _endpos__7_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _6;
              MenhirLib.EngineTypes.startp = _startpos__6_;
              MenhirLib.EngineTypes.endp = _endpos__6_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _5;
                MenhirLib.EngineTypes.startp = _startpos__5_;
                MenhirLib.EngineTypes.endp = _endpos__5_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _4;
                  MenhirLib.EngineTypes.startp = _startpos__4_;
                  MenhirLib.EngineTypes.endp = _endpos__4_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _3;
                    MenhirLib.EngineTypes.startp = _startpos__3_;
                    MenhirLib.EngineTypes.endp = _endpos__3_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _2;
                      MenhirLib.EngineTypes.startp = _startpos__2_;
                      MenhirLib.EngineTypes.endp = _endpos__2_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _menhir_s;
                        MenhirLib.EngineTypes.semv = x;
                        MenhirLib.EngineTypes.startp = _startpos_x_;
                        MenhirLib.EngineTypes.endp = _endpos_x_;
                        MenhirLib.EngineTypes.next = _menhir_stack;
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _8 : unit = Obj.magic _8 in
        let _7 : 'tv_package_type = Obj.magic _7 in
        let _6 : unit = Obj.magic _6 in
        let _5 : 'tv_module_expr = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__8_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 50596 "reason_parser.ml"
              
            in
            let _startpos__1_ = _startpos_x_ in
            let _endpos = _endpos__8_ in
            let _symbolstartpos = _startpos__1_ in
            
# 3122 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      mkexp (Pexp_open(Fresh, _1,
        mkexp ~loc (Pexp_constraint (mkexp ~ghost:true ~loc (Pexp_pack _5),
                                     mktyp ~ghost:true ~loc (Ptyp_package _7)))))
    )
# 50609 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__8_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 50618 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 50624 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _6;
            MenhirLib.EngineTypes.startp = _startpos__6_;
            MenhirLib.EngineTypes.endp = _endpos__6_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _5;
              MenhirLib.EngineTypes.startp = _startpos__5_;
              MenhirLib.EngineTypes.endp = _endpos__5_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _4;
                MenhirLib.EngineTypes.startp = _startpos__4_;
                MenhirLib.EngineTypes.endp = _endpos__4_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _2;
                    MenhirLib.EngineTypes.startp = _startpos__2_;
                    MenhirLib.EngineTypes.endp = _endpos__2_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _menhir_s;
                      MenhirLib.EngineTypes.semv = _1;
                      MenhirLib.EngineTypes.startp = _startpos__1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_;
                      MenhirLib.EngineTypes.next = _menhir_stack;
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _6 : unit = Obj.magic _6 in
        let _5 : 'tv_module_expr = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let x : unit = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_mod_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x =
            let _7 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 50697 "reason_parser.ml"
              
            in
            let _3 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 50706 "reason_parser.ml"
              
            in
            
# 3128 "reason_parser.mly"
    ( unclosed_exp (with_txt _3 "(") (with_txt _7 ")"))
# 50712 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos_x_inlined1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 50721 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 50727 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_extension = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_simple_expr_no_call = let _1 =
          let x = 
# 3130 "reason_parser.mly"
    ( mkexp (Pexp_extension _1) )
# 50753 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 50761 "reason_parser.ml"
          
        in
        
# 3160 "reason_parser.mly"
                                                                 ( _1 )
# 50767 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_simple_expr_template_constructor = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_simple_expr_no_call = 
# 3161 "reason_parser.mly"
                                     ( _1 )
# 50792 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : 'tv_val_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 50822 "reason_parser.ml"
              
            in
            
# 2999 "reason_parser.mly"
                          ( mkexp (Pexp_ident _1) )
# 50828 "reason_parser.ml"
            
          in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 50836 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 50842 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_constant = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x = 
# 3001 "reason_parser.mly"
    ( let attrs, cst = _1 in mkexp ~attrs (Pexp_constant cst) )
# 50868 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 50876 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 50882 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_jsx = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x = 
# 3002 "reason_parser.mly"
                          ( _1 )
# 50908 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 50916 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 50922 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_simple_expr_direct_argument = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x = 
# 3003 "reason_parser.mly"
                                ( _1 )
# 50948 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 50956 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 50962 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_option_COMMA_ = Obj.magic _3 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _1 =
              let _2 = 
# 4964 "reason_parser.mly"
                ( [] )
# 51004 "reason_parser.ml"
               in
              
# 2983 "reason_parser.mly"
  ( let msg = "Arrays can't use the `...` spread currently. Please use `concat` or other Array helpers." in
    filter_raise_spread_syntax msg _2
  )
# 51011 "reason_parser.ml"
              
            in
            
# 3005 "reason_parser.mly"
    ( mkexp (Pexp_array _1) )
# 51017 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__4_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 51026 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 51032 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_option_COMMA_ = Obj.magic _3 in
        let _1_inlined1 : 'tv_lseparated_nonempty_list_aux_COMMA_opt_spread_expr_optional_constraint__ = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _1 =
              let _2 =
                let _1 = _1_inlined1 in
                let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 51083 "reason_parser.ml"
                 in
                
# 4965 "reason_parser.mly"
                                     ( _1 )
# 51088 "reason_parser.ml"
                
              in
              
# 2983 "reason_parser.mly"
  ( let msg = "Arrays can't use the `...` spread currently. Please use `concat` or other Array helpers." in
    filter_raise_spread_syntax msg _2
  )
# 51096 "reason_parser.ml"
              
            in
            
# 3005 "reason_parser.mly"
    ( mkexp (Pexp_array _1) )
# 51102 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__4_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 51111 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 51117 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : 'tv_constr_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 51147 "reason_parser.ml"
              
            in
            
# 3009 "reason_parser.mly"
    ( mkexp (Pexp_construct (_1, None)) )
# 51153 "reason_parser.ml"
            
          in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 51161 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 51167 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_ident = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _1 = 
# 4719 "reason_parser.mly"
                                  ( _2 )
# 51201 "reason_parser.ml"
             in
            
# 3011 "reason_parser.mly"
    ( mkexp (Pexp_variant (_1, None)) )
# 51206 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 51215 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 51221 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_expr_list = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _endpos = _endpos__3_ in
            let _startpos = _startpos__1_ in
            
# 3013 "reason_parser.mly"
    ( may_tuple _startpos _endpos _2 )
# 51264 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 51273 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 51279 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _2 : 'tv_expr_list = Obj.magic _2 in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _3 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 51324 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 51333 "reason_parser.ml"
              
            in
            
# 3015 "reason_parser.mly"
    ( unclosed_exp (with_txt _1 "(") (with_txt _3 ")") )
# 51339 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos_x_inlined1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 51348 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 51354 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : (
# 1196 "reason_parser.mly"
       (string)
# 51381 "reason_parser.ml"
        ) = Obj.magic x in
        let _1 : 'tv_simple_expr_no_constructor = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _2 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 51395 "reason_parser.ml"
              
            in
            
# 3017 "reason_parser.mly"
    ( mkexp(Pexp_apply(mkoperator _2, [Nolabel, _1])) )
# 51401 "reason_parser.ml"
            
          in
          let _startpos_x_ = _startpos__1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 51410 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 51416 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_expr_list = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 51474 "reason_parser.ml"
              
            in
            
# 3019 "reason_parser.mly"
    ( mkexp(Pexp_open(Fresh, _1, may_tuple _startpos__3_ _endpos__5_ _4)) )
# 51480 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__5_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 51489 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 51495 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _4 : 'tv_expr_list = Obj.magic _4 in
        let x : unit = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_mod_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _5 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 51554 "reason_parser.ml"
              
            in
            let _3 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 51563 "reason_parser.ml"
              
            in
            
# 3021 "reason_parser.mly"
    ( unclosed_exp (with_txt _3 "(") (with_txt _5 ")") )
# 51569 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos_x_inlined1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 51578 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 51584 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x : 'tv_label_longident = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_simple_expr_no_constructor = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _3 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 51628 "reason_parser.ml"
              
            in
            
# 3023 "reason_parser.mly"
    ( mkexp(Pexp_field(_1, _3)) )
# 51634 "reason_parser.ml"
            
          in
          let _startpos_x_ = _startpos__1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 51643 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 51649 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = x;
                MenhirLib.EngineTypes.startp = _startpos_x_;
                MenhirLib.EngineTypes.endp = _endpos_x_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 51700 "reason_parser.ml"
              
            in
            let _startpos__1_ = _startpos_x_ in
            let _endpos = _endpos__4_ in
            let _symbolstartpos = _startpos__1_ in
            
# 3025 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      let pat = mkpat (Ppat_var (mkloc "this" loc)) in
      mkexp(Pexp_open (Fresh, _1,
                       mkexp(Pexp_object(Cstr.mk pat []))))
    )
# 51713 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__4_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 51722 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 51728 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_simple_expr_no_constructor = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _endpos = _endpos__4_ in
            let _symbolstartpos = _startpos__1_ in
            
# 3031 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      let exp = Pexp_ident(array_function ~loc "Array" "get") in
      mkexp(Pexp_apply(mkexp ~ghost:true ~loc exp, [Nolabel,_1; Nolabel,_3]))
    )
# 51781 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__4_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 51790 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 51796 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _3 : 'tv_expr = Obj.magic _3 in
        let x : unit = Obj.magic x in
        let _1 : 'tv_simple_expr_no_constructor = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _4 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 51848 "reason_parser.ml"
              
            in
            let _2 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 51857 "reason_parser.ml"
              
            in
            
# 3036 "reason_parser.mly"
    ( unclosed_exp (with_txt _2 "(") (with_txt _4 ")") )
# 51863 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos_x_inlined1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 51872 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 51878 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_expr = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_simple_expr_no_constructor = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _endpos = _endpos__5_ in
            let _symbolstartpos = _startpos__1_ in
            
# 3038 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      let exp = Pexp_ident(array_function ~loc "String" "get") in
      mkexp(Pexp_apply(mkexp ~ghost:true ~loc exp, [Nolabel,_1; Nolabel,_4]))
    )
# 51938 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__5_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 51947 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 51953 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _4 : 'tv_expr = Obj.magic _4 in
        let x : unit = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_simple_expr_no_constructor = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _5 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 52012 "reason_parser.ml"
              
            in
            let _3 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 52021 "reason_parser.ml"
              
            in
            
# 3043 "reason_parser.mly"
    ( unclosed_exp (with_txt _3 "[") (with_txt _5 "]") )
# 52027 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos_x_inlined1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 52036 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 52042 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined2;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _1_inlined1;
                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _1;
                    MenhirLib.EngineTypes.startp = _startpos__1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_option_COMMA_ = Obj.magic _4 in
        let _1_inlined2 : 'tv_lseparated_nonempty_list_aux_COMMA_expr_ = Obj.magic _1_inlined2 in
        let _2 : unit = Obj.magic _2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_simple_expr_no_constructor = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _2 =
              let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in
              let _3 =
                let _1 = _1_inlined1 in
                
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 52108 "reason_parser.ml"
                
              in
              
# 2988 "reason_parser.mly"
                                                                 ( _3 )
# 52114 "reason_parser.ml"
              
            in
            let _endpos__2_ = _endpos__5_ in
            let _endpos = _endpos__2_ in
            let _symbolstartpos = _startpos__1_ in
            
# 3045 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      bigarray_get ~loc _1 _2 )
# 52124 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__5_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 52133 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 52139 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_record_expr = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 52197 "reason_parser.ml"
              
            in
            let _startpos__1_ = _startpos_x_ in
            let _endpos = _endpos__5_ in
            let _symbolstartpos = _startpos__1_ in
            
# 3048 "reason_parser.mly"
    ( let (exten, fields) = _4 in
      let loc = mklocation _symbolstartpos _endpos in
      let rec_exp = mkexp ~loc (Pexp_record (fields, exten)) in
      mkexp(Pexp_open(Fresh, _1, rec_exp))
    )
# 52210 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__5_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 52219 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 52225 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _4 : 'tv_record_expr = Obj.magic _4 in
        let x : unit = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_mod_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _5 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 52284 "reason_parser.ml"
              
            in
            let _3 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 52293 "reason_parser.ml"
              
            in
            
# 3054 "reason_parser.mly"
    ( unclosed_exp (with_txt _3 "{") (with_txt _5 "}") )
# 52299 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos_x_inlined1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 52308 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 52314 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_record_expr_with_string_keys = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 52372 "reason_parser.ml"
              
            in
            let _startpos__1_ = _startpos_x_ in
            let _endpos = _endpos__5_ in
            let _symbolstartpos = _startpos__1_ in
            
# 3056 "reason_parser.mly"
    ( let (exten, fields) = _4 in
      let loc = mklocation _symbolstartpos _endpos in
      let rec_exp = mkexp ~loc (Pexp_extension (mkloc ("bs.obj") loc,
             PStr [mkstrexp (mkexp ~loc (Pexp_record(fields, exten))) []]))
      in
      mkexp(Pexp_open(Fresh, _1, rec_exp))
    )
# 52387 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__5_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 52396 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 52402 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _4 : 'tv_record_expr_with_string_keys = Obj.magic _4 in
        let x : unit = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_mod_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _5 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 52461 "reason_parser.ml"
              
            in
            let _3 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 52470 "reason_parser.ml"
              
            in
            
# 3064 "reason_parser.mly"
    ( unclosed_exp (with_txt _3 "{") (with_txt _5 "}") )
# 52476 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos_x_inlined1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 52485 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 52491 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_expr_list = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 52549 "reason_parser.ml"
              
            in
            let _startpos__1_ = _startpos_x_ in
            let _endpos = _endpos__5_ in
            let _symbolstartpos = _startpos__1_ in
            
# 3066 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      let rec_exp = Exp.mk ~loc ~attrs:[] (Pexp_array _4) in
      mkexp(Pexp_open(Fresh, _1, rec_exp))
    )
# 52561 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__5_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 52570 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 52576 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _4 : 'tv_expr_list = Obj.magic _4 in
        let x : unit = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_mod_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _5 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 52635 "reason_parser.ml"
              
            in
            let _3 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 52644 "reason_parser.ml"
              
            in
            
# 3071 "reason_parser.mly"
    ( unclosed_exp (with_txt _3 "[|") (with_txt _5 "|]") )
# 52650 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos_x_inlined1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 52659 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 52665 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_jsx_without_leading_less = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 52723 "reason_parser.ml"
              
            in
            
# 3074 "reason_parser.mly"
    ( let seq, ext_opt = [_4], None in
      let loc = mklocation _startpos__4_ _endpos__4_ in
      let list_exp = make_real_exp (mktailexp_extension loc seq ext_opt) in
      let list_exp = { list_exp with pexp_loc = loc } in
      mkexp (Pexp_open (Fresh, _1, list_exp))
    )
# 52734 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__5_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 52743 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 52749 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = x;
                MenhirLib.EngineTypes.startp = _startpos_x_;
                MenhirLib.EngineTypes.endp = _endpos_x_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 52800 "reason_parser.ml"
              
            in
            
# 3081 "reason_parser.mly"
    ( let loc = mklocation _startpos__3_ _endpos__4_ in
      let list_exp = make_real_exp (mktailexp_extension loc [] None) in
      let list_exp = { list_exp with pexp_loc = loc } in
      mkexp (Pexp_open (Fresh, _1, list_exp))
    )
# 52810 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__4_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 52819 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 52825 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_expr_comma_seq_extension = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 52883 "reason_parser.ml"
              
            in
            
# 3087 "reason_parser.mly"
    ( let seq, ext_opt = _4 in
      let loc = mklocation _startpos__4_ _endpos__4_ in
      let list_exp = make_real_exp (mktailexp_extension loc seq ext_opt) in
      let list_exp = { list_exp with pexp_loc = loc } in
      mkexp (Pexp_open (Fresh, _1, list_exp))
    )
# 52894 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__5_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 52903 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 52909 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_simple_expr_no_constructor = Obj.magic _2 in
        let x : (
# 1195 "reason_parser.mly"
       (string)
# 52937 "reason_parser.ml"
        ) = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 52950 "reason_parser.ml"
              
            in
            
# 3094 "reason_parser.mly"
    ( mkexp(Pexp_apply(mkoperator _1, [Nolabel, _2])) )
# 52956 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__2_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 52965 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 52971 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let x : 'tv_class_longident = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _2 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 53008 "reason_parser.ml"
              
            in
            
# 3104 "reason_parser.mly"
    ( mkexp (Pexp_new _2) )
# 53014 "reason_parser.ml"
            
          in
          let _startpos_x_ = _startpos__1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 53023 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 53029 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _6;
          MenhirLib.EngineTypes.startp = _startpos__6_;
          MenhirLib.EngineTypes.endp = _endpos__6_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _5;
            MenhirLib.EngineTypes.startp = _startpos__5_;
            MenhirLib.EngineTypes.endp = _endpos__5_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _3;
                MenhirLib.EngineTypes.startp = _startpos__3_;
                MenhirLib.EngineTypes.endp = _endpos__3_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _2;
                  MenhirLib.EngineTypes.startp = _startpos__2_;
                  MenhirLib.EngineTypes.endp = _endpos__2_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = x;
                    MenhirLib.EngineTypes.startp = _startpos_x_;
                    MenhirLib.EngineTypes.endp = _endpos_x_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _6 : unit = Obj.magic _6 in
        let _5 : 'tv_option_COMMA_ = Obj.magic _5 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_field_expr_ = Obj.magic _1 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__6_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _4 =
              let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 53092 "reason_parser.ml"
               in
              
# 3606 "reason_parser.mly"
                                                                     ( _1 )
# 53097 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 53106 "reason_parser.ml"
              
            in
            let _startpos__1_ = _startpos_x_ in
            let _endpos = _endpos__6_ in
            let _symbolstartpos = _startpos__1_ in
            
# 3106 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      let exp = Exp.mk ~loc ~attrs:[] (Pexp_override _4) in
      mkexp (Pexp_open(Fresh, _1, exp))
    )
# 53118 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__6_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 53127 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 53133 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _5;
            MenhirLib.EngineTypes.startp = _startpos__5_;
            MenhirLib.EngineTypes.endp = _endpos__5_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = x;
                MenhirLib.EngineTypes.startp = _startpos_x_;
                MenhirLib.EngineTypes.endp = _endpos_x_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _2;
                  MenhirLib.EngineTypes.startp = _startpos__2_;
                  MenhirLib.EngineTypes.endp = _endpos__2_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _1;
                    MenhirLib.EngineTypes.startp = _startpos__1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _5 : 'tv_option_COMMA_ = Obj.magic _5 in
        let _1_inlined1 : 'tv_lseparated_nonempty_list_aux_COMMA_field_expr_ = Obj.magic _1_inlined1 in
        let x : unit = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_mod_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _6 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 53199 "reason_parser.ml"
              
            in
            let _4 =
              let _1 = _1_inlined1 in
              let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 53207 "reason_parser.ml"
               in
              
# 3606 "reason_parser.mly"
                                                                     ( _1 )
# 53212 "reason_parser.ml"
              
            in
            let _3 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 53221 "reason_parser.ml"
              
            in
            
# 3111 "reason_parser.mly"
    ( unclosed_exp (with_txt _3 "{<") (with_txt _6 ">}") )
# 53227 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos_x_inlined1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 53236 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 53242 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _1_inlined1;
          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _1_inlined1 : (
# 1173 "reason_parser.mly"
       (string)
# 53275 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_simple_expr_no_constructor = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_inlined1_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _3 =
              let _1 = _1_inlined1 in
              
# 4721 "reason_parser.mly"
                      ( _1 )
# 53289 "reason_parser.ml"
              
            in
            
# 3113 "reason_parser.mly"
    ( mkexp (Pexp_send(_1, _3)) )
# 53295 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_inlined1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 53304 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 53310 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_simple_expr_no_call = Obj.magic _3 in
        let x : (
# 1208 "reason_parser.mly"
       (string)
# 53344 "reason_parser.ml"
        ) = Obj.magic x in
        let _1 : 'tv_simple_expr_no_constructor = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _2 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 53358 "reason_parser.ml"
              
            in
            
# 3115 "reason_parser.mly"
    ( mkinfixop _1 (mkoperator _2) _3 )
# 53364 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 53373 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 53379 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _1_inlined1;
          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _1_inlined1 : 'tv_simple_expr_call = Obj.magic _1_inlined1 in
        let x : unit = Obj.magic x in
        let _1 : 'tv_simple_expr_no_constructor = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_inlined1_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _3 =
              let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
              let _endpos = _endpos__1_ in
              let _startpos = _startpos__1_ in
              
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 53424 "reason_parser.ml"
              
            in
            let _2 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 53433 "reason_parser.ml"
              
            in
            
# 3117 "reason_parser.mly"
    ( let op = { _2 with txt = "#=" } in
      mkinfixop _1 (mkoperator op) _3 )
# 53440 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_inlined1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 53449 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 53455 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_simple_expr_no_call = Obj.magic _3 in
        let x : unit = Obj.magic x in
        let _1 : 'tv_simple_expr_no_constructor = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _2 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 53499 "reason_parser.ml"
              
            in
            
# 3120 "reason_parser.mly"
    ( mkinfixop _1 (mkoperator {_2 with txt = "|."}) _3 )
# 53505 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 53514 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 53520 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _8;
          MenhirLib.EngineTypes.startp = _startpos__8_;
          MenhirLib.EngineTypes.endp = _endpos__8_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _7;
            MenhirLib.EngineTypes.startp = _startpos__7_;
            MenhirLib.EngineTypes.endp = _endpos__7_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _6;
              MenhirLib.EngineTypes.startp = _startpos__6_;
              MenhirLib.EngineTypes.endp = _endpos__6_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _5;
                MenhirLib.EngineTypes.startp = _startpos__5_;
                MenhirLib.EngineTypes.endp = _endpos__5_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _4;
                  MenhirLib.EngineTypes.startp = _startpos__4_;
                  MenhirLib.EngineTypes.endp = _endpos__4_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _3;
                    MenhirLib.EngineTypes.startp = _startpos__3_;
                    MenhirLib.EngineTypes.endp = _endpos__3_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _2;
                      MenhirLib.EngineTypes.startp = _startpos__2_;
                      MenhirLib.EngineTypes.endp = _endpos__2_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _menhir_s;
                        MenhirLib.EngineTypes.semv = x;
                        MenhirLib.EngineTypes.startp = _startpos_x_;
                        MenhirLib.EngineTypes.endp = _endpos_x_;
                        MenhirLib.EngineTypes.next = _menhir_stack;
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _8 : unit = Obj.magic _8 in
        let _7 : 'tv_package_type = Obj.magic _7 in
        let _6 : unit = Obj.magic _6 in
        let _5 : 'tv_module_expr = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__8_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 53599 "reason_parser.ml"
              
            in
            let _startpos__1_ = _startpos_x_ in
            let _endpos = _endpos__8_ in
            let _symbolstartpos = _startpos__1_ in
            
# 3122 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      mkexp (Pexp_open(Fresh, _1,
        mkexp ~loc (Pexp_constraint (mkexp ~ghost:true ~loc (Pexp_pack _5),
                                     mktyp ~ghost:true ~loc (Ptyp_package _7)))))
    )
# 53612 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos__8_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 53621 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 53627 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _6;
            MenhirLib.EngineTypes.startp = _startpos__6_;
            MenhirLib.EngineTypes.endp = _endpos__6_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _5;
              MenhirLib.EngineTypes.startp = _startpos__5_;
              MenhirLib.EngineTypes.endp = _endpos__5_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _4;
                MenhirLib.EngineTypes.startp = _startpos__4_;
                MenhirLib.EngineTypes.endp = _endpos__4_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _2;
                    MenhirLib.EngineTypes.startp = _startpos__2_;
                    MenhirLib.EngineTypes.endp = _endpos__2_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _menhir_s;
                      MenhirLib.EngineTypes.semv = _1;
                      MenhirLib.EngineTypes.startp = _startpos__1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_;
                      MenhirLib.EngineTypes.next = _menhir_stack;
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _6 : unit = Obj.magic _6 in
        let _5 : 'tv_module_expr = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let x : unit = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_mod_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x =
            let _7 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 53700 "reason_parser.ml"
              
            in
            let _3 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 53709 "reason_parser.ml"
              
            in
            
# 3128 "reason_parser.mly"
    ( unclosed_exp (with_txt _3 "(") (with_txt _7 ")"))
# 53715 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos_x_inlined1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 53724 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 53730 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_extension = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_simple_expr_no_constructor = let _1 =
          let x = 
# 3130 "reason_parser.mly"
    ( mkexp (Pexp_extension _1) )
# 53756 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 53764 "reason_parser.ml"
          
        in
        
# 3136 "reason_parser.mly"
                                                                      ( _1 )
# 53770 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _1 : 'tv_non_labeled_argument_list = Obj.magic _1 in
        let x : 'tv_constr_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_simple_expr_template_constructor = let _2 =
          let x = 
# 3141 "reason_parser.mly"
                                    ( mkexp (Pexp_tuple(_1)) )
# 53803 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 53811 "reason_parser.ml"
          
        in
        let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 53820 "reason_parser.ml"
          
        in
        
# 3144 "reason_parser.mly"
    ( mkExplicitArityTupleExp (Pexp_construct(_1, Some _2))
    )
# 53827 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _1 : 'tv_simple_expr_direct_argument = Obj.magic _1 in
        let x : 'tv_constr_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_simple_expr_template_constructor = let _2 =
          let x = 
# 3142 "reason_parser.mly"
                                    ( _1 )
# 53860 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 53868 "reason_parser.ml"
          
        in
        let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 53877 "reason_parser.ml"
          
        in
        
# 3144 "reason_parser.mly"
    ( mkExplicitArityTupleExp (Pexp_construct(_1, Some _2))
    )
# 53884 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _1_inlined1;
          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _1_inlined1 : 'tv_non_labeled_argument_list = Obj.magic _1_inlined1 in
        let _2_inlined1 : 'tv_ident = Obj.magic _2_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_inlined1_ in
        let _v : 'tv_simple_expr_template_constructor = let _2 =
          let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
          let x = 
# 3149 "reason_parser.mly"
        ( (* only wrap in a tuple if there are more than one arguments *)
          match _1 with
          | [x] -> x
          | l -> mkexp (Pexp_tuple(l))
        )
# 53929 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 53937 "reason_parser.ml"
          
        in
        let _1 =
          let _2 = _2_inlined1 in
          
# 4719 "reason_parser.mly"
                                  ( _2 )
# 53945 "reason_parser.ml"
          
        in
        
# 3156 "reason_parser.mly"
    ( mkexp(Pexp_variant(_1, Some _2)) )
# 53951 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _1_inlined1;
          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _1_inlined1 : 'tv_simple_expr_direct_argument = Obj.magic _1_inlined1 in
        let _2_inlined1 : 'tv_ident = Obj.magic _2_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_inlined1_ in
        let _v : 'tv_simple_expr_template_constructor = let _2 =
          let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
          let x = 
# 3154 "reason_parser.mly"
                                    ( _1 )
# 53992 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 54000 "reason_parser.ml"
          
        in
        let _1 =
          let _2 = _2_inlined1 in
          
# 4719 "reason_parser.mly"
                                  ( _2 )
# 54008 "reason_parser.ml"
          
        in
        
# 3156 "reason_parser.mly"
    ( mkexp(Pexp_variant(_1, Some _2)) )
# 54014 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let x : 'tv_module_parameter = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_simple_module_type = let _1 =
          let x =
            let _1 =
              let _1 = 
# 200 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 54056 "reason_parser.ml"
               in
              
# 4978 "reason_parser.mly"
                                                       ( _1 )
# 54061 "reason_parser.ml"
              
            in
            
# 1786 "reason_parser.mly"
    ( match _1.txt with
      | (None, Some x) -> x
      | _ -> syntax_error_mod _1.loc "Expecting a simple module type"
    )
# 54070 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4916 "reason_parser.mly"
  ( {x with pmty_loc = {x.pmty_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 54079 "reason_parser.ml"
          
        in
        
# 1799 "reason_parser.mly"
    (_1)
# 54085 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_module_type_signature = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_simple_module_type = let _1 =
          let x = 
# 1790 "reason_parser.mly"
                          ( _1 )
# 54111 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4916 "reason_parser.mly"
  ( {x with pmty_loc = {x.pmty_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 54119 "reason_parser.ml"
          
        in
        
# 1799 "reason_parser.mly"
    (_1)
# 54125 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _2 : 'tv_module_type = Obj.magic _2 in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_module_type = let _1 =
          let x =
            let _3 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 54170 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 54179 "reason_parser.ml"
              
            in
            
# 1792 "reason_parser.mly"
    ( unclosed_mty (with_txt _1 "(") (with_txt _3 ")"))
# 54185 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos_x_inlined1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4916 "reason_parser.mly"
  ( {x with pmty_loc = {x.pmty_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 54194 "reason_parser.ml"
          
        in
        
# 1799 "reason_parser.mly"
    (_1)
# 54200 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : 'tv_mty_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_simple_module_type = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 54230 "reason_parser.ml"
              
            in
            
# 1794 "reason_parser.mly"
    ( mkmty (Pmty_ident _1) )
# 54236 "reason_parser.ml"
            
          in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4916 "reason_parser.mly"
  ( {x with pmty_loc = {x.pmty_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 54244 "reason_parser.ml"
          
        in
        
# 1799 "reason_parser.mly"
    (_1)
# 54250 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _2 : 'tv_signature = Obj.magic _2 in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_module_type = let _1 =
          let x =
            let _3 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 54295 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 54304 "reason_parser.ml"
              
            in
            
# 1796 "reason_parser.mly"
    ( unclosed_mty (with_txt _1 "{") (with_txt _3 "}"))
# 54310 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos_x_inlined1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4916 "reason_parser.mly"
  ( {x with pmty_loc = {x.pmty_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 54319 "reason_parser.ml"
          
        in
        
# 1799 "reason_parser.mly"
    (_1)
# 54325 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_extension = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_simple_module_type = let _1 =
          let x = 
# 1798 "reason_parser.mly"
    ( mkmty (Pmty_extension _1) )
# 54351 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4916 "reason_parser.mly"
  ( {x with pmty_loc = {x.pmty_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 54359 "reason_parser.ml"
          
        in
        
# 1799 "reason_parser.mly"
    (_1)
# 54365 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_simple_pattern_ident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_simple_pattern = 
# 3746 "reason_parser.mly"
                             ( _1 )
# 54390 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_simple_pattern_not_ident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_simple_pattern = 
# 3746 "reason_parser.mly"
                             ( _1 )
# 54415 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : 'tv_constr_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_simple_pattern_direct_argument = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 54445 "reason_parser.ml"
              
            in
            
# 3658 "reason_parser.mly"
    ( mkpat(Ppat_construct(mkloc _1.txt _1.loc, None)) )
# 54451 "reason_parser.ml"
            
          in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 54459 "reason_parser.ml"
          
        in
        
# 3660 "reason_parser.mly"
    (_1)
# 54465 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : 'tv__lbl_pattern_list = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_simple_pattern_direct_argument = let _1 =
          let x =
            let _1 =
              let _1 =
                let _2 =
                  let _1 = _1_inlined1 in
                  
# 3891 "reason_parser.mly"
  ( let (fields, closed) = _1 in
    (filter_raise_spread_syntax record_pat_spread_msg fields, closed)
  )
# 54512 "reason_parser.ml"
                  
                in
                
# 3815 "reason_parser.mly"
    ( let (fields, closed) = _2 in mkpat (Ppat_record (fields, closed)) )
# 54518 "reason_parser.ml"
                
              in
              
# 3809 "reason_parser.mly"
                   ( _1 )
# 54524 "reason_parser.ml"
              
            in
            
# 3659 "reason_parser.mly"
                             ( _1 )
# 54530 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 54539 "reason_parser.ml"
          
        in
        
# 3660 "reason_parser.mly"
    (_1)
# 54545 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _1 : 'tv__lbl_pattern_list = Obj.magic _1 in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_pattern_direct_argument = let _1 =
          let x =
            let _1 =
              let _1 =
                let _3 =
                  let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
                  let _endpos = _endpos_x_ in
                  let _symbolstartpos = _startpos_x_ in
                  
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 54592 "reason_parser.ml"
                  
                in
                let _2 = 
# 3891 "reason_parser.mly"
  ( let (fields, closed) = _1 in
    (filter_raise_spread_syntax record_pat_spread_msg fields, closed)
  )
# 54600 "reason_parser.ml"
                 in
                let _1 =
                  let _endpos = _endpos_x_ in
                  let _symbolstartpos = _startpos_x_ in
                  
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 54608 "reason_parser.ml"
                  
                in
                
# 3817 "reason_parser.mly"
    ( unclosed_pat (with_txt _1 "{") (with_txt _3 "}") )
# 54614 "reason_parser.ml"
                
              in
              
# 3809 "reason_parser.mly"
                   ( _1 )
# 54620 "reason_parser.ml"
              
            in
            
# 3659 "reason_parser.mly"
                             ( _1 )
# 54626 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos_x_inlined1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 54635 "reason_parser.ml"
          
        in
        
# 3660 "reason_parser.mly"
    (_1)
# 54641 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_pattern_comma_list_extension = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_simple_pattern_direct_argument = let _1 =
          let x =
            let _1 =
              let _1 = 
# 3822 "reason_parser.mly"
    ( make_real_pat (mktailpat_extension (mklocation _startpos__2_ _endpos__2_) _2) )
# 54683 "reason_parser.ml"
               in
              
# 3810 "reason_parser.mly"
                   ( _1 )
# 54688 "reason_parser.ml"
              
            in
            
# 3659 "reason_parser.mly"
                             ( _1 )
# 54694 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 54703 "reason_parser.ml"
          
        in
        
# 3660 "reason_parser.mly"
    (_1)
# 54709 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _2 : 'tv_pattern_comma_list_extension = Obj.magic _2 in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_pattern_direct_argument = let _1 =
          let x =
            let _1 =
              let _1 =
                let _3 =
                  let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
                  let _endpos = _endpos_x_ in
                  let _symbolstartpos = _startpos_x_ in
                  
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 54756 "reason_parser.ml"
                  
                in
                let _1 =
                  let _endpos = _endpos_x_ in
                  let _symbolstartpos = _startpos_x_ in
                  
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 54765 "reason_parser.ml"
                  
                in
                
# 3824 "reason_parser.mly"
    ( unclosed_pat (with_txt _1 "[") (with_txt _3 "]") )
# 54771 "reason_parser.ml"
                
              in
              
# 3810 "reason_parser.mly"
                   ( _1 )
# 54777 "reason_parser.ml"
              
            in
            
# 3659 "reason_parser.mly"
                             ( _1 )
# 54783 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos_x_inlined1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 54792 "reason_parser.ml"
          
        in
        
# 3660 "reason_parser.mly"
    (_1)
# 54798 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_loption_terminated_pattern_comma_list_option_COMMA___ = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_simple_pattern_direct_argument = let _1 =
          let x =
            let _1 =
              let _1 = 
# 3829 "reason_parser.mly"
    ( mkpat (Ppat_array _2) )
# 54840 "reason_parser.ml"
               in
              
# 3811 "reason_parser.mly"
                   ( _1 )
# 54845 "reason_parser.ml"
              
            in
            
# 3659 "reason_parser.mly"
                             ( _1 )
# 54851 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 54860 "reason_parser.ml"
          
        in
        
# 3660 "reason_parser.mly"
    (_1)
# 54866 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : 'tv_val_ident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_simple_pattern_ident = let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 54894 "reason_parser.ml"
          
        in
        
# 3750 "reason_parser.mly"
                    ( mkpat ~loc:_1.loc (Ppat_var _1) )
# 54900 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_simple_pattern_not_ident = let _1 =
          let x = 
# 3756 "reason_parser.mly"
    ( mkpat (Ppat_any) )
# 54926 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 54934 "reason_parser.ml"
          
        in
        
# 3789 "reason_parser.mly"
    (_1)
# 54940 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_signed_constant = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_simple_pattern_not_ident = let _1 =
          let x = 
# 3758 "reason_parser.mly"
    ( let attrs, cst = _1 in mkpat ~attrs (Ppat_constant cst) )
# 54966 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 54974 "reason_parser.ml"
          
        in
        
# 3789 "reason_parser.mly"
    (_1)
# 54980 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_signed_constant = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_signed_constant = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_simple_pattern_not_ident = let _1 =
          let x = 
# 3760 "reason_parser.mly"
    ( mkpat (Ppat_interval (snd _1, snd _3)) )
# 55020 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 55028 "reason_parser.ml"
          
        in
        
# 3789 "reason_parser.mly"
    (_1)
# 55034 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let x : 'tv_constr_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_simple_pattern_not_ident = let _1 =
          let x =
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 55064 "reason_parser.ml"
              
            in
            
# 3762 "reason_parser.mly"
    ( mkpat (Ppat_construct (_1, None)) )
# 55070 "reason_parser.ml"
            
          in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 55078 "reason_parser.ml"
          
        in
        
# 3789 "reason_parser.mly"
    (_1)
# 55084 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_ident = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_simple_pattern_not_ident = let _1 =
          let x =
            let _1 = 
# 4719 "reason_parser.mly"
                                  ( _2 )
# 55118 "reason_parser.ml"
             in
            
# 3764 "reason_parser.mly"
    ( mkpat (Ppat_variant (_1, None)) )
# 55123 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 55132 "reason_parser.ml"
          
        in
        
# 3789 "reason_parser.mly"
    (_1)
# 55138 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_type_longident = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_simple_pattern_not_ident = let _1 =
          let x = 
# 3766 "reason_parser.mly"
    ( mkpat (Ppat_type (_2)) )
# 55171 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 55179 "reason_parser.ml"
          
        in
        
# 3789 "reason_parser.mly"
    (_1)
# 55185 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = x;
                MenhirLib.EngineTypes.startp = _startpos_x_;
                MenhirLib.EngineTypes.endp = _endpos_x_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _3 : 'tv_option_SEMI_ = Obj.magic _3 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_opt_spread_pattern__ = Obj.magic _1 in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_pattern_not_ident = let _1 =
          let x =
            let _4 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 55237 "reason_parser.ml"
              
            in
            let _2 =
              let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 55244 "reason_parser.ml"
               in
              
# 3858 "reason_parser.mly"
  ( let msg = "Array's `...` spread is not supported in pattern matches.
Explanation: such spread would create a subarray; out of performance concern, our pattern matching currently guarantees to never create new intermediate data.
Solution: if it's to validate the first few elements, use a `when` clause + Array size check + `get` checks on the current pattern. If it's to obtain a subarray, use `Array.sub` or `Belt.Array.slice`." in
    filter_raise_spread_syntax msg _1 )
# 55252 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 55261 "reason_parser.ml"
              
            in
            
# 3768 "reason_parser.mly"
    ( unclosed_pat (with_txt _1 "[|") (with_txt _4 "|]") )
# 55267 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos_x_inlined1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 55276 "reason_parser.ml"
          
        in
        
# 3789 "reason_parser.mly"
    (_1)
# 55282 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_option_COMMA_ = Obj.magic _3 in
        let _1_inlined1 : 'tv_lseparated_nonempty_list_aux_COMMA_pattern_optional_constraint_ = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_simple_pattern_not_ident = let _1 =
          let x =
            let _2 =
              let _1 = _1_inlined1 in
              
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 55332 "reason_parser.ml"
              
            in
            let _endpos = _endpos__4_ in
            let _startpos = _startpos__1_ in
            
# 3770 "reason_parser.mly"
    ( match _2 with
      | [] -> (* This shouldn't be possible *)
        let loc = mklocation _startpos _endpos in
        mkpat_constructor_unit loc loc
      | [hd] -> hd
      | _ :: _ -> mkpat (Ppat_tuple _2)
    )
# 55346 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__4_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 55355 "reason_parser.ml"
          
        in
        
# 3789 "reason_parser.mly"
    (_1)
# 55361 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _2 : 'tv_pattern = Obj.magic _2 in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_pattern_not_ident = let _1 =
          let x =
            let _3 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 55406 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 55415 "reason_parser.ml"
              
            in
            
# 3778 "reason_parser.mly"
    ( unclosed_pat (with_txt _1 "(") (with_txt _3 ")") )
# 55421 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos_x_inlined1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 55430 "reason_parser.ml"
          
        in
        
# 3789 "reason_parser.mly"
    (_1)
# 55436 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _4 : 'tv_core_type = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_pattern = Obj.magic _2 in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_pattern_not_ident = let _1 =
          let x =
            let _5 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 55495 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 55504 "reason_parser.ml"
              
            in
            
# 3780 "reason_parser.mly"
    ( unclosed_pat (with_txt _1 "(") (with_txt _5 ")") )
# 55510 "reason_parser.ml"
            
          in
          let _endpos_x_ = _endpos_x_inlined1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 55519 "reason_parser.ml"
          
        in
        
# 3789 "reason_parser.mly"
    (_1)
# 55525 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let x : unit = Obj.magic x in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_pattern = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_simple_pattern_not_ident = let _1 =
          let x =
            let _4 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 55576 "reason_parser.ml"
              
            in
            
# 3782 "reason_parser.mly"
    ( expecting_pat (with_txt _4 "type") )
# 55582 "reason_parser.ml"
            
          in
          let _startpos_x_ = _startpos__1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 55591 "reason_parser.ml"
          
        in
        
# 3789 "reason_parser.mly"
    (_1)
# 55597 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let x : (
# 1220 "reason_parser.mly"
       (string)
# 55637 "reason_parser.ml"
        ) = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_simple_pattern_not_ident = let _1 =
          let x =
            let _3 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 55652 "reason_parser.ml"
              
            in
            
# 3784 "reason_parser.mly"
    ( mkpat(Ppat_unpack(_3)) )
# 55658 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__4_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 55667 "reason_parser.ml"
          
        in
        
# 3789 "reason_parser.mly"
    (_1)
# 55673 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_simple_pattern_not_ident_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_simple_pattern_not_ident = let _1 =
          let x = 
# 3786 "reason_parser.mly"
    ( _1 )
# 55699 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 55707 "reason_parser.ml"
          
        in
        
# 3789 "reason_parser.mly"
    (_1)
# 55713 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_extension = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_simple_pattern_not_ident = let _1 =
          let x = 
# 3788 "reason_parser.mly"
    ( mkpat(Ppat_extension _1) )
# 55739 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4932 "reason_parser.mly"
   ( {x with ppat_loc = {x.ppat_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 55747 "reason_parser.ml"
          
        in
        
# 3789 "reason_parser.mly"
    (_1)
# 55753 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : 'tv__lbl_pattern_list = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_simple_pattern_not_ident_ = let _1 =
          let _1 =
            let _2 =
              let _1 = _1_inlined1 in
              
# 3891 "reason_parser.mly"
  ( let (fields, closed) = _1 in
    (filter_raise_spread_syntax record_pat_spread_msg fields, closed)
  )
# 55798 "reason_parser.ml"
              
            in
            
# 3815 "reason_parser.mly"
    ( let (fields, closed) = _2 in mkpat (Ppat_record (fields, closed)) )
# 55804 "reason_parser.ml"
            
          in
          
# 3809 "reason_parser.mly"
                   ( _1 )
# 55810 "reason_parser.ml"
          
        in
        
# 3793 "reason_parser.mly"
    ( _1 )
# 55816 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _1 : 'tv__lbl_pattern_list = Obj.magic _1 in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_pattern_not_ident_ = let _1 =
          let _1 =
            let _3 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 55861 "reason_parser.ml"
              
            in
            let _2 = 
# 3891 "reason_parser.mly"
  ( let (fields, closed) = _1 in
    (filter_raise_spread_syntax record_pat_spread_msg fields, closed)
  )
# 55869 "reason_parser.ml"
             in
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 55877 "reason_parser.ml"
              
            in
            
# 3817 "reason_parser.mly"
    ( unclosed_pat (with_txt _1 "{") (with_txt _3 "}") )
# 55883 "reason_parser.ml"
            
          in
          
# 3809 "reason_parser.mly"
                   ( _1 )
# 55889 "reason_parser.ml"
          
        in
        
# 3793 "reason_parser.mly"
    ( _1 )
# 55895 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_pattern_comma_list_extension = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_simple_pattern_not_ident_ = let _1 =
          let _1 = 
# 3822 "reason_parser.mly"
    ( make_real_pat (mktailpat_extension (mklocation _startpos__2_ _endpos__2_) _2) )
# 55935 "reason_parser.ml"
           in
          
# 3810 "reason_parser.mly"
                   ( _1 )
# 55940 "reason_parser.ml"
          
        in
        
# 3793 "reason_parser.mly"
    ( _1 )
# 55946 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _2 : 'tv_pattern_comma_list_extension = Obj.magic _2 in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_simple_pattern_not_ident_ = let _1 =
          let _1 =
            let _3 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 55991 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 56000 "reason_parser.ml"
              
            in
            
# 3824 "reason_parser.mly"
    ( unclosed_pat (with_txt _1 "[") (with_txt _3 "]") )
# 56006 "reason_parser.ml"
            
          in
          
# 3810 "reason_parser.mly"
                   ( _1 )
# 56012 "reason_parser.ml"
          
        in
        
# 3793 "reason_parser.mly"
    ( _1 )
# 56018 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_loption_terminated_pattern_comma_list_option_COMMA___ = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_simple_pattern_not_ident_ = let _1 =
          let _1 = 
# 3829 "reason_parser.mly"
    ( mkpat (Ppat_array _2) )
# 56058 "reason_parser.ml"
           in
          
# 3811 "reason_parser.mly"
                   ( _1 )
# 56063 "reason_parser.ml"
          
        in
        
# 3793 "reason_parser.mly"
    ( _1 )
# 56069 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : 'tv__lbl_pattern_list = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_simple_pattern_not_ident_ = let _3 =
          let _1 =
            let _2 =
              let _1 = _1_inlined1 in
              
# 3891 "reason_parser.mly"
  ( let (fields, closed) = _1 in
    (filter_raise_spread_syntax record_pat_spread_msg fields, closed)
  )
# 56128 "reason_parser.ml"
              
            in
            
# 3815 "reason_parser.mly"
    ( let (fields, closed) = _2 in mkpat (Ppat_record (fields, closed)) )
# 56134 "reason_parser.ml"
            
          in
          
# 3809 "reason_parser.mly"
                   ( _1 )
# 56140 "reason_parser.ml"
          
        in
        let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 56149 "reason_parser.ml"
          
        in
        let _startpos__1_ = _startpos_x_ in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = _startpos__1_ in
        
# 3795 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      mkpat ~loc (Ppat_open (_1, _3))
    )
# 56160 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined2;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined2_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x_inlined1;
              MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let x_inlined2 : unit = Obj.magic x_inlined2 in
        let _1 : 'tv__lbl_pattern_list = Obj.magic _1 in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_inlined2_ in
        let _v : 'tv_simple_pattern_not_ident_ = let _3 =
          let (_endpos_x_inlined1_, _startpos_x_inlined1_, _endpos_x_, _startpos_x_, x_inlined1, x) = (_endpos_x_inlined2_, _startpos_x_inlined2_, _endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined2, x_inlined1) in
          let _1 =
            let _3 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 56220 "reason_parser.ml"
              
            in
            let _2 = 
# 3891 "reason_parser.mly"
  ( let (fields, closed) = _1 in
    (filter_raise_spread_syntax record_pat_spread_msg fields, closed)
  )
# 56228 "reason_parser.ml"
             in
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 56236 "reason_parser.ml"
              
            in
            
# 3817 "reason_parser.mly"
    ( unclosed_pat (with_txt _1 "{") (with_txt _3 "}") )
# 56242 "reason_parser.ml"
            
          in
          
# 3809 "reason_parser.mly"
                   ( _1 )
# 56248 "reason_parser.ml"
          
        in
        let _endpos__3_ = _endpos_x_inlined2_ in
        let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 56258 "reason_parser.ml"
          
        in
        let _startpos__1_ = _startpos_x_ in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = _startpos__1_ in
        
# 3795 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      mkpat ~loc (Ppat_open (_1, _3))
    )
# 56269 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2_inlined1 : 'tv_pattern_comma_list_extension = Obj.magic _2_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_simple_pattern_not_ident_ = let _3 =
          let (_endpos__2_, _startpos__2_, _2) = (_endpos__2_inlined1_, _startpos__2_inlined1_, _2_inlined1) in
          let _1 = 
# 3822 "reason_parser.mly"
    ( make_real_pat (mktailpat_extension (mklocation _startpos__2_ _endpos__2_) _2) )
# 56324 "reason_parser.ml"
           in
          
# 3810 "reason_parser.mly"
                   ( _1 )
# 56329 "reason_parser.ml"
          
        in
        let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 56338 "reason_parser.ml"
          
        in
        let _startpos__1_ = _startpos_x_ in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = _startpos__1_ in
        
# 3795 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      mkpat ~loc (Ppat_open (_1, _3))
    )
# 56349 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined2;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined2_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x_inlined1;
              MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let x_inlined2 : unit = Obj.magic x_inlined2 in
        let _2_inlined1 : 'tv_pattern_comma_list_extension = Obj.magic _2_inlined1 in
        let x_inlined1 : unit = Obj.magic x_inlined1 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos_x_inlined2_ in
        let _v : 'tv_simple_pattern_not_ident_ = let _3 =
          let (_endpos_x_inlined1_, _startpos_x_inlined1_, _endpos_x_, _startpos_x_, x_inlined1, _2, x) = (_endpos_x_inlined2_, _startpos_x_inlined2_, _endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined2, _2_inlined1, x_inlined1) in
          let _1 =
            let _3 =
              let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 56409 "reason_parser.ml"
              
            in
            let _1 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 56418 "reason_parser.ml"
              
            in
            
# 3824 "reason_parser.mly"
    ( unclosed_pat (with_txt _1 "[") (with_txt _3 "]") )
# 56424 "reason_parser.ml"
            
          in
          
# 3810 "reason_parser.mly"
                   ( _1 )
# 56430 "reason_parser.ml"
          
        in
        let _endpos__3_ = _endpos_x_inlined2_ in
        let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 56440 "reason_parser.ml"
          
        in
        let _startpos__1_ = _startpos_x_ in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = _startpos__1_ in
        
# 3795 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      mkpat ~loc (Ppat_open (_1, _3))
    )
# 56451 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2_inlined1 : 'tv_loption_terminated_pattern_comma_list_option_COMMA___ = Obj.magic _2_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_simple_pattern_not_ident_ = let _3 =
          let _2 = _2_inlined1 in
          let _1 = 
# 3829 "reason_parser.mly"
    ( mkpat (Ppat_array _2) )
# 56506 "reason_parser.ml"
           in
          
# 3811 "reason_parser.mly"
                   ( _1 )
# 56511 "reason_parser.ml"
          
        in
        let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 56520 "reason_parser.ml"
          
        in
        let _startpos__1_ = _startpos_x_ in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = _startpos__1_ in
        
# 3795 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      mkpat ~loc (Ppat_open (_1, _3))
    )
# 56531 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_pattern = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_simple_pattern_not_ident_ = let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 56587 "reason_parser.ml"
          
        in
        let _startpos__1_ = _startpos_x_ in
        let _endpos = _endpos__5_ in
        let _symbolstartpos = _startpos__1_ in
        
# 3799 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      mkpat ~loc (Ppat_open (_1, _4)) )
# 56597 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2_inlined1;
          MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = x;
                MenhirLib.EngineTypes.startp = _startpos_x_;
                MenhirLib.EngineTypes.endp = _endpos_x_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__2_inlined1_ in
        let _v : 'tv_simple_pattern_not_ident_ = let _3 =
          let (_endpos__2_, _2) = (_endpos__2_inlined1_, _2_inlined1) in
          let x = 
# 3801 "reason_parser.mly"
                                                       (Lident "[]")
# 56645 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 56653 "reason_parser.ml"
          
        in
        let _endpos__3_ = _endpos__2_inlined1_ in
        let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 56663 "reason_parser.ml"
          
        in
        let _startpos__1_ = _startpos_x_ in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = _startpos__1_ in
        
# 3802 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      mkpat ~loc (Ppat_open(_1, mkpat ~loc:_3.loc (Ppat_construct(_3, None)))) )
# 56673 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2_inlined1;
          MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = x;
                MenhirLib.EngineTypes.startp = _startpos_x_;
                MenhirLib.EngineTypes.endp = _endpos_x_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__2_inlined1_ in
        let _v : 'tv_simple_pattern_not_ident_ = let _3 =
          let (_endpos__2_, _2) = (_endpos__2_inlined1_, _2_inlined1) in
          let x = 
# 3804 "reason_parser.mly"
                                                   (Lident "()")
# 56721 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 56729 "reason_parser.ml"
          
        in
        let _endpos__3_ = _endpos__2_inlined1_ in
        let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 56739 "reason_parser.ml"
          
        in
        let _startpos__1_ = _startpos_x_ in
        let _endpos = _endpos__3_ in
        let _symbolstartpos = _startpos__1_ in
        
# 3805 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      mkpat ~loc (Ppat_open(_1, mkpat ~loc:_3.loc (Ppat_construct(_3, None)))) )
# 56749 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : (
# 1173 "reason_parser.mly"
       (string)
# 56770 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4775 "reason_parser.mly"
                ( _1 )
# 56778 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : (
# 1220 "reason_parser.mly"
       (string)
# 56799 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4776 "reason_parser.mly"
                ( _1 )
# 56807 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4777 "reason_parser.mly"
                ( "and" )
# 56832 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4778 "reason_parser.mly"
                ( "as" )
# 56857 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4779 "reason_parser.mly"
                ( "assert" )
# 56882 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4780 "reason_parser.mly"
                ( "begin" )
# 56907 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4781 "reason_parser.mly"
                ( "class" )
# 56932 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4782 "reason_parser.mly"
                ( "constraint" )
# 56957 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4783 "reason_parser.mly"
                ( "do" )
# 56982 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4784 "reason_parser.mly"
                ( "done" )
# 57007 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4785 "reason_parser.mly"
                ( "downto" )
# 57032 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4786 "reason_parser.mly"
                ( "else" )
# 57057 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4787 "reason_parser.mly"
                ( "end" )
# 57082 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4788 "reason_parser.mly"
                ( "exception" )
# 57107 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4789 "reason_parser.mly"
                ( "external" )
# 57132 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4790 "reason_parser.mly"
                ( "false" )
# 57157 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4791 "reason_parser.mly"
                ( "for" )
# 57182 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4792 "reason_parser.mly"
                ( "fun" )
# 57207 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4793 "reason_parser.mly"
                ( "function" )
# 57232 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4794 "reason_parser.mly"
                ( "functor" )
# 57257 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4795 "reason_parser.mly"
                ( "if" )
# 57282 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4796 "reason_parser.mly"
                ( "in" )
# 57307 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4797 "reason_parser.mly"
                ( "include" )
# 57332 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4798 "reason_parser.mly"
                ( "inherit" )
# 57357 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4799 "reason_parser.mly"
                ( "initializer" )
# 57382 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4800 "reason_parser.mly"
                ( "lazy" )
# 57407 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4801 "reason_parser.mly"
                ( "let" )
# 57432 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4802 "reason_parser.mly"
                ( "switch" )
# 57457 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4803 "reason_parser.mly"
                ( "module" )
# 57482 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4804 "reason_parser.mly"
                ( "mutable" )
# 57507 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4805 "reason_parser.mly"
                ( "new" )
# 57532 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4806 "reason_parser.mly"
                ( "nonrec" )
# 57557 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4807 "reason_parser.mly"
                ( "object" )
# 57582 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4808 "reason_parser.mly"
                ( "of" )
# 57607 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4809 "reason_parser.mly"
                ( "open" )
# 57632 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4810 "reason_parser.mly"
                ( "or" )
# 57657 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4811 "reason_parser.mly"
                ( "private" )
# 57682 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4812 "reason_parser.mly"
                ( "rec" )
# 57707 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4813 "reason_parser.mly"
                ( "sig" )
# 57732 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4814 "reason_parser.mly"
                ( "struct" )
# 57757 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4815 "reason_parser.mly"
                ( "then" )
# 57782 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4816 "reason_parser.mly"
                ( "to" )
# 57807 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4817 "reason_parser.mly"
                ( "true" )
# 57832 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4818 "reason_parser.mly"
                ( "try" )
# 57857 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4819 "reason_parser.mly"
                ( "type" )
# 57882 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4820 "reason_parser.mly"
                ( "val" )
# 57907 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4821 "reason_parser.mly"
                ( "virtual" )
# 57932 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4822 "reason_parser.mly"
                ( "when" )
# 57957 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4823 "reason_parser.mly"
                ( "while" )
# 57982 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_single_attr_id = 
# 4824 "reason_parser.mly"
                ( "with" )
# 58007 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _3 : 'tv_either_extension_constructor_declaration_extension_constructor_rebind_ = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_str_exception_declaration = let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 58039 "reason_parser.ml"
         in
        
# 4066 "reason_parser.mly"
  ( {_3 with pext_attributes = _3.pext_attributes @ _1} )
# 58044 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_either_extension_constructor_declaration_extension_constructor_rebind_ = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_str_exception_declaration = let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 58084 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 58089 "reason_parser.ml"
          
        in
        
# 4066 "reason_parser.mly"
  ( {_3 with pext_attributes = _3.pext_attributes @ _1} )
# 58095 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = constructors;
          MenhirLib.EngineTypes.startp = _startpos_constructors_;
          MenhirLib.EngineTypes.endp = _endpos_constructors_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = priv;
            MenhirLib.EngineTypes.startp = _startpos_priv_;
            MenhirLib.EngineTypes.endp = _endpos_priv_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _6;
              MenhirLib.EngineTypes.startp = _startpos__6_;
              MenhirLib.EngineTypes.endp = _endpos__6_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = params;
                MenhirLib.EngineTypes.startp = _startpos_params_;
                MenhirLib.EngineTypes.endp = _endpos_params_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = flag;
                    MenhirLib.EngineTypes.startp = _startpos_flag_;
                    MenhirLib.EngineTypes.endp = _endpos_flag_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _menhir_s;
                      MenhirLib.EngineTypes.semv = _2;
                      MenhirLib.EngineTypes.startp = _startpos__2_;
                      MenhirLib.EngineTypes.endp = _endpos__2_;
                      MenhirLib.EngineTypes.next = _menhir_stack;
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let constructors : 'tv_attributed_ext_constructors_either_extension_constructor_declaration_extension_constructor_rebind__ = Obj.magic constructors in
        let priv : 'tv_embedded_private_flag_ = Obj.magic priv in
        let _6 : unit = Obj.magic _6 in
        let params : 'tv_type_variables_with_variance = Obj.magic params in
        let _1 : (
# 1173 "reason_parser.mly"
       (string)
# 58156 "reason_parser.ml"
        ) = Obj.magic _1 in
        let flag : 'tv_nonrec_flag = Obj.magic flag in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos_constructors_ in
        let _v : 'tv_str_type_extension = let ident =
          let x = 
# 4659 "reason_parser.mly"
                                  ( Lident _1 )
# 58167 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 58175 "reason_parser.ml"
          
        in
        let attrs = 
# 4843 "reason_parser.mly"
    ( [] )
# 58181 "reason_parser.ml"
         in
        
# 4122 "reason_parser.mly"
  ( if flag <> Recursive then
      not_expecting _startpos_flag_ _endpos_flag_ "nonrec flag";
    Te.mk ~params ~priv ~attrs ident constructors
  )
# 58189 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = constructors;
          MenhirLib.EngineTypes.startp = _startpos_constructors_;
          MenhirLib.EngineTypes.endp = _endpos_constructors_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = priv;
            MenhirLib.EngineTypes.startp = _startpos_priv_;
            MenhirLib.EngineTypes.endp = _endpos_priv_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _6;
              MenhirLib.EngineTypes.startp = _startpos__6_;
              MenhirLib.EngineTypes.endp = _endpos__6_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = params;
                MenhirLib.EngineTypes.startp = _startpos_params_;
                MenhirLib.EngineTypes.endp = _endpos_params_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _3;
                  MenhirLib.EngineTypes.startp = _startpos__3_;
                  MenhirLib.EngineTypes.endp = _endpos__3_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _2_inlined1;
                    MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
                    MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _1;
                      MenhirLib.EngineTypes.startp = _startpos__1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _;
                        MenhirLib.EngineTypes.semv = flag;
                        MenhirLib.EngineTypes.startp = _startpos_flag_;
                        MenhirLib.EngineTypes.endp = _endpos_flag_;
                        MenhirLib.EngineTypes.next = {
                          MenhirLib.EngineTypes.state = _menhir_s;
                          MenhirLib.EngineTypes.semv = _2;
                          MenhirLib.EngineTypes.startp = _startpos__2_;
                          MenhirLib.EngineTypes.endp = _endpos__2_;
                          MenhirLib.EngineTypes.next = _menhir_stack;
                        };
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let constructors : 'tv_attributed_ext_constructors_either_extension_constructor_declaration_extension_constructor_rebind__ = Obj.magic constructors in
        let priv : 'tv_embedded_private_flag_ = Obj.magic priv in
        let _6 : unit = Obj.magic _6 in
        let params : 'tv_type_variables_with_variance = Obj.magic params in
        let _3 : (
# 1173 "reason_parser.mly"
       (string)
# 58262 "reason_parser.ml"
        ) = Obj.magic _3 in
        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
        let _1 : 'tv_mod_ext_longident = Obj.magic _1 in
        let flag : 'tv_nonrec_flag = Obj.magic flag in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos_constructors_ in
        let _v : 'tv_str_type_extension = let ident =
          let _2 = _2_inlined1 in
          let x = 
# 4660 "reason_parser.mly"
                                  ( Ldot(_1, _3) )
# 58276 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 58284 "reason_parser.ml"
          
        in
        let attrs = 
# 4843 "reason_parser.mly"
    ( [] )
# 58290 "reason_parser.ml"
         in
        
# 4122 "reason_parser.mly"
  ( if flag <> Recursive then
      not_expecting _startpos_flag_ _endpos_flag_ "nonrec flag";
    Te.mk ~params ~priv ~attrs ident constructors
  )
# 58298 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = constructors;
          MenhirLib.EngineTypes.startp = _startpos_constructors_;
          MenhirLib.EngineTypes.endp = _endpos_constructors_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = priv;
            MenhirLib.EngineTypes.startp = _startpos_priv_;
            MenhirLib.EngineTypes.endp = _endpos_priv_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _6;
              MenhirLib.EngineTypes.startp = _startpos__6_;
              MenhirLib.EngineTypes.endp = _endpos__6_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = params;
                MenhirLib.EngineTypes.startp = _startpos_params_;
                MenhirLib.EngineTypes.endp = _endpos_params_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _1_inlined1;
                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = flag;
                    MenhirLib.EngineTypes.startp = _startpos_flag_;
                    MenhirLib.EngineTypes.endp = _endpos_flag_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _2;
                      MenhirLib.EngineTypes.startp = _startpos__2_;
                      MenhirLib.EngineTypes.endp = _endpos__2_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _menhir_s;
                        MenhirLib.EngineTypes.semv = _1;
                        MenhirLib.EngineTypes.startp = _startpos__1_;
                        MenhirLib.EngineTypes.endp = _endpos__1_;
                        MenhirLib.EngineTypes.next = _menhir_stack;
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let constructors : 'tv_attributed_ext_constructors_either_extension_constructor_declaration_extension_constructor_rebind__ = Obj.magic constructors in
        let priv : 'tv_embedded_private_flag_ = Obj.magic priv in
        let _6 : unit = Obj.magic _6 in
        let params : 'tv_type_variables_with_variance = Obj.magic params in
        let _1_inlined1 : (
# 1173 "reason_parser.mly"
       (string)
# 58365 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let flag : 'tv_nonrec_flag = Obj.magic flag in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_constructors_ in
        let _v : 'tv_str_type_extension = let ident =
          let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
          let x = 
# 4659 "reason_parser.mly"
                                  ( Lident _1 )
# 58378 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 58386 "reason_parser.ml"
          
        in
        let attrs =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 58393 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 58398 "reason_parser.ml"
          
        in
        
# 4122 "reason_parser.mly"
  ( if flag <> Recursive then
      not_expecting _startpos_flag_ _endpos_flag_ "nonrec flag";
    Te.mk ~params ~priv ~attrs ident constructors
  )
# 58407 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = constructors;
          MenhirLib.EngineTypes.startp = _startpos_constructors_;
          MenhirLib.EngineTypes.endp = _endpos_constructors_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = priv;
            MenhirLib.EngineTypes.startp = _startpos_priv_;
            MenhirLib.EngineTypes.endp = _endpos_priv_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _6;
              MenhirLib.EngineTypes.startp = _startpos__6_;
              MenhirLib.EngineTypes.endp = _endpos__6_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = params;
                MenhirLib.EngineTypes.startp = _startpos_params_;
                MenhirLib.EngineTypes.endp = _endpos_params_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _3;
                  MenhirLib.EngineTypes.startp = _startpos__3_;
                  MenhirLib.EngineTypes.endp = _endpos__3_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _2_inlined1;
                    MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
                    MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _1_inlined1;
                      MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _;
                        MenhirLib.EngineTypes.semv = flag;
                        MenhirLib.EngineTypes.startp = _startpos_flag_;
                        MenhirLib.EngineTypes.endp = _endpos_flag_;
                        MenhirLib.EngineTypes.next = {
                          MenhirLib.EngineTypes.state = _;
                          MenhirLib.EngineTypes.semv = _2;
                          MenhirLib.EngineTypes.startp = _startpos__2_;
                          MenhirLib.EngineTypes.endp = _endpos__2_;
                          MenhirLib.EngineTypes.next = {
                            MenhirLib.EngineTypes.state = _menhir_s;
                            MenhirLib.EngineTypes.semv = _1;
                            MenhirLib.EngineTypes.startp = _startpos__1_;
                            MenhirLib.EngineTypes.endp = _endpos__1_;
                            MenhirLib.EngineTypes.next = _menhir_stack;
                          };
                        };
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let constructors : 'tv_attributed_ext_constructors_either_extension_constructor_declaration_extension_constructor_rebind__ = Obj.magic constructors in
        let priv : 'tv_embedded_private_flag_ = Obj.magic priv in
        let _6 : unit = Obj.magic _6 in
        let params : 'tv_type_variables_with_variance = Obj.magic params in
        let _3 : (
# 1173 "reason_parser.mly"
       (string)
# 58486 "reason_parser.ml"
        ) = Obj.magic _3 in
        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
        let _1_inlined1 : 'tv_mod_ext_longident = Obj.magic _1_inlined1 in
        let flag : 'tv_nonrec_flag = Obj.magic flag in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_constructors_ in
        let _v : 'tv_str_type_extension = let ident =
          let (_startpos__1_, _2, _1) = (_startpos__1_inlined1_, _2_inlined1, _1_inlined1) in
          let x = 
# 4660 "reason_parser.mly"
                                  ( Ldot(_1, _3) )
# 58501 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 58509 "reason_parser.ml"
          
        in
        let attrs =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 58516 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 58521 "reason_parser.ml"
          
        in
        
# 4122 "reason_parser.mly"
  ( if flag <> Recursive then
      not_expecting _startpos_flag_ _endpos_flag_ "nonrec flag";
    Te.mk ~params ~priv ~attrs ident constructors
  )
# 58530 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_option_preceded_COLON_expr__ = Obj.magic _2 in
        let _1 : (
# 1212 "reason_parser.mly"
       (string * string option * string option)
# 58558 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_string_literal_expr_maybe_punned = let _endpos = _endpos__2_ in
        let _startpos = _startpos__1_ in
        
# 3573 "reason_parser.mly"
  ( let loc = mklocation _startpos _endpos in
    let (s, _, _) = _1 in
    let lident_lident_loc = mkloc (Lident s) loc in
    let exp = match _2 with
      | Some x -> x
      | None -> mkexp ~loc (Pexp_ident lident_lident_loc)
    in
    (lident_lident_loc, exp)
  )
# 58576 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : unit = Obj.magic _2 in
        let _1 : (
# 1212 "reason_parser.mly"
       (string * string option * string option)
# 58604 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_string_literal_expr_maybe_punned_with_comma = let _endpos = _endpos__2_ in
        let _startpos = _startpos__1_ in
        
# 3557 "reason_parser.mly"
  ( let loc = mklocation _startpos _endpos in
    let (s, _, _) = _1 in
    let lident_lident_loc = mkloc (Lident s) loc in
    let exp = mkexp ~loc (Pexp_ident lident_lident_loc) in
    (lident_lident_loc, exp)
  )
# 58619 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : (
# 1212 "reason_parser.mly"
       (string * string option * string option)
# 58661 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_string_literal_expr_maybe_punned_with_comma = let _endpos = _endpos__4_ in
        let _startpos = _startpos__1_ in
        
# 3564 "reason_parser.mly"
  ( let loc = mklocation _startpos _endpos in
    let (s, _, _) = _1 in
    let lident_lident_loc = mkloc (Lident s) loc in
    let exp = _3 in
    (lident_lident_loc, exp)
  )
# 58676 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_option_COMMA_ = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_string_literal_expr_maybe_punned_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_string_literal_exprs_maybe_punned = let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 58708 "reason_parser.ml"
         in
        
# 3552 "reason_parser.mly"
                                                                           ( _1 )
# 58713 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_poly_type = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : (
# 1212 "reason_parser.mly"
       (string * string option * string option)
# 58748 "reason_parser.ml"
        ) = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_string_literal_label = let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 58756 "reason_parser.ml"
         in
        
# 4515 "reason_parser.mly"
  ( let (label, _raw, _delim) = _2 in (label, _1, _4) )
# 58761 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_poly_type = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : (
# 1212 "reason_parser.mly"
       (string * string option * string option)
# 58802 "reason_parser.ml"
        ) = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_string_literal_label = let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 58812 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 58817 "reason_parser.ml"
          
        in
        
# 4515 "reason_parser.mly"
  ( let (label, _raw, _delim) = _2 in (label, _1, _4) )
# 58823 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_option_COMMA_ = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_string_literal_label_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_string_literal_labels = let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 58855 "reason_parser.ml"
         in
        
# 4519 "reason_parser.mly"
                                                               ( _1 )
# 58860 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_structure = 
# 1656 "reason_parser.mly"
                ( [] )
# 58878 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_structure_item = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_structure = 
# 1657 "reason_parser.mly"
                   ( _1 )
# 58903 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_structure = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_structure_item = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_structure = 
# 1658 "reason_parser.mly"
                                  ( _1 @ _3 )
# 58942 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_structure = Obj.magic _2 in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_structure = let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 58977 "reason_parser.ml"
          
        in
        
# 1660 "reason_parser.mly"
    ( let menhirError = Reason_syntax_util.findMenhirErrorMessage _1.loc in
      match menhirError with
      | MenhirMessagesError errMessage -> (syntax_error_str errMessage.loc errMessage.msg) :: _2
      | _ -> (syntax_error_str _1.loc "Invalid statement") :: _2
    )
# 58987 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_structure = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : unit = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_structure = let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 59029 "reason_parser.ml"
          
        in
        
# 1666 "reason_parser.mly"
    ( let menhirError = Reason_syntax_util.findMenhirErrorMessage _1.loc in
      match menhirError with
      | MenhirMessagesError errMessage -> (syntax_error_str errMessage.loc errMessage.msg) :: _3
      | _ -> (syntax_error_str _1.loc "Invalid statement") :: _3
    )
# 59039 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_structure = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let x : 'tv_structure_item = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_structure = let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 59081 "reason_parser.ml"
          
        in
        
# 1672 "reason_parser.mly"
    ( let menhirError = Reason_syntax_util.findMenhirErrorMessage _1.loc in
      match menhirError with
      | MenhirMessagesError errMessage -> (syntax_error_str errMessage.loc errMessage.msg) :: _3
      | _ -> (syntax_error_str _1.loc "Statement has to end with a semicolon") :: _3
    )
# 59091 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _2 : 'tv_unattributed_expr = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_structure_item = let _1 =
          let x =
            let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 59118 "reason_parser.ml"
             in
            
# 1698 "reason_parser.mly"
      ( mkstrexp _2 _1 )
# 59123 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__2_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4920 "reason_parser.mly"
  ( {x with pstr_loc = {x.pstr_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 59132 "reason_parser.ml"
          
        in
        
# 1747 "reason_parser.mly"
      ( [_1] )
# 59138 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_unattributed_expr = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_structure_item = let _1 =
          let x =
            let _1 =
              let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 59173 "reason_parser.ml"
               in
              
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 59178 "reason_parser.ml"
              
            in
            
# 1698 "reason_parser.mly"
      ( mkstrexp _2 _1 )
# 59184 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4920 "reason_parser.mly"
  ( {x with pstr_loc = {x.pstr_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 59193 "reason_parser.ml"
          
        in
        
# 1747 "reason_parser.mly"
      ( [_1] )
# 59199 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _3 : 'tv_structure_item = Obj.magic _3 in
        let _2 : 'tv_item_extension_sugar = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_structure_item = let _1 =
          let x =
            let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 59233 "reason_parser.ml"
             in
            
# 1700 "reason_parser.mly"
      ( let (ext_attrs, ext_id) = _2 in
        struct_item_extension (_1@ext_attrs, ext_id) _3 )
# 59239 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__2_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4920 "reason_parser.mly"
  ( {x with pstr_loc = {x.pstr_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 59248 "reason_parser.ml"
          
        in
        
# 1747 "reason_parser.mly"
      ( [_1] )
# 59254 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_structure_item = Obj.magic _3 in
        let _2 : 'tv_item_extension_sugar = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_structure_item = let _1 =
          let x =
            let _1 =
              let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 59296 "reason_parser.ml"
               in
              
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 59301 "reason_parser.ml"
              
            in
            
# 1700 "reason_parser.mly"
      ( let (ext_attrs, ext_id) = _2 in
        struct_item_extension (_1@ext_attrs, ext_id) _3 )
# 59308 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4920 "reason_parser.mly"
  ( {x with pstr_loc = {x.pstr_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 59317 "reason_parser.ml"
          
        in
        
# 1747 "reason_parser.mly"
      ( [_1] )
# 59323 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _7;
          MenhirLib.EngineTypes.startp = _startpos__7_;
          MenhirLib.EngineTypes.endp = _endpos__7_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _6;
            MenhirLib.EngineTypes.startp = _startpos__6_;
            MenhirLib.EngineTypes.endp = _endpos__6_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _5;
              MenhirLib.EngineTypes.startp = _startpos__5_;
              MenhirLib.EngineTypes.endp = _endpos__5_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _4;
                MenhirLib.EngineTypes.startp = _startpos__4_;
                MenhirLib.EngineTypes.endp = _endpos__4_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _2;
                    MenhirLib.EngineTypes.startp = _startpos__2_;
                    MenhirLib.EngineTypes.endp = _endpos__2_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _7 : 'tv_primitive_declaration = Obj.magic _7 in
        let _6 : unit = Obj.magic _6 in
        let _5 : 'tv_core_type = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let x : 'tv_val_ident = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__7_ in
        let _v : 'tv_structure_item = let _1 =
          let x =
            let _3 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 59388 "reason_parser.ml"
              
            in
            let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 59394 "reason_parser.ml"
             in
            let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
            let _endpos = _endpos__7_ in
            let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
              _startpos__1_
            else
              _startpos__2_ in
            
# 1704 "reason_parser.mly"
      ( let loc = mklocation _symbolstartpos _endpos in
        mkstr (Pstr_primitive (Val.mk _3 _5 ~prim:_7 ~attrs:_1 ~loc)) )
# 59406 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__7_, _startpos__2_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4920 "reason_parser.mly"
  ( {x with pstr_loc = {x.pstr_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 59415 "reason_parser.ml"
          
        in
        
# 1747 "reason_parser.mly"
      ( [_1] )
# 59421 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _7;
          MenhirLib.EngineTypes.startp = _startpos__7_;
          MenhirLib.EngineTypes.endp = _endpos__7_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _6;
            MenhirLib.EngineTypes.startp = _startpos__6_;
            MenhirLib.EngineTypes.endp = _endpos__6_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _5;
              MenhirLib.EngineTypes.startp = _startpos__5_;
              MenhirLib.EngineTypes.endp = _endpos__5_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _4;
                MenhirLib.EngineTypes.startp = _startpos__4_;
                MenhirLib.EngineTypes.endp = _endpos__4_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _2;
                    MenhirLib.EngineTypes.startp = _startpos__2_;
                    MenhirLib.EngineTypes.endp = _endpos__2_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _menhir_s;
                      MenhirLib.EngineTypes.semv = _1;
                      MenhirLib.EngineTypes.startp = _startpos__1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_;
                      MenhirLib.EngineTypes.next = _menhir_stack;
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _7 : 'tv_primitive_declaration = Obj.magic _7 in
        let _6 : unit = Obj.magic _6 in
        let _5 : 'tv_core_type = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let x : 'tv_val_ident = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__7_ in
        let _v : 'tv_structure_item = let _1 =
          let x =
            let _3 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 59493 "reason_parser.ml"
              
            in
            let _1 =
              let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 59500 "reason_parser.ml"
               in
              
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 59505 "reason_parser.ml"
              
            in
            let _endpos = _endpos__7_ in
            let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
              _startpos__1_
            else
              _startpos__2_ in
            
# 1704 "reason_parser.mly"
      ( let loc = mklocation _symbolstartpos _endpos in
        mkstr (Pstr_primitive (Val.mk _3 _5 ~prim:_7 ~attrs:_1 ~loc)) )
# 59517 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__7_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4920 "reason_parser.mly"
  ( {x with pstr_loc = {x.pstr_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 59526 "reason_parser.ml"
          
        in
        
# 1747 "reason_parser.mly"
      ( [_1] )
# 59532 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_type_declarations = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_structure_item = let _1 =
          let x = 
# 1707 "reason_parser.mly"
      ( let (nonrec_flag, tyl) = _1 in mkstr(Pstr_type (nonrec_flag, tyl)) )
# 59558 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4920 "reason_parser.mly"
  ( {x with pstr_loc = {x.pstr_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 59566 "reason_parser.ml"
          
        in
        
# 1747 "reason_parser.mly"
      ( [_1] )
# 59572 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_str_type_extension = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_structure_item = let _1 =
          let x = 
# 1709 "reason_parser.mly"
      ( mkstr(Pstr_typext _1) )
# 59598 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4920 "reason_parser.mly"
  ( {x with pstr_loc = {x.pstr_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 59606 "reason_parser.ml"
          
        in
        
# 1747 "reason_parser.mly"
      ( [_1] )
# 59612 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_str_exception_declaration = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_structure_item = let _1 =
          let x = 
# 1711 "reason_parser.mly"
      ( mkstr(Pstr_exception _1) )
# 59638 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4920 "reason_parser.mly"
  ( {x with pstr_loc = {x.pstr_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 59646 "reason_parser.ml"
          
        in
        
# 1747 "reason_parser.mly"
      ( [_1] )
# 59652 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _3 : 'tv_module_binding_body = Obj.magic _3 in
        let _2 : 'tv_opt_LET_MODULE_ident = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_structure_item = let _1 =
          let x =
            let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 59686 "reason_parser.ml"
             in
            let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
            let _endpos = _endpos__3_ in
            let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
              _startpos__1_
            else
              _startpos__2_ in
            
# 1713 "reason_parser.mly"
      ( let loc = mklocation _symbolstartpos _endpos in
        mkstr(Pstr_module (Mb.mk _2 _3 ~attrs:_1 ~loc)) )
# 59698 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__2_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4920 "reason_parser.mly"
  ( {x with pstr_loc = {x.pstr_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 59707 "reason_parser.ml"
          
        in
        
# 1747 "reason_parser.mly"
      ( [_1] )
# 59713 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_module_binding_body = Obj.magic _3 in
        let _2 : 'tv_opt_LET_MODULE_ident = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_structure_item = let _1 =
          let x =
            let _1 =
              let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 59755 "reason_parser.ml"
               in
              
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 59760 "reason_parser.ml"
              
            in
            let _endpos = _endpos__3_ in
            let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
              _startpos__1_
            else
              _startpos__2_ in
            
# 1713 "reason_parser.mly"
      ( let loc = mklocation _symbolstartpos _endpos in
        mkstr(Pstr_module (Mb.mk _2 _3 ~attrs:_1 ~loc)) )
# 59772 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4920 "reason_parser.mly"
  ( {x with pstr_loc = {x.pstr_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 59781 "reason_parser.ml"
          
        in
        
# 1747 "reason_parser.mly"
      ( [_1] )
# 59787 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_list_and_module_bindings_ = Obj.magic _4 in
        let _3 : 'tv_module_binding_body = Obj.magic _3 in
        let _2 : 'tv_opt_LET_MODULE_REC_ident = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_structure_item = let _1 =
          let x =
            let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 59828 "reason_parser.ml"
             in
            let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
            let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
              _startpos__1_
            else
              _startpos__2_ in
            
# 1717 "reason_parser.mly"
      ( let loc = mklocation _symbolstartpos _endpos__2_ in
        mkstr (Pstr_recmodule ((Mb.mk _2 _3 ~attrs:_1 ~loc) :: _4))
      )
# 59840 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__4_, _startpos__2_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4920 "reason_parser.mly"
  ( {x with pstr_loc = {x.pstr_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 59849 "reason_parser.ml"
          
        in
        
# 1747 "reason_parser.mly"
      ( [_1] )
# 59855 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_list_and_module_bindings_ = Obj.magic _4 in
        let _3 : 'tv_module_binding_body = Obj.magic _3 in
        let _2 : 'tv_opt_LET_MODULE_REC_ident = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_structure_item = let _1 =
          let x =
            let _1 =
              let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 59904 "reason_parser.ml"
               in
              
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 59909 "reason_parser.ml"
              
            in
            let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
              _startpos__1_
            else
              _startpos__2_ in
            
# 1717 "reason_parser.mly"
      ( let loc = mklocation _symbolstartpos _endpos__2_ in
        mkstr (Pstr_recmodule ((Mb.mk _2 _3 ~attrs:_1 ~loc) :: _4))
      )
# 59921 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__4_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4920 "reason_parser.mly"
  ( {x with pstr_loc = {x.pstr_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 59930 "reason_parser.ml"
          
        in
        
# 1747 "reason_parser.mly"
      ( [_1] )
# 59936 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let x : 'tv_ident = Obj.magic x in
        let _4 : 'tv_option_OF_ = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_structure_item = let _1 =
          let x =
            let _5 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 59987 "reason_parser.ml"
              
            in
            let _endpos__5_ = _endpos_x_ in
            let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 59994 "reason_parser.ml"
             in
            let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
            let _endpos = _endpos__5_ in
            let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
              _startpos__1_
            else
              _startpos__2_ in
            
# 1721 "reason_parser.mly"
      ( let loc = mklocation _symbolstartpos _endpos in
        mkstr(Pstr_modtype (Mtd.mk _5 ~attrs:_1 ~loc)) )
# 60006 "reason_parser.ml"
            
          in
          let _startpos_x_ = _startpos__2_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4920 "reason_parser.mly"
  ( {x with pstr_loc = {x.pstr_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 60015 "reason_parser.ml"
          
        in
        
# 1747 "reason_parser.mly"
      ( [_1] )
# 60021 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let x : 'tv_ident = Obj.magic x in
        let _4 : 'tv_option_OF_ = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_structure_item = let _1 =
          let x =
            let _5 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 60079 "reason_parser.ml"
              
            in
            let _endpos__5_ = _endpos_x_ in
            let _1 =
              let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 60087 "reason_parser.ml"
               in
              
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 60092 "reason_parser.ml"
              
            in
            let _endpos = _endpos__5_ in
            let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
              _startpos__1_
            else
              _startpos__2_ in
            
# 1721 "reason_parser.mly"
      ( let loc = mklocation _symbolstartpos _endpos in
        mkstr(Pstr_modtype (Mtd.mk _5 ~attrs:_1 ~loc)) )
# 60104 "reason_parser.ml"
            
          in
          let _startpos_x_ = _startpos__1_ in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4920 "reason_parser.mly"
  ( {x with pstr_loc = {x.pstr_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 60113 "reason_parser.ml"
          
        in
        
# 1747 "reason_parser.mly"
      ( [_1] )
# 60119 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _6;
          MenhirLib.EngineTypes.startp = _startpos__6_;
          MenhirLib.EngineTypes.endp = _endpos__6_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _4;
              MenhirLib.EngineTypes.startp = _startpos__4_;
              MenhirLib.EngineTypes.endp = _endpos__4_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _3;
                MenhirLib.EngineTypes.startp = _startpos__3_;
                MenhirLib.EngineTypes.endp = _endpos__3_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _2;
                  MenhirLib.EngineTypes.startp = _startpos__2_;
                  MenhirLib.EngineTypes.endp = _endpos__2_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _6 : 'tv_module_type_body_EQUAL_ = Obj.magic _6 in
        let x : 'tv_ident = Obj.magic x in
        let _4 : 'tv_option_OF_ = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__6_ in
        let _v : 'tv_structure_item = let _1 =
          let x =
            let _5 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 60177 "reason_parser.ml"
              
            in
            let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 60183 "reason_parser.ml"
             in
            let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
            let _endpos = _endpos__6_ in
            let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
              _startpos__1_
            else
              _startpos__2_ in
            
# 1724 "reason_parser.mly"
      ( let loc = mklocation _symbolstartpos _endpos in
        mkstr(Pstr_modtype (Mtd.mk _5 ~typ:_6 ~attrs:_1 ~loc)) )
# 60195 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__6_, _startpos__2_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4920 "reason_parser.mly"
  ( {x with pstr_loc = {x.pstr_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 60204 "reason_parser.ml"
          
        in
        
# 1747 "reason_parser.mly"
      ( [_1] )
# 60210 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _6;
          MenhirLib.EngineTypes.startp = _startpos__6_;
          MenhirLib.EngineTypes.endp = _endpos__6_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _4;
              MenhirLib.EngineTypes.startp = _startpos__4_;
              MenhirLib.EngineTypes.endp = _endpos__4_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _3;
                MenhirLib.EngineTypes.startp = _startpos__3_;
                MenhirLib.EngineTypes.endp = _endpos__3_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _2;
                  MenhirLib.EngineTypes.startp = _startpos__2_;
                  MenhirLib.EngineTypes.endp = _endpos__2_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _1;
                    MenhirLib.EngineTypes.startp = _startpos__1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _6 : 'tv_module_type_body_EQUAL_ = Obj.magic _6 in
        let x : 'tv_ident = Obj.magic x in
        let _4 : 'tv_option_OF_ = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__6_ in
        let _v : 'tv_structure_item = let _1 =
          let x =
            let _5 =
              let _endpos = _endpos_x_ in
              let _symbolstartpos = _startpos_x_ in
              
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 60275 "reason_parser.ml"
              
            in
            let _1 =
              let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 60282 "reason_parser.ml"
               in
              
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 60287 "reason_parser.ml"
              
            in
            let _endpos = _endpos__6_ in
            let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
              _startpos__1_
            else
              _startpos__2_ in
            
# 1724 "reason_parser.mly"
      ( let loc = mklocation _symbolstartpos _endpos in
        mkstr(Pstr_modtype (Mtd.mk _5 ~typ:_6 ~attrs:_1 ~loc)) )
# 60299 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__6_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4920 "reason_parser.mly"
  ( {x with pstr_loc = {x.pstr_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 60308 "reason_parser.ml"
          
        in
        
# 1747 "reason_parser.mly"
      ( [_1] )
# 60314 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_open_statement = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_structure_item = let _1 =
          let x = 
# 1727 "reason_parser.mly"
      ( mkstr(Pstr_open _1) )
# 60340 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4920 "reason_parser.mly"
  ( {x with pstr_loc = {x.pstr_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 60348 "reason_parser.ml"
          
        in
        
# 1747 "reason_parser.mly"
      ( [_1] )
# 60354 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_list_and_class_declaration_ = Obj.magic _4 in
        let _3 : 'tv_class_declaration_details = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_structure_item = let _1 =
          let x =
            let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 60395 "reason_parser.ml"
             in
            let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
            let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
              _startpos__1_
            else
              _startpos__2_ in
            
# 1729 "reason_parser.mly"
      ( let (ident, binding, virt, params) = _3 in
        let loc = mklocation _symbolstartpos _endpos__3_ in
        let first = Ci.mk ident binding ~virt ~params ~attrs:_1 ~loc in
        mkstr (Pstr_class (first :: _4))
      )
# 60409 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__4_, _startpos__2_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4920 "reason_parser.mly"
  ( {x with pstr_loc = {x.pstr_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 60418 "reason_parser.ml"
          
        in
        
# 1747 "reason_parser.mly"
      ( [_1] )
# 60424 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_list_and_class_declaration_ = Obj.magic _4 in
        let _3 : 'tv_class_declaration_details = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_structure_item = let _1 =
          let x =
            let _1 =
              let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 60473 "reason_parser.ml"
               in
              
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 60478 "reason_parser.ml"
              
            in
            let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
              _startpos__1_
            else
              _startpos__2_ in
            
# 1729 "reason_parser.mly"
      ( let (ident, binding, virt, params) = _3 in
        let loc = mklocation _symbolstartpos _endpos__3_ in
        let first = Ci.mk ident binding ~virt ~params ~attrs:_1 ~loc in
        mkstr (Pstr_class (first :: _4))
      )
# 60492 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__4_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4920 "reason_parser.mly"
  ( {x with pstr_loc = {x.pstr_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 60501 "reason_parser.ml"
          
        in
        
# 1747 "reason_parser.mly"
      ( [_1] )
# 60507 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_class_type_declarations = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_structure_item = let _1 =
          let x = 
# 1736 "reason_parser.mly"
      ( mkstr(Pstr_class_type _1) )
# 60533 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4920 "reason_parser.mly"
  ( {x with pstr_loc = {x.pstr_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 60541 "reason_parser.ml"
          
        in
        
# 1747 "reason_parser.mly"
      ( [_1] )
# 60547 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _3 : 'tv_module_expr = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_structure_item = let _1 =
          let x =
            let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 60581 "reason_parser.ml"
             in
            let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in
            let _endpos = _endpos__3_ in
            let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
              _startpos__1_
            else
              _startpos__2_ in
            
# 1738 "reason_parser.mly"
      ( let loc = mklocation _symbolstartpos _endpos in
        mkstr(Pstr_include (Incl.mk _3 ~attrs:_1 ~loc))
      )
# 60594 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__2_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4920 "reason_parser.mly"
  ( {x with pstr_loc = {x.pstr_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 60603 "reason_parser.ml"
          
        in
        
# 1747 "reason_parser.mly"
      ( [_1] )
# 60609 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_module_expr = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_structure_item = let _1 =
          let x =
            let _1 =
              let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 60651 "reason_parser.ml"
               in
              
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 60656 "reason_parser.ml"
              
            in
            let _endpos = _endpos__3_ in
            let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
              _startpos__1_
            else
              _startpos__2_ in
            
# 1738 "reason_parser.mly"
      ( let loc = mklocation _symbolstartpos _endpos in
        mkstr(Pstr_include (Incl.mk _3 ~attrs:_1 ~loc))
      )
# 60669 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4920 "reason_parser.mly"
  ( {x with pstr_loc = {x.pstr_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 60678 "reason_parser.ml"
          
        in
        
# 1747 "reason_parser.mly"
      ( [_1] )
# 60684 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _2 : 'tv_item_extension = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_structure_item = let _1 =
          let x =
            let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 60711 "reason_parser.ml"
             in
            
# 1744 "reason_parser.mly"
      ( mkstr(Pstr_extension (_2, _1)) )
# 60716 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__2_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4920 "reason_parser.mly"
  ( {x with pstr_loc = {x.pstr_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 60725 "reason_parser.ml"
          
        in
        
# 1747 "reason_parser.mly"
      ( [_1] )
# 60731 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_item_extension = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_structure_item = let _1 =
          let x =
            let _1 =
              let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 60766 "reason_parser.ml"
               in
              
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 60771 "reason_parser.ml"
              
            in
            
# 1744 "reason_parser.mly"
      ( mkstr(Pstr_extension (_2, _1)) )
# 60777 "reason_parser.ml"
            
          in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4920 "reason_parser.mly"
  ( {x with pstr_loc = {x.pstr_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 60786 "reason_parser.ml"
          
        in
        
# 1747 "reason_parser.mly"
      ( [_1] )
# 60792 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_let_bindings = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_structure_item = let _1 =
          let x = 
# 1746 "reason_parser.mly"
      ( val_of_let_bindings _1 )
# 60818 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4920 "reason_parser.mly"
  ( {x with pstr_loc = {x.pstr_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 60826 "reason_parser.ml"
          
        in
        
# 1747 "reason_parser.mly"
      ( [_1] )
# 60832 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_structure_item = let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 60857 "reason_parser.ml"
         in
        
# 1749 "reason_parser.mly"
   ( List.map (fun x -> mkstr ~loc:x.loc (Pstr_attribute x.txt)) _1 )
# 60862 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_subtractive = 
# 4765 "reason_parser.mly"
                  ( "-"  )
# 60887 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_subtractive = 
# 4766 "reason_parser.mly"
                  ( "-." )
# 60912 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_separated_nonempty_list_AMPERSAND_non_arrowed_simple_core_types_ = Obj.magic _4 in
        let _3 : 'tv_boption_AMPERSAND_ = Obj.magic _3 in
        let _2 : 'tv_ident = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_tag_field = let _2 = 
# 4719 "reason_parser.mly"
                                  ( _2 )
# 60958 "reason_parser.ml"
         in
        let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 60963 "reason_parser.ml"
         in
        
# 4549 "reason_parser.mly"
    ( Rtag (_2, _1, _3, _4) )
# 60968 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _1_inlined1;
                MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_separated_nonempty_list_AMPERSAND_non_arrowed_simple_core_types_ = Obj.magic _4 in
        let _3 : 'tv_boption_AMPERSAND_ = Obj.magic _3 in
        let _2 : 'tv_ident = Obj.magic _2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_tag_field = let _2 =
          let _1 = _1_inlined1 in
          
# 4719 "reason_parser.mly"
                                  ( _2 )
# 61023 "reason_parser.ml"
          
        in
        let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 61030 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 61035 "reason_parser.ml"
          
        in
        
# 4549 "reason_parser.mly"
    ( Rtag (_2, _1, _3, _4) )
# 61041 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_ident = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_tag_field = let _2 = 
# 4719 "reason_parser.mly"
                                  ( _2 )
# 61073 "reason_parser.ml"
         in
        let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 61078 "reason_parser.ml"
         in
        
# 4551 "reason_parser.mly"
    ( Rtag (_2, _1, true, []) )
# 61083 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _2 : 'tv_ident = Obj.magic _2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_tag_field = let _2 =
          let _1 = _1_inlined1 in
          
# 4719 "reason_parser.mly"
                                  ( _2 )
# 61124 "reason_parser.ml"
          
        in
        let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 61131 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 61136 "reason_parser.ml"
          
        in
        
# 4551 "reason_parser.mly"
    ( Rtag (_2, _1, true, []) )
# 61142 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_embedded___anonymous_40_ = Obj.magic _3 in
        let _2 : 'tv_ident = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_toplevel_directive = 
# 4712 "reason_parser.mly"
  ( Ptop_dir(_2, _3) )
# 61181 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_embedded___anonymous_0_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : (
# 1379 "reason_parser.mly"
      (Ast_404.Parsetree.toplevel_phrase)
# 61206 "reason_parser.ml"
        ) = 
# 1429 "reason_parser.mly"
    ( apply_mapper_to_toplevel_phrase _1 reason_mapper )
# 61210 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_option_preceded_COLONGREATER_core_type__ = Obj.magic _3 in
        let _2 : 'tv_core_type = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_type_constraint = 
# 3623 "reason_parser.mly"
    ( (Some _2, _3) )
# 61249 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_core_type = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_type_constraint = 
# 3625 "reason_parser.mly"
    ( (None, Some _2) )
# 61281 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _2 : 'tv_package_type = Obj.magic _2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_type_constraint = let _2 =
          let (_startpos__1_, _1) = (_startpos__1_inlined1_, _1_inlined1) in
          let _1 =
            let x = 
# 3616 "reason_parser.mly"
    ( mktyp(Ptyp_package(_2)) )
# 61323 "reason_parser.ml"
             in
            let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4912 "reason_parser.mly"
  ( {x with ptyp_loc = {x.ptyp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 61331 "reason_parser.ml"
            
          in
          
# 3617 "reason_parser.mly"
    (_1)
# 61337 "reason_parser.ml"
          
        in
        
# 3627 "reason_parser.mly"
    ( (Some _2, None) )
# 61343 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_type_declaration_kind = Obj.magic _3 in
        let _2 : 'tv_type_variables_with_variance = Obj.magic _2 in
        let x : (
# 1220 "reason_parser.mly"
       (string)
# 61378 "reason_parser.ml"
        ) = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_type_declaration_details = let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 61389 "reason_parser.ml"
          
        in
        
# 3956 "reason_parser.mly"
    ( raiseSyntaxErrorFromSyntaxUtils _1.loc
        "a type name must start with a lower-case letter or an underscore" )
# 61396 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_type_declaration_kind = Obj.magic _3 in
        let _2 : 'tv_type_variables_with_variance = Obj.magic _2 in
        let x : (
# 1173 "reason_parser.mly"
       (string)
# 61431 "reason_parser.ml"
        ) = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_type_declaration_details = let _1 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 61442 "reason_parser.ml"
          
        in
        
# 3959 "reason_parser.mly"
    ( let (kind, priv, manifest), constraints, endpos, and_types = _3 in
      ((_1, _2, constraints, kind, priv, manifest), endpos, and_types) )
# 61449 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _3 : 'tv_constructor_declarations = Obj.magic _3 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_type_declaration_kind = let _2 = 
# 4739 "reason_parser.mly"
                  ( Public )
# 61481 "reason_parser.ml"
         in
        
# 3965 "reason_parser.mly"
    ( let (cstrs, constraints, endpos, and_types) = _3 in
      ((Ptype_variant (cstrs), _2, None), constraints, endpos, and_types) )
# 61487 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_constructor_declarations = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_type_declaration_kind = let _2 =
          let _1 = _1_inlined1 in
          
# 4740 "reason_parser.mly"
                  ( Private )
# 61528 "reason_parser.ml"
          
        in
        
# 3965 "reason_parser.mly"
    ( let (cstrs, constraints, endpos, and_types) = _3 in
      ((Ptype_variant (cstrs), _2, None), constraints, endpos, and_types) )
# 61535 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_constructor_declarations = Obj.magic _5 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_core_type = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_type_declaration_kind = let _4 = 
# 4739 "reason_parser.mly"
                  ( Public )
# 61581 "reason_parser.ml"
         in
        
# 3968 "reason_parser.mly"
    ( let (cstrs, constraints, endpos, and_types) = _5 in
      ((Ptype_variant cstrs, _4, Some _2), constraints, endpos, and_types) )
# 61587 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_constructor_declarations = Obj.magic _5 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_core_type = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_type_declaration_kind = let _4 =
          let _1 = _1_inlined1 in
          
# 4740 "reason_parser.mly"
                  ( Private )
# 61642 "reason_parser.ml"
          
        in
        
# 3968 "reason_parser.mly"
    ( let (cstrs, constraints, endpos, and_types) = _5 in
      ((Ptype_variant cstrs, _4, Some _2), constraints, endpos, and_types) )
# 61649 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _3 : 'tv_and_type_declaration = Obj.magic _3 in
        let _1 : 'tv_type_other_kind = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_type_declaration_kind = let _2 = 
# 3975 "reason_parser.mly"
    ( [] )
# 61681 "reason_parser.ml"
         in
        let _endpos__2_ = _endpos__1_ in
        
# 3971 "reason_parser.mly"
    ( (_1, _2, _endpos__2_, _3) )
# 61687 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_and_type_declaration = Obj.magic _3 in
        let _1_inlined1 : 'tv_nonempty_list_preceded_CONSTRAINT_constrain__ = Obj.magic _1_inlined1 in
        let _1 : 'tv_type_other_kind = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_type_declaration_kind = let _2 =
          let _1 = _1_inlined1 in
          
# 3976 "reason_parser.mly"
                                     ( _1 )
# 61728 "reason_parser.ml"
          
        in
        let _endpos__2_ = _endpos__1_inlined1_ in
        
# 3971 "reason_parser.mly"
    ( (_1, _2, _endpos__2_, _3) )
# 61735 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_type_declaration_details = Obj.magic _4 in
        let _3 : 'tv_nonrec_flag = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__2_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_type_declarations = let _1 = 
# 4843 "reason_parser.mly"
    ( [] )
# 61774 "reason_parser.ml"
         in
        
# 3936 "reason_parser.mly"
  ( let (ident, params, constraints, kind, priv, manifest), endpos, and_types = _4 in
    let loc = mklocation _startpos__2_ endpos in
    let ty = Type.mk ident ~params:params ~cstrs:constraints
             ~kind ~priv ?manifest ~attrs:_1 ~loc in
    (_3, ty :: and_types)
  )
# 61784 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_type_declaration_details = Obj.magic _4 in
        let _3 : 'tv_nonrec_flag = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_type_declarations = let _1 =
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 61831 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 61836 "reason_parser.ml"
          
        in
        
# 3936 "reason_parser.mly"
  ( let (ident, params, constraints, kind, priv, manifest), endpos, and_types = _4 in
    let loc = mklocation _startpos__2_ endpos in
    let ty = Type.mk ident ~params:params ~cstrs:constraints
             ~kind ~priv ?manifest ~attrs:_1 ~loc in
    (_3, ty :: and_types)
  )
# 61847 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : (
# 1173 "reason_parser.mly"
       (string)
# 61868 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_type_longident = let _1 =
          let x = 
# 4659 "reason_parser.mly"
                                  ( Lident _1 )
# 61877 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 61885 "reason_parser.ml"
          
        in
        
# 4656 "reason_parser.mly"
                                        ( _1 )
# 61891 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : (
# 1173 "reason_parser.mly"
       (string)
# 61924 "reason_parser.ml"
        ) = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_mod_ext_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_type_longident = let _1 =
          let x = 
# 4660 "reason_parser.mly"
                                  ( Ldot(_1, _3) )
# 61935 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 61943 "reason_parser.ml"
          
        in
        
# 4656 "reason_parser.mly"
                                        ( _1 )
# 61949 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_type_other_kind = 
# 3981 "reason_parser.mly"
    ( (Ptype_abstract, Public, None) )
# 61967 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _3 : 'tv_core_type = Obj.magic _3 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_type_other_kind = let _2 = 
# 4739 "reason_parser.mly"
                  ( Public )
# 61999 "reason_parser.ml"
         in
        
# 3983 "reason_parser.mly"
    ( (Ptype_abstract, _2, Some _3) )
# 62004 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_core_type = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_type_other_kind = let _2 =
          let _1 = _1_inlined1 in
          
# 4740 "reason_parser.mly"
                  ( Private )
# 62045 "reason_parser.ml"
          
        in
        
# 3983 "reason_parser.mly"
    ( (Ptype_abstract, _2, Some _3) )
# 62051 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _4 : 'tv_record_declaration = Obj.magic _4 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_type_other_kind = let _3 = 
# 4843 "reason_parser.mly"
    ( [] )
# 62083 "reason_parser.ml"
         in
        let _2 = 
# 4739 "reason_parser.mly"
                  ( Public )
# 62088 "reason_parser.ml"
         in
        
# 3985 "reason_parser.mly"
    ( (Ptype_record (prepend_attrs_to_labels _3 _4), _2, None) )
# 62093 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_record_declaration = Obj.magic _4 in
        let _1_inlined1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_type_other_kind = let _3 =
          let _1 = _1_inlined1 in
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 62134 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 62139 "reason_parser.ml"
          
        in
        let _2 = 
# 4739 "reason_parser.mly"
                  ( Public )
# 62145 "reason_parser.ml"
         in
        
# 3985 "reason_parser.mly"
    ( (Ptype_record (prepend_attrs_to_labels _3 _4), _2, None) )
# 62150 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_record_declaration = Obj.magic _4 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_type_other_kind = let _3 = 
# 4843 "reason_parser.mly"
    ( [] )
# 62189 "reason_parser.ml"
         in
        let _2 =
          let _1 = _1_inlined1 in
          
# 4740 "reason_parser.mly"
                  ( Private )
# 62196 "reason_parser.ml"
          
        in
        
# 3985 "reason_parser.mly"
    ( (Ptype_record (prepend_attrs_to_labels _3 _4), _2, None) )
# 62202 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined2;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_record_declaration = Obj.magic _4 in
        let _1_inlined2 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1_inlined2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_type_other_kind = let _3 =
          let _1 = _1_inlined2 in
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 62250 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 62255 "reason_parser.ml"
          
        in
        let _2 =
          let _1 = _1_inlined1 in
          
# 4740 "reason_parser.mly"
                  ( Private )
# 62263 "reason_parser.ml"
          
        in
        
# 3985 "reason_parser.mly"
    ( (Ptype_record (prepend_attrs_to_labels _3 _4), _2, None) )
# 62269 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_type_other_kind = 
# 3987 "reason_parser.mly"
    ( (Ptype_open, Public, None) )
# 62301 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : unit = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_core_type = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_type_other_kind = 
# 3989 "reason_parser.mly"
    ( (Ptype_open, Public, Some _2) )
# 62347 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _6;
          MenhirLib.EngineTypes.startp = _startpos__6_;
          MenhirLib.EngineTypes.endp = _endpos__6_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _6 : 'tv_record_declaration = Obj.magic _6 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_core_type = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__6_ in
        let _v : 'tv_type_other_kind = let _5 = 
# 4843 "reason_parser.mly"
    ( [] )
# 62393 "reason_parser.ml"
         in
        let _4 = 
# 4739 "reason_parser.mly"
                  ( Public )
# 62398 "reason_parser.ml"
         in
        
# 3991 "reason_parser.mly"
    ( (Ptype_record (prepend_attrs_to_labels _5 _6), _4, Some _2) )
# 62403 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _6;
          MenhirLib.EngineTypes.startp = _startpos__6_;
          MenhirLib.EngineTypes.endp = _endpos__6_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _6 : 'tv_record_declaration = Obj.magic _6 in
        let _1_inlined1 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1_inlined1 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_core_type = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__6_ in
        let _v : 'tv_type_other_kind = let _5 =
          let _1 = _1_inlined1 in
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 62458 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 62463 "reason_parser.ml"
          
        in
        let _4 = 
# 4739 "reason_parser.mly"
                  ( Public )
# 62469 "reason_parser.ml"
         in
        
# 3991 "reason_parser.mly"
    ( (Ptype_record (prepend_attrs_to_labels _5 _6), _4, Some _2) )
# 62474 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _6;
          MenhirLib.EngineTypes.startp = _startpos__6_;
          MenhirLib.EngineTypes.endp = _endpos__6_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _6 : 'tv_record_declaration = Obj.magic _6 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_core_type = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__6_ in
        let _v : 'tv_type_other_kind = let _5 = 
# 4843 "reason_parser.mly"
    ( [] )
# 62527 "reason_parser.ml"
         in
        let _4 =
          let _1 = _1_inlined1 in
          
# 4740 "reason_parser.mly"
                  ( Private )
# 62534 "reason_parser.ml"
          
        in
        
# 3991 "reason_parser.mly"
    ( (Ptype_record (prepend_attrs_to_labels _5 _6), _4, Some _2) )
# 62540 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _6;
          MenhirLib.EngineTypes.startp = _startpos__6_;
          MenhirLib.EngineTypes.endp = _endpos__6_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined2;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _3;
                MenhirLib.EngineTypes.startp = _startpos__3_;
                MenhirLib.EngineTypes.endp = _endpos__3_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _2;
                  MenhirLib.EngineTypes.startp = _startpos__2_;
                  MenhirLib.EngineTypes.endp = _endpos__2_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _1;
                    MenhirLib.EngineTypes.startp = _startpos__1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _6 : 'tv_record_declaration = Obj.magic _6 in
        let _1_inlined2 : 'tv_nonempty_list_as_loc_attribute__ = Obj.magic _1_inlined2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_core_type = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__6_ in
        let _v : 'tv_type_other_kind = let _5 =
          let _1 = _1_inlined2 in
          let _1 = 
# 4839 "reason_parser.mly"
                                               ( _1 )
# 62602 "reason_parser.ml"
           in
          
# 4844 "reason_parser.mly"
                       ( List.map (fun x -> x.txt) _1 )
# 62607 "reason_parser.ml"
          
        in
        let _4 =
          let _1 = _1_inlined1 in
          
# 4740 "reason_parser.mly"
                  ( Private )
# 62615 "reason_parser.ml"
          
        in
        
# 3991 "reason_parser.mly"
    ( (Ptype_record (prepend_attrs_to_labels _5 _6), _4, Some _2) )
# 62621 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_type_variable = Obj.magic _2 in
        let _1 : 'tv_type_variance = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_type_parameter = 
# 4020 "reason_parser.mly"
                                            ( (_2, _1) )
# 62653 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_option_COMMA_ = Obj.magic _2 in
        let _1_inlined1 : 'tv_lseparated_nonempty_list_aux_COMMA_protected_type_ = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_type_parameters = let _1 =
          let _1 =
            let x =
              let _1 = _1_inlined1 in
              let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 62703 "reason_parser.ml"
               in
              
# 4423 "reason_parser.mly"
                                                           (_1)
# 62708 "reason_parser.ml"
              
            in
            
# 200 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 62714 "reason_parser.ml"
            
          in
          
# 4978 "reason_parser.mly"
                                                       ( _1 )
# 62720 "reason_parser.ml"
          
        in
        
# 4427 "reason_parser.mly"
                                             ( _1 )
# 62726 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_ident = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_type_variable = let _1 =
          let x = 
# 4030 "reason_parser.mly"
               ( mktyp (Ptyp_var _2) )
# 62759 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4912 "reason_parser.mly"
  ( {x with ptyp_loc = {x.ptyp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 62767 "reason_parser.ml"
          
        in
        
# 4031 "reason_parser.mly"
  ( _1 )
# 62773 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_embedded___anonymous_34_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_type_variable_with_variance = let _endpos = _endpos__1_ in
        let _symbolstartpos = _startpos__1_ in
        
# 4012 "reason_parser.mly"
  ( let first, second = _1 in
    let ptyp_loc =
        {first.ptyp_loc with loc_start = _symbolstartpos; loc_end = _endpos}
    in
    ({first with ptyp_loc}, second)
  )
# 62805 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_loption_parenthesized_type_variables_with_variance_comma_list__ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_type_variables_with_variance = 
# 4000 "reason_parser.mly"
  ( _1 )
# 62830 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_option_COMMA_ = Obj.magic _2 in
        let _1 : 'tv_lseparated_nonempty_list_aux_COMMA_type_variable_with_variance_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_type_variables_with_variance_comma_list = let _1 = 
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 62862 "reason_parser.ml"
         in
        
# 3995 "reason_parser.mly"
                                                                      (_1)
# 62867 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_type_variance = 
# 4023 "reason_parser.mly"
                ( Invariant )
# 62885 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_type_variance = 
# 4024 "reason_parser.mly"
                ( Covariant )
# 62910 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_type_variance = 
# 4025 "reason_parser.mly"
                ( Contravariant )
# 62935 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_non_arrowed_simple_core_type = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_unattributed_core_type = 
# 4349 "reason_parser.mly"
                                 ( _1 )
# 62960 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_arrowed_simple_core_type = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_unattributed_core_type = 
# 4350 "reason_parser.mly"
                             ( _1 )
# 62985 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_simple_expr_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _1 =
                let _endpos = _endpos__1_ in
                let _startpos = _startpos__1_ in
                
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 63016 "reason_parser.ml"
                
              in
              
# 2826 "reason_parser.mly"
    ( _1 )
# 63022 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 63031 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 63037 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 63043 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_fun_def_EQUALGREATER_non_arrowed_core_type_ = Obj.magic _3 in
        let _2 : 'tv_optional_expr_extension = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x = 
# 2828 "reason_parser.mly"
    ( _2 _3 )
# 63084 "reason_parser.ml"
             in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 63092 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 63098 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 63104 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_expr = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_es6_parameters = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _endpos = _endpos__4_ in
              let _startpos = _startpos__1_ in
              
# 2830 "reason_parser.mly"
    ( let (ps, uncurried) = _2 in
      let exp = List.fold_right mkexp_fun ps _4 in
      if uncurried then
        let loc = mklocation _startpos _endpos in
        {exp with pexp_attributes = (uncurry_payload loc)::exp.pexp_attributes}
      else exp
    )
# 63161 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__4_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 63170 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 63176 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 63182 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _6;
          MenhirLib.EngineTypes.startp = _startpos__6_;
          MenhirLib.EngineTypes.endp = _endpos__6_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _5;
            MenhirLib.EngineTypes.startp = _startpos__5_;
            MenhirLib.EngineTypes.endp = _endpos__5_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _4;
              MenhirLib.EngineTypes.startp = _startpos__4_;
              MenhirLib.EngineTypes.endp = _endpos__4_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _3;
                MenhirLib.EngineTypes.startp = _startpos__3_;
                MenhirLib.EngineTypes.endp = _endpos__3_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _2;
                  MenhirLib.EngineTypes.startp = _startpos__2_;
                  MenhirLib.EngineTypes.endp = _endpos__2_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _1;
                    MenhirLib.EngineTypes.startp = _startpos__1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _6 : 'tv_expr = Obj.magic _6 in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_non_arrowed_core_type = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_es6_parameters = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__6_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _endpos = _endpos__6_ in
              let _startpos = _startpos__1_ in
              
# 2838 "reason_parser.mly"
    ( let (ps, uncurried) = _2 in
    let exp = List.fold_right mkexp_fun ps
        (ghexp_constraint (mklocation _startpos__4_ _endpos) _6 (Some _4, None))  in
    if uncurried then
      let loc = mklocation _startpos _endpos in
      {exp with pexp_attributes = (uncurry_payload loc)::exp.pexp_attributes}
    else exp
    )
# 63254 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__6_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 63263 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 63269 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 63275 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2_inlined1;
          MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _2_inlined1 : 'tv_llist_aux_match_case_expr__ = Obj.magic _2_inlined1 in
        let _1_inlined1 : 'tv_match_case_expr_ = Obj.magic _1_inlined1 in
        let _2 : 'tv_optional_expr_extension = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_inlined1_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _3 =
                let (_2, _1) = (_2_inlined1, _1_inlined1) in
                let _1 = 
# 4954 "reason_parser.mly"
                                          ( _1 :: List.rev _2 )
# 63326 "reason_parser.ml"
                 in
                
# 3428 "reason_parser.mly"
                                                            ( _1 )
# 63331 "reason_parser.ml"
                
              in
              
# 2851 "reason_parser.mly"
    ( _2 (mkexp (Pexp_function _3)) )
# 63337 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__2_inlined1_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 63346 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 63352 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 63358 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _6;
          MenhirLib.EngineTypes.startp = _startpos__6_;
          MenhirLib.EngineTypes.endp = _endpos__6_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _4;
                MenhirLib.EngineTypes.startp = _startpos__4_;
                MenhirLib.EngineTypes.endp = _endpos__4_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _3;
                  MenhirLib.EngineTypes.startp = _startpos__3_;
                  MenhirLib.EngineTypes.endp = _endpos__3_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _2;
                    MenhirLib.EngineTypes.startp = _startpos__2_;
                    MenhirLib.EngineTypes.endp = _endpos__2_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _menhir_s;
                      MenhirLib.EngineTypes.semv = _1;
                      MenhirLib.EngineTypes.startp = _startpos__1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_;
                      MenhirLib.EngineTypes.next = _menhir_stack;
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _6 : unit = Obj.magic _6 in
        let _2_inlined1 : 'tv_llist_aux_match_case_seq_expr__ = Obj.magic _2_inlined1 in
        let _1_inlined1 : 'tv_match_case_seq_expr_ = Obj.magic _1_inlined1 in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_simple_expr_no_constructor = Obj.magic _3 in
        let _2 : 'tv_optional_expr_extension = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__6_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _5 =
                let (_2, _1) = (_2_inlined1, _1_inlined1) in
                let _1 = 
# 4954 "reason_parser.mly"
                                          ( _1 :: List.rev _2 )
# 63430 "reason_parser.ml"
                 in
                
# 3428 "reason_parser.mly"
                                                            ( _1 )
# 63435 "reason_parser.ml"
                
              in
              
# 2854 "reason_parser.mly"
    ( _2 (mkexp (Pexp_match (_3, _5))) )
# 63441 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__6_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 63450 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 63456 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 63462 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _6;
          MenhirLib.EngineTypes.startp = _startpos__6_;
          MenhirLib.EngineTypes.endp = _endpos__6_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _4;
                MenhirLib.EngineTypes.startp = _startpos__4_;
                MenhirLib.EngineTypes.endp = _endpos__4_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _3;
                  MenhirLib.EngineTypes.startp = _startpos__3_;
                  MenhirLib.EngineTypes.endp = _endpos__3_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _2;
                    MenhirLib.EngineTypes.startp = _startpos__2_;
                    MenhirLib.EngineTypes.endp = _endpos__2_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _menhir_s;
                      MenhirLib.EngineTypes.semv = _1;
                      MenhirLib.EngineTypes.startp = _startpos__1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_;
                      MenhirLib.EngineTypes.next = _menhir_stack;
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _6 : unit = Obj.magic _6 in
        let _2_inlined1 : 'tv_llist_aux_match_case_seq_expr__ = Obj.magic _2_inlined1 in
        let _1_inlined1 : 'tv_match_case_seq_expr_ = Obj.magic _1_inlined1 in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_simple_expr_no_constructor = Obj.magic _3 in
        let _2 : 'tv_optional_expr_extension = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__6_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _5 =
                let (_2, _1) = (_2_inlined1, _1_inlined1) in
                let _1 = 
# 4954 "reason_parser.mly"
                                          ( _1 :: List.rev _2 )
# 63534 "reason_parser.ml"
                 in
                
# 3428 "reason_parser.mly"
                                                            ( _1 )
# 63539 "reason_parser.ml"
                
              in
              
# 2857 "reason_parser.mly"
    ( _2 (mkexp (Pexp_try (_3, _5))) )
# 63545 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__6_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 63554 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 63560 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 63566 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : unit = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_simple_expr_no_constructor = Obj.magic _3 in
        let _2 : 'tv_optional_expr_extension = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x = 
# 2859 "reason_parser.mly"
    ( syntax_error_exp (mklocation _startpos__5_ _endpos__5_) "Invalid try with")
# 63621 "reason_parser.ml"
             in
            let (_endpos_x_, _startpos_x_) = (_endpos__5_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 63629 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 63635 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 63641 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _1_inlined1;
          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _1_inlined1 : 'tv_simple_expr_call = Obj.magic _1_inlined1 in
        let _3 : 'tv_parenthesized_expr = Obj.magic _3 in
        let _2 : 'tv_optional_expr_extension = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_inlined1_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _5 = 
# 124 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( None )
# 63690 "reason_parser.ml"
               in
              let _4 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let _endpos = _endpos__1_ in
                let _startpos = _startpos__1_ in
                
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 63699 "reason_parser.ml"
                
              in
              
# 2862 "reason_parser.mly"
    ( _2 (mkexp (Pexp_ifthenelse(_3, _4, _5))) )
# 63705 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__1_inlined1_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 63714 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 63720 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 63726 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x;
          MenhirLib.EngineTypes.startp = _startpos_x_;
          MenhirLib.EngineTypes.endp = _endpos_x_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined2;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _3;
                MenhirLib.EngineTypes.startp = _startpos__3_;
                MenhirLib.EngineTypes.endp = _endpos__3_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _2;
                  MenhirLib.EngineTypes.startp = _startpos__2_;
                  MenhirLib.EngineTypes.endp = _endpos__2_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _1;
                    MenhirLib.EngineTypes.startp = _startpos__1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let x : 'tv_expr = Obj.magic x in
        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
        let _1_inlined1 : 'tv_simple_expr_call = Obj.magic _1_inlined1 in
        let _3 : 'tv_parenthesized_expr = Obj.magic _3 in
        let _2 : 'tv_optional_expr_extension = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _5 =
                let _1 = _1_inlined2 in
                let x = 
# 183 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( x )
# 63791 "reason_parser.ml"
                 in
                
# 126 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
    ( Some x )
# 63796 "reason_parser.ml"
                
              in
              let _4 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let _endpos = _endpos__1_ in
                let _startpos = _startpos__1_ in
                
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 63806 "reason_parser.ml"
                
              in
              
# 2862 "reason_parser.mly"
    ( _2 (mkexp (Pexp_ifthenelse(_3, _4, _5))) )
# 63812 "reason_parser.ml"
              
            in
            let _startpos_x_ = _startpos__1_ in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 63821 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 63827 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 63833 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _1_inlined1;
          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _2;
              MenhirLib.EngineTypes.startp = _startpos__2_;
              MenhirLib.EngineTypes.endp = _endpos__2_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _1_inlined1 : 'tv_simple_expr_call = Obj.magic _1_inlined1 in
        let _3 : 'tv_parenthesized_expr = Obj.magic _3 in
        let _2 : 'tv_optional_expr_extension = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_inlined1_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _4 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let _endpos = _endpos__1_ in
                let _startpos = _startpos__1_ in
                
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 63886 "reason_parser.ml"
                
              in
              
# 2864 "reason_parser.mly"
    ( _2 (mkexp (Pexp_while(_3, _4))) )
# 63892 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__1_inlined1_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 63901 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 63907 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 63913 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _1_inlined1;
          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _9;
            MenhirLib.EngineTypes.startp = _startpos__9_;
            MenhirLib.EngineTypes.endp = _endpos__9_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _8;
              MenhirLib.EngineTypes.startp = _startpos__8_;
              MenhirLib.EngineTypes.endp = _endpos__8_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _7;
                MenhirLib.EngineTypes.startp = _startpos__7_;
                MenhirLib.EngineTypes.endp = _endpos__7_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _6;
                  MenhirLib.EngineTypes.startp = _startpos__6_;
                  MenhirLib.EngineTypes.endp = _endpos__6_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _5;
                    MenhirLib.EngineTypes.startp = _startpos__5_;
                    MenhirLib.EngineTypes.endp = _endpos__5_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _4;
                      MenhirLib.EngineTypes.startp = _startpos__4_;
                      MenhirLib.EngineTypes.endp = _endpos__4_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _;
                        MenhirLib.EngineTypes.semv = _3;
                        MenhirLib.EngineTypes.startp = _startpos__3_;
                        MenhirLib.EngineTypes.endp = _endpos__3_;
                        MenhirLib.EngineTypes.next = {
                          MenhirLib.EngineTypes.state = _;
                          MenhirLib.EngineTypes.semv = _2;
                          MenhirLib.EngineTypes.startp = _startpos__2_;
                          MenhirLib.EngineTypes.endp = _endpos__2_;
                          MenhirLib.EngineTypes.next = {
                            MenhirLib.EngineTypes.state = _menhir_s;
                            MenhirLib.EngineTypes.semv = _1;
                            MenhirLib.EngineTypes.startp = _startpos__1_;
                            MenhirLib.EngineTypes.endp = _endpos__1_;
                            MenhirLib.EngineTypes.next = _menhir_stack;
                          };
                        };
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _1_inlined1 : 'tv_simple_expr_call = Obj.magic _1_inlined1 in
        let _9 : unit = Obj.magic _9 in
        let _8 : 'tv_expr = Obj.magic _8 in
        let _7 : 'tv_direction_flag = Obj.magic _7 in
        let _6 : 'tv_expr = Obj.magic _6 in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_pattern = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_optional_expr_extension = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_inlined1_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _10 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let _endpos = _endpos__1_ in
                let _startpos = _startpos__1_ in
                
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 64008 "reason_parser.ml"
                
              in
              
# 2867 "reason_parser.mly"
    ( _2 (mkexp (Pexp_for(_4, _6, _8, _7, _10))) )
# 64014 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__1_inlined1_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 64023 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 64029 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 64035 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _8;
          MenhirLib.EngineTypes.startp = _startpos__8_;
          MenhirLib.EngineTypes.endp = _endpos__8_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _7;
            MenhirLib.EngineTypes.startp = _startpos__7_;
            MenhirLib.EngineTypes.endp = _endpos__7_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _6;
              MenhirLib.EngineTypes.startp = _startpos__6_;
              MenhirLib.EngineTypes.endp = _endpos__6_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _5;
                MenhirLib.EngineTypes.startp = _startpos__5_;
                MenhirLib.EngineTypes.endp = _endpos__5_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _4;
                  MenhirLib.EngineTypes.startp = _startpos__4_;
                  MenhirLib.EngineTypes.endp = _endpos__4_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _3;
                    MenhirLib.EngineTypes.startp = _startpos__3_;
                    MenhirLib.EngineTypes.endp = _endpos__3_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _2;
                      MenhirLib.EngineTypes.startp = _startpos__2_;
                      MenhirLib.EngineTypes.endp = _endpos__2_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _menhir_s;
                        MenhirLib.EngineTypes.semv = _1;
                        MenhirLib.EngineTypes.startp = _startpos__1_;
                        MenhirLib.EngineTypes.endp = _endpos__1_;
                        MenhirLib.EngineTypes.next = _menhir_stack;
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _8 : unit = Obj.magic _8 in
        let _7 : 'tv_expr = Obj.magic _7 in
        let _6 : unit = Obj.magic _6 in
        let _5 : 'tv_expr = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__8_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _endpos = _endpos__8_ in
              let _symbolstartpos = _startpos__1_ in
              
# 2869 "reason_parser.mly"
    ( let loc_colon = mklocation _startpos__2_ _endpos__2_ in
      let loc = mklocation _symbolstartpos _endpos in
      mkexp_cons loc_colon (mkexp ~ghost:true ~loc (Pexp_tuple[_5;_7])) loc
    )
# 64117 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__8_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 64126 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 64132 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 64138 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : (
# 1147 "reason_parser.mly"
       (string)
# 64172 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4590 "reason_parser.mly"
                      ( _1 )
# 64186 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 64194 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 64204 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 64213 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 64219 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 64225 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : (
# 1148 "reason_parser.mly"
       (string)
# 64259 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4591 "reason_parser.mly"
                      ( _1 )
# 64273 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 64281 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 64291 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 64300 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 64306 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 64312 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : (
# 1149 "reason_parser.mly"
       (string)
# 64346 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4592 "reason_parser.mly"
                      ( _1 )
# 64360 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 64368 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 64378 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 64387 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 64393 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 64399 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : (
# 1150 "reason_parser.mly"
       (string)
# 64433 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4593 "reason_parser.mly"
                      ( _1 )
# 64447 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 64455 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 64465 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 64474 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 64480 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 64486 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4595 "reason_parser.mly"
                      ( "/>" )
# 64530 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 64538 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 64548 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 64557 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 64563 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 64569 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : (
# 1153 "reason_parser.mly"
       (string)
# 64603 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4596 "reason_parser.mly"
                      ( _1 )
# 64617 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 64625 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 64635 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 64644 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 64650 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 64656 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4597 "reason_parser.mly"
                      ( "+" )
# 64700 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 64708 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 64718 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 64727 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 64733 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 64739 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4598 "reason_parser.mly"
                      ( "+." )
# 64783 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 64791 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 64801 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 64810 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 64816 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 64822 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4599 "reason_parser.mly"
                      ( "-" )
# 64866 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 64874 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 64884 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 64893 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 64899 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 64905 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4600 "reason_parser.mly"
                      ( "-." )
# 64949 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 64957 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 64967 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 64976 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 64982 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 64988 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4601 "reason_parser.mly"
                      ( "*" )
# 65032 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 65040 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 65050 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 65059 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 65065 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 65071 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4602 "reason_parser.mly"
                      ( "<" )
# 65115 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 65123 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 65133 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 65142 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 65148 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 65154 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4603 "reason_parser.mly"
                      ( ">" )
# 65198 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 65206 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 65216 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 65225 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 65231 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 65237 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4604 "reason_parser.mly"
                      ( "or" )
# 65281 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 65289 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 65299 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 65308 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 65314 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 65320 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4605 "reason_parser.mly"
                      ( "||" )
# 65364 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 65372 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 65382 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 65391 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 65397 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 65403 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4606 "reason_parser.mly"
                      ( "&" )
# 65447 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 65455 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 65465 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 65474 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 65480 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 65486 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4607 "reason_parser.mly"
                      ( "&&" )
# 65530 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 65538 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 65548 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 65557 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 65563 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 65569 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4608 "reason_parser.mly"
                      ( ":=" )
# 65613 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 65621 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 65631 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 65640 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 65646 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 65652 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4609 "reason_parser.mly"
                      ( "+=" )
# 65696 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 65704 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 65714 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 65723 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 65729 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 65735 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4610 "reason_parser.mly"
                      ( "%" )
# 65779 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 65787 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 65797 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 65806 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 65812 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 65818 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4617 "reason_parser.mly"
                      ( "<..>" )
# 65862 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 65870 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 65880 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 65889 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 65895 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 65901 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_startpos__1_, _1) = (_startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4618 "reason_parser.mly"
                      ( ">>" )
# 65952 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 65960 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 65970 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 65979 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 65985 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 65991 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4619 "reason_parser.mly"
                     ( ">..." )
# 66035 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 66043 "reason_parser.ml"
                
              in
              
# 2874 "reason_parser.mly"
    ( let op = match _2.txt with
      | "->" -> {_2 with txt = "|."}
      | _ -> _2
      in mkinfix _1 op _3
    )
# 66053 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 66062 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 66068 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 66074 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : (
# 1147 "reason_parser.mly"
       (string)
# 66108 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4590 "reason_parser.mly"
                      ( _1 )
# 66122 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 66130 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 66136 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 66145 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 66151 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 66157 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : (
# 1148 "reason_parser.mly"
       (string)
# 66191 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4591 "reason_parser.mly"
                      ( _1 )
# 66205 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 66213 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 66219 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 66228 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 66234 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 66240 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : (
# 1149 "reason_parser.mly"
       (string)
# 66274 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4592 "reason_parser.mly"
                      ( _1 )
# 66288 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 66296 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 66302 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 66311 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 66317 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 66323 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : (
# 1150 "reason_parser.mly"
       (string)
# 66357 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4593 "reason_parser.mly"
                      ( _1 )
# 66371 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 66379 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 66385 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 66394 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 66400 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 66406 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4595 "reason_parser.mly"
                      ( "/>" )
# 66450 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 66458 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 66464 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 66473 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 66479 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 66485 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : (
# 1153 "reason_parser.mly"
       (string)
# 66519 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4596 "reason_parser.mly"
                      ( _1 )
# 66533 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 66541 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 66547 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 66556 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 66562 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 66568 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4597 "reason_parser.mly"
                      ( "+" )
# 66612 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 66620 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 66626 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 66635 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 66641 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 66647 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4598 "reason_parser.mly"
                      ( "+." )
# 66691 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 66699 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 66705 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 66714 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 66720 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 66726 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4599 "reason_parser.mly"
                      ( "-" )
# 66770 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 66778 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 66784 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 66793 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 66799 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 66805 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4600 "reason_parser.mly"
                      ( "-." )
# 66849 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 66857 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 66863 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 66872 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 66878 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 66884 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4601 "reason_parser.mly"
                      ( "*" )
# 66928 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 66936 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 66942 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 66951 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 66957 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 66963 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4602 "reason_parser.mly"
                      ( "<" )
# 67007 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 67015 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 67021 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 67030 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 67036 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 67042 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4603 "reason_parser.mly"
                      ( ">" )
# 67086 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 67094 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 67100 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 67109 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 67115 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 67121 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4604 "reason_parser.mly"
                      ( "or" )
# 67165 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 67173 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 67179 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 67188 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 67194 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 67200 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4605 "reason_parser.mly"
                      ( "||" )
# 67244 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 67252 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 67258 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 67267 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 67273 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 67279 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4606 "reason_parser.mly"
                      ( "&" )
# 67323 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 67331 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 67337 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 67346 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 67352 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 67358 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4607 "reason_parser.mly"
                      ( "&&" )
# 67402 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 67410 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 67416 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 67425 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 67431 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 67437 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4608 "reason_parser.mly"
                      ( ":=" )
# 67481 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 67489 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 67495 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 67504 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 67510 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 67516 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4609 "reason_parser.mly"
                      ( "+=" )
# 67560 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 67568 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 67574 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 67583 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 67589 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 67595 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4610 "reason_parser.mly"
                      ( "%" )
# 67639 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 67647 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 67653 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 67662 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 67668 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 67674 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4617 "reason_parser.mly"
                      ( "<..>" )
# 67718 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 67726 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 67732 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 67741 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 67747 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 67753 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_startpos__1_, _1) = (_startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4618 "reason_parser.mly"
                      ( ">>" )
# 67804 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 67812 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 67818 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 67827 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 67833 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 67839 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _1_inlined1;
            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let x = 
# 4619 "reason_parser.mly"
                     ( ">..." )
# 67883 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 67891 "reason_parser.ml"
                
              in
              
# 2880 "reason_parser.mly"
    ( expecting (with_txt _2 "expression after infix operator") )
# 67897 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 67906 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 67912 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 67918 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_expr = Obj.magic _2 in
        let x : 'tv_subtractive = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _1 =
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 67956 "reason_parser.ml"
                
              in
              
# 2882 "reason_parser.mly"
    ( mkuminus _1 _2 )
# 67962 "reason_parser.ml"
              
            in
            let _endpos_x_ = _endpos__2_ in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 67971 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 67977 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 67983 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = x;
            MenhirLib.EngineTypes.startp = _startpos_x_;
            MenhirLib.EngineTypes.endp = _endpos_x_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_expr = Obj.magic _2 in
        let x : 'tv_additive = Obj.magic x in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos_x_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _1 =
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 68021 "reason_parser.ml"
                
              in
              
# 2884 "reason_parser.mly"
    ( mkuplus _1 _2 )
# 68027 "reason_parser.ml"
              
            in
            let _endpos_x_ = _endpos__2_ in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 68036 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 68042 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 68048 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _2;
          MenhirLib.EngineTypes.startp = _startpos__2_;
          MenhirLib.EngineTypes.endp = _endpos__2_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _2 : 'tv_expr = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__2_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _1 =
                let x = 
# 2885 "reason_parser.mly"
                ("!")
# 68084 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 68092 "reason_parser.ml"
                
              in
              
# 2886 "reason_parser.mly"
    ( mkexp(Pexp_apply(mkoperator _1, [Nolabel,_2])) )
# 68098 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__2_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 68107 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 68113 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 68119 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_expr = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let x : 'tv_label_longident = Obj.magic x in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_simple_expr_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _3 =
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 68178 "reason_parser.ml"
                
              in
              let _1 =
                let _endpos = _endpos__1_ in
                let _startpos = _startpos__1_ in
                
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 68187 "reason_parser.ml"
                
              in
              
# 2888 "reason_parser.mly"
    ( mkexp(Pexp_setfield(_1, _3, _5)) )
# 68193 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__5_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 68202 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 68208 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 68214 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _6;
          MenhirLib.EngineTypes.startp = _startpos__6_;
          MenhirLib.EngineTypes.endp = _endpos__6_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _5;
            MenhirLib.EngineTypes.startp = _startpos__5_;
            MenhirLib.EngineTypes.endp = _endpos__5_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _4;
              MenhirLib.EngineTypes.startp = _startpos__4_;
              MenhirLib.EngineTypes.endp = _endpos__4_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _3;
                MenhirLib.EngineTypes.startp = _startpos__3_;
                MenhirLib.EngineTypes.endp = _endpos__3_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _2;
                  MenhirLib.EngineTypes.startp = _startpos__2_;
                  MenhirLib.EngineTypes.endp = _endpos__2_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _1;
                    MenhirLib.EngineTypes.startp = _startpos__1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _6 : 'tv_expr = Obj.magic _6 in
        let _5 : unit = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_simple_expr_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__6_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _1 =
                let _endpos = _endpos__1_ in
                let _startpos = _startpos__1_ in
                
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 68280 "reason_parser.ml"
                
              in
              let _endpos = _endpos__6_ in
              let _symbolstartpos = _startpos__1_ in
              
# 2890 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      let exp = Pexp_ident(array_function ~loc "Array" "set") in
      mkexp(Pexp_apply(mkexp ~ghost:true ~loc exp,
                       [Nolabel,_1; Nolabel,_3; Nolabel,_6]))
    )
# 68292 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__6_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 68301 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 68307 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 68313 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _7;
          MenhirLib.EngineTypes.startp = _startpos__7_;
          MenhirLib.EngineTypes.endp = _endpos__7_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _6;
            MenhirLib.EngineTypes.startp = _startpos__6_;
            MenhirLib.EngineTypes.endp = _endpos__6_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _5;
              MenhirLib.EngineTypes.startp = _startpos__5_;
              MenhirLib.EngineTypes.endp = _endpos__5_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _4;
                MenhirLib.EngineTypes.startp = _startpos__4_;
                MenhirLib.EngineTypes.endp = _endpos__4_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _3;
                  MenhirLib.EngineTypes.startp = _startpos__3_;
                  MenhirLib.EngineTypes.endp = _endpos__3_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _2;
                    MenhirLib.EngineTypes.startp = _startpos__2_;
                    MenhirLib.EngineTypes.endp = _endpos__2_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _menhir_s;
                      MenhirLib.EngineTypes.semv = _1;
                      MenhirLib.EngineTypes.startp = _startpos__1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_;
                      MenhirLib.EngineTypes.next = _menhir_stack;
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _7 : 'tv_expr = Obj.magic _7 in
        let _6 : unit = Obj.magic _6 in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_expr = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_simple_expr_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__7_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _1 =
                let _endpos = _endpos__1_ in
                let _startpos = _startpos__1_ in
                
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 68386 "reason_parser.ml"
                
              in
              let _endpos = _endpos__7_ in
              let _symbolstartpos = _startpos__1_ in
              
# 2896 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      let exp = Pexp_ident(array_function ~loc "String" "set") in
      mkexp(Pexp_apply(mkexp ~ghost:true ~loc exp,
                       [Nolabel,_1; Nolabel,_4; Nolabel,_7]))
    )
# 68398 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__7_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 68407 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 68413 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 68419 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _5;
              MenhirLib.EngineTypes.startp = _startpos__5_;
              MenhirLib.EngineTypes.endp = _endpos__5_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _4_inlined1;
                MenhirLib.EngineTypes.startp = _startpos__4_inlined1_;
                MenhirLib.EngineTypes.endp = _endpos__4_inlined1_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _1_inlined2;
                  MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
                  MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _2;
                    MenhirLib.EngineTypes.startp = _startpos__2_;
                    MenhirLib.EngineTypes.endp = _endpos__2_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _;
                      MenhirLib.EngineTypes.semv = _1_inlined1;
                      MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                      MenhirLib.EngineTypes.next = {
                        MenhirLib.EngineTypes.state = _menhir_s;
                        MenhirLib.EngineTypes.semv = _1;
                        MenhirLib.EngineTypes.startp = _startpos__1_;
                        MenhirLib.EngineTypes.endp = _endpos__1_;
                        MenhirLib.EngineTypes.next = _menhir_stack;
                      };
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_expr = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _5 : unit = Obj.magic _5 in
        let _4_inlined1 : 'tv_option_COMMA_ = Obj.magic _4_inlined1 in
        let _1_inlined2 : 'tv_lseparated_nonempty_list_aux_COMMA_expr_ = Obj.magic _1_inlined2 in
        let _2 : unit = Obj.magic _2 in
        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
        let _1 : 'tv_simple_expr_call = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_4, _1_inlined1, _1) = (_4_inlined1, _1_inlined2, _1_inlined1) in
                let _3 =
                  let _1 = _1_inlined1 in
                  
# 4968 "reason_parser.mly"
                                       ( List.rev _1 )
# 68500 "reason_parser.ml"
                  
                in
                
# 2988 "reason_parser.mly"
                                                                 ( _3 )
# 68506 "reason_parser.ml"
                
              in
              let _1 =
                let _endpos = _endpos__1_ in
                let _startpos = _startpos__1_ in
                
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 68515 "reason_parser.ml"
                
              in
              let _endpos = _endpos__4_ in
              let _symbolstartpos = _startpos__1_ in
              
# 2902 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      bigarray_set ~loc _1 _2 _4
    )
# 68525 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__4_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 68534 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 68540 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 68546 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : (
# 1173 "reason_parser.mly"
       (string)
# 68581 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _1 =
                let x = 
# 4721 "reason_parser.mly"
                      ( _1 )
# 68593 "reason_parser.ml"
                 in
                let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
                let _endpos = _endpos_x_ in
                let _symbolstartpos = _startpos_x_ in
                
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 68601 "reason_parser.ml"
                
              in
              
# 2906 "reason_parser.mly"
    ( mkexp(Pexp_setinstvar(_1, _3)) )
# 68607 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__3_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 68616 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 68622 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 68628 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _1_inlined1;
          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _1_inlined1 : 'tv_simple_expr_call = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_inlined1_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let _endpos = _endpos__1_ in
                let _startpos = _startpos__1_ in
                
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 68667 "reason_parser.ml"
                
              in
              
# 2908 "reason_parser.mly"
    ( mkexp (Pexp_assert _2) )
# 68673 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__1_inlined1_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 68682 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 68688 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 68694 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _1_inlined1;
          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _menhir_s;
            MenhirLib.EngineTypes.semv = _1;
            MenhirLib.EngineTypes.startp = _startpos__1_;
            MenhirLib.EngineTypes.endp = _endpos__1_;
            MenhirLib.EngineTypes.next = _menhir_stack;
          };
        } = _menhir_stack in
        let _1_inlined1 : 'tv_simple_expr_call = Obj.magic _1_inlined1 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_inlined1_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x =
              let _2 =
                let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
                let _endpos = _endpos__1_ in
                let _startpos = _startpos__1_ in
                
# 3133 "reason_parser.mly"
                                      ( mkexp_app_rev _startpos _endpos _1 )
# 68733 "reason_parser.ml"
                
              in
              
# 2910 "reason_parser.mly"
    ( mkexp (Pexp_lazy _2) )
# 68739 "reason_parser.ml"
              
            in
            let (_endpos_x_, _startpos_x_) = (_endpos__1_inlined1_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 68748 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 68754 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 68760 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_expr = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_expr = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_unattributed_expr = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_unattributed_expr = let _1 =
          let _1 =
            let x = 
# 2936 "reason_parser.mly"
    ( (* Should use ghost expressions, but not sure how that would work with source maps *)
      (* So ? will become true and : becomes false for now*)
      let loc_question = mklocation _startpos__2_ _endpos__2_ in
      let loc_colon = mklocation _startpos__4_ _endpos__4_ in
      let fauxTruePat =
        Pat.mk ~loc:loc_question (Ppat_construct({txt = Lident "true"; loc = loc_question}, None)) in
      let fauxFalsePat =
        Pat.mk ~loc:loc_colon (Ppat_construct({txt = Lident "false"; loc = loc_colon}, None)) in
      let fauxMatchCaseTrue = Exp.case fauxTruePat _3 in
      let fauxMatchCaseFalse = Exp.case fauxFalsePat _5 in
      mkexp (Pexp_match (_1, [fauxMatchCaseTrue; fauxMatchCaseFalse]))
    )
# 68826 "reason_parser.ml"
             in
            let (_endpos_x_, _startpos_x_) = (_endpos__5_, _startpos__1_) in
            let _endpos = _endpos_x_ in
            let _symbolstartpos = _startpos_x_ in
            
# 4908 "reason_parser.mly"
  ( {x with pexp_loc = {x.pexp_loc with loc_start = _symbolstartpos; loc_end = _endpos}} )
# 68834 "reason_parser.ml"
            
          in
          
# 2948 "reason_parser.mly"
    (_1)
# 68840 "reason_parser.ml"
          
        in
        
# 2966 "reason_parser.mly"
                                                ( _1 )
# 68846 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_use_file_no_mapper = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : (
# 1381 "reason_parser.mly"
      (Ast_404.Parsetree.toplevel_phrase list)
# 68871 "reason_parser.ml"
        ) = 
# 1442 "reason_parser.mly"
                     ( apply_mapper_to_use_file _1 reason_mapper )
# 68875 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_embedded___anonymous_1_ = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_use_file_no_mapper = 
# 1438 "reason_parser.mly"
    ( _1 )
# 68900 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : (
# 1173 "reason_parser.mly"
       (string)
# 68921 "reason_parser.ml"
        ) = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_val_ident = 
# 4585 "reason_parser.mly"
                           ( _1 )
# 68929 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : unit = Obj.magic _3 in
        let _2 : 'tv_operator = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_val_ident = 
# 4586 "reason_parser.mly"
                           ( _2 )
# 68968 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : 'tv_val_ident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_val_longident = 
# 4639 "reason_parser.mly"
                                  ( Lident _1 )
# 68993 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _3;
          MenhirLib.EngineTypes.startp = _startpos__3_;
          MenhirLib.EngineTypes.endp = _endpos__3_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _2;
            MenhirLib.EngineTypes.startp = _startpos__2_;
            MenhirLib.EngineTypes.endp = _endpos__2_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _menhir_s;
              MenhirLib.EngineTypes.semv = _1;
              MenhirLib.EngineTypes.startp = _startpos__1_;
              MenhirLib.EngineTypes.endp = _endpos__1_;
              MenhirLib.EngineTypes.next = _menhir_stack;
            };
          };
        } = _menhir_stack in
        let _3 : 'tv_val_ident = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_mod_longident = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__3_ in
        let _v : 'tv_val_longident = 
# 4640 "reason_parser.mly"
                                  ( Ldot(_1, _3) )
# 69032 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _6;
          MenhirLib.EngineTypes.startp = _startpos__6_;
          MenhirLib.EngineTypes.endp = _endpos__6_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _5;
            MenhirLib.EngineTypes.startp = _startpos__5_;
            MenhirLib.EngineTypes.endp = _endpos__5_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _3;
                MenhirLib.EngineTypes.startp = _startpos__3_;
                MenhirLib.EngineTypes.endp = _endpos__3_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _2;
                  MenhirLib.EngineTypes.startp = _startpos__2_;
                  MenhirLib.EngineTypes.endp = _endpos__2_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _1;
                    MenhirLib.EngineTypes.startp = _startpos__1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _6 : 'tv_core_type = Obj.magic _6 in
        let _5 : unit = Obj.magic _5 in
        let _1_inlined1 : (
# 1173 "reason_parser.mly"
       (string)
# 69085 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_override_flag = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__6_ in
        let _v : 'tv_value = let _4 =
          let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
          let x = 
# 4721 "reason_parser.mly"
                      ( _1 )
# 69098 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 69106 "reason_parser.ml"
          
        in
        let _endpos = _endpos__6_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          _startpos__2_ in
        
# 2126 "reason_parser.mly"
    ( if _1 = Override
      then not_expecting _symbolstartpos _endpos "members marked virtual may not also be marked overridden"
      else (_4, Mutable, Cfk_virtual _6)
    )
# 69120 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _7;
          MenhirLib.EngineTypes.startp = _startpos__7_;
          MenhirLib.EngineTypes.endp = _endpos__7_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _6;
            MenhirLib.EngineTypes.startp = _startpos__6_;
            MenhirLib.EngineTypes.endp = _endpos__6_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _5;
              MenhirLib.EngineTypes.startp = _startpos__5_;
              MenhirLib.EngineTypes.endp = _endpos__5_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _1_inlined1;
                MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _3;
                  MenhirLib.EngineTypes.startp = _startpos__3_;
                  MenhirLib.EngineTypes.endp = _endpos__3_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = _2;
                    MenhirLib.EngineTypes.startp = _startpos__2_;
                    MenhirLib.EngineTypes.endp = _endpos__2_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _menhir_s;
                      MenhirLib.EngineTypes.semv = _1;
                      MenhirLib.EngineTypes.startp = _startpos__1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_;
                      MenhirLib.EngineTypes.next = _menhir_stack;
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _7 : unit = Obj.magic _7 in
        let _6 : 'tv_core_type = Obj.magic _6 in
        let _5 : unit = Obj.magic _5 in
        let _1_inlined1 : (
# 1173 "reason_parser.mly"
       (string)
# 69180 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _3 : unit = Obj.magic _3 in
        let _2 : unit = Obj.magic _2 in
        let _1 : 'tv_override_flag = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__7_ in
        let _v : 'tv_value = let _4 =
          let _1 = _1_inlined1 in
          
# 4721 "reason_parser.mly"
                      ( _1 )
# 69193 "reason_parser.ml"
          
        in
        
# 2131 "reason_parser.mly"
    ( not_expecting _startpos__7_ _endpos__7_ "not expecting equal - cannot specify value for virtual val" )
# 69199 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_core_type = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _1_inlined1 : (
# 1173 "reason_parser.mly"
       (string)
# 69246 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _2 : 'tv_mutable_flag = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_value = let _3 =
          let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
          let x = 
# 4721 "reason_parser.mly"
                      ( _1 )
# 69258 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 69266 "reason_parser.ml"
          
        in
        
# 2133 "reason_parser.mly"
    ( (_3, _2, Cfk_virtual _5) )
# 69272 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _6;
          MenhirLib.EngineTypes.startp = _startpos__6_;
          MenhirLib.EngineTypes.endp = _endpos__6_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _5;
            MenhirLib.EngineTypes.startp = _startpos__5_;
            MenhirLib.EngineTypes.endp = _endpos__5_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _4;
              MenhirLib.EngineTypes.startp = _startpos__4_;
              MenhirLib.EngineTypes.endp = _endpos__4_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _1_inlined1;
                MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _2;
                  MenhirLib.EngineTypes.startp = _startpos__2_;
                  MenhirLib.EngineTypes.endp = _endpos__2_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _1;
                    MenhirLib.EngineTypes.startp = _startpos__1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _6 : unit = Obj.magic _6 in
        let _5 : 'tv_core_type = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _1_inlined1 : (
# 1173 "reason_parser.mly"
       (string)
# 69326 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _2 : 'tv_mutable_flag = Obj.magic _2 in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__6_ in
        let _v : 'tv_value = let _3 =
          let _1 = _1_inlined1 in
          
# 4721 "reason_parser.mly"
                      ( _1 )
# 69338 "reason_parser.ml"
          
        in
        
# 2135 "reason_parser.mly"
    ( not_expecting _startpos__6_ _endpos__6_ "not expecting equal - cannot specify value for virtual val" )
# 69344 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _2;
                MenhirLib.EngineTypes.startp = _startpos__2_;
                MenhirLib.EngineTypes.endp = _endpos__2_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_expr = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _1_inlined1 : (
# 1173 "reason_parser.mly"
       (string)
# 69391 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _2 : 'tv_mutable_flag = Obj.magic _2 in
        let _1 : 'tv_override_flag = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_value = let _3 =
          let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
          let x = 
# 4721 "reason_parser.mly"
                      ( _1 )
# 69403 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 69411 "reason_parser.ml"
          
        in
        
# 2137 "reason_parser.mly"
    ( (_3, _2, Cfk_concrete (_1, _5)) )
# 69417 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _6;
          MenhirLib.EngineTypes.startp = _startpos__6_;
          MenhirLib.EngineTypes.endp = _endpos__6_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _5;
            MenhirLib.EngineTypes.startp = _startpos__5_;
            MenhirLib.EngineTypes.endp = _endpos__5_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _4;
              MenhirLib.EngineTypes.startp = _startpos__4_;
              MenhirLib.EngineTypes.endp = _endpos__4_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _1_inlined1;
                MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
                MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _2;
                  MenhirLib.EngineTypes.startp = _startpos__2_;
                  MenhirLib.EngineTypes.endp = _endpos__2_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _1;
                    MenhirLib.EngineTypes.startp = _startpos__1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _6 : 'tv_expr = Obj.magic _6 in
        let _5 : unit = Obj.magic _5 in
        let _4 : 'tv_type_constraint = Obj.magic _4 in
        let _1_inlined1 : (
# 1173 "reason_parser.mly"
       (string)
# 69471 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _2 : 'tv_mutable_flag = Obj.magic _2 in
        let _1 : 'tv_override_flag = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__6_ in
        let _v : 'tv_value = let _3 =
          let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in
          let x = 
# 4721 "reason_parser.mly"
                      ( _1 )
# 69483 "reason_parser.ml"
           in
          let (_endpos_x_, _startpos_x_) = (_endpos__1_, _startpos__1_) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 69491 "reason_parser.ml"
          
        in
        let _startpos__3_ = _startpos__1_inlined1_ in
        let _endpos = _endpos__6_ in
        let _symbolstartpos = if _startpos__1_ != _endpos__1_ then
          _startpos__1_
        else
          if _startpos__2_ != _endpos__2_ then
            _startpos__2_
          else
            _startpos__3_ in
        
# 2139 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      let e = ghexp_constraint loc _6 _4 in
      (_3, _2, Cfk_concrete (_1, e)) )
# 69508 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _4;
          MenhirLib.EngineTypes.startp = _startpos__4_;
          MenhirLib.EngineTypes.endp = _endpos__4_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _1_inlined1;
              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let _4 : 'tv_core_type = Obj.magic _4 in
        let _3 : unit = Obj.magic _3 in
        let _1_inlined1 : (
# 1173 "reason_parser.mly"
       (string)
# 69549 "reason_parser.ml"
        ) = Obj.magic _1_inlined1 in
        let _1 : 'tv_mutable_or_virtual_flags = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__4_ in
        let _v : 'tv_value_type = let _2 =
          let _1 = _1_inlined1 in
          
# 4721 "reason_parser.mly"
                      ( _1 )
# 69560 "reason_parser.ml"
          
        in
        
# 2371 "reason_parser.mly"
  ( let (mut, virt) = _1 in (_2, mut, virt, _4) )
# 69566 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _endpos = _startpos in
        let _v : 'tv_virtual_flag = 
# 4749 "reason_parser.mly"
                  ( Concrete )
# 69584 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = _1;
          MenhirLib.EngineTypes.startp = _startpos__1_;
          MenhirLib.EngineTypes.endp = _endpos__1_;
          MenhirLib.EngineTypes.next = _menhir_stack;
        } = _menhir_stack in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_ in
        let _v : 'tv_virtual_flag = 
# 4750 "reason_parser.mly"
                  ( Virtual )
# 69609 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _6;
          MenhirLib.EngineTypes.startp = _startpos__6_;
          MenhirLib.EngineTypes.endp = _endpos__6_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _5;
            MenhirLib.EngineTypes.startp = _startpos__5_;
            MenhirLib.EngineTypes.endp = _endpos__5_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _4;
              MenhirLib.EngineTypes.startp = _startpos__4_;
              MenhirLib.EngineTypes.endp = _endpos__4_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _3;
                MenhirLib.EngineTypes.startp = _startpos__3_;
                MenhirLib.EngineTypes.endp = _endpos__3_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = x;
                  MenhirLib.EngineTypes.startp = _startpos_x_;
                  MenhirLib.EngineTypes.endp = _endpos_x_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _menhir_s;
                    MenhirLib.EngineTypes.semv = _1;
                    MenhirLib.EngineTypes.startp = _startpos__1_;
                    MenhirLib.EngineTypes.endp = _endpos__1_;
                    MenhirLib.EngineTypes.next = _menhir_stack;
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _6 : 'tv_core_type = Obj.magic _6 in
        let _5 : 'tv_embedded_private_flag_ = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_type_variables_with_variance = Obj.magic _3 in
        let x : 'tv_label_longident = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__6_ in
        let _v : 'tv_with_constraint = let _7 = 
# 3975 "reason_parser.mly"
    ( [] )
# 69669 "reason_parser.ml"
         in
        let _endpos__7_ = _endpos__6_ in
        let _2 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 69678 "reason_parser.ml"
          
        in
        let _endpos = _endpos__7_ in
        let _symbolstartpos = _startpos__1_ in
        
# 4179 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      let typ = Type.mk {_2 with txt=Longident.last _2.txt}
                  ~params:_3 ~cstrs:_7 ~manifest:_6 ~priv:_5 ~loc in
      Pwith_type (_2, typ)
    )
# 69690 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _1_inlined1;
          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _6;
            MenhirLib.EngineTypes.startp = _startpos__6_;
            MenhirLib.EngineTypes.endp = _endpos__6_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _5;
              MenhirLib.EngineTypes.startp = _startpos__5_;
              MenhirLib.EngineTypes.endp = _endpos__5_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = _4;
                MenhirLib.EngineTypes.startp = _startpos__4_;
                MenhirLib.EngineTypes.endp = _endpos__4_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _;
                  MenhirLib.EngineTypes.semv = _3;
                  MenhirLib.EngineTypes.startp = _startpos__3_;
                  MenhirLib.EngineTypes.endp = _endpos__3_;
                  MenhirLib.EngineTypes.next = {
                    MenhirLib.EngineTypes.state = _;
                    MenhirLib.EngineTypes.semv = x;
                    MenhirLib.EngineTypes.startp = _startpos_x_;
                    MenhirLib.EngineTypes.endp = _endpos_x_;
                    MenhirLib.EngineTypes.next = {
                      MenhirLib.EngineTypes.state = _menhir_s;
                      MenhirLib.EngineTypes.semv = _1;
                      MenhirLib.EngineTypes.startp = _startpos__1_;
                      MenhirLib.EngineTypes.endp = _endpos__1_;
                      MenhirLib.EngineTypes.next = _menhir_stack;
                    };
                  };
                };
              };
            };
          };
        } = _menhir_stack in
        let _1_inlined1 : 'tv_nonempty_list_preceded_CONSTRAINT_constrain__ = Obj.magic _1_inlined1 in
        let _6 : 'tv_core_type = Obj.magic _6 in
        let _5 : 'tv_embedded_private_flag_ = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_type_variables_with_variance = Obj.magic _3 in
        let x : 'tv_label_longident = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__1_inlined1_ in
        let _v : 'tv_with_constraint = let _7 =
          let _1 = _1_inlined1 in
          
# 3976 "reason_parser.mly"
                                     ( _1 )
# 69759 "reason_parser.ml"
          
        in
        let _endpos__7_ = _endpos__1_inlined1_ in
        let _2 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 69769 "reason_parser.ml"
          
        in
        let _endpos = _endpos__7_ in
        let _symbolstartpos = _startpos__1_ in
        
# 4179 "reason_parser.mly"
    ( let loc = mklocation _symbolstartpos _endpos in
      let typ = Type.mk {_2 with txt=Longident.last _2.txt}
                  ~params:_3 ~cstrs:_7 ~manifest:_6 ~priv:_5 ~loc in
      Pwith_type (_2, typ)
    )
# 69781 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = _5;
          MenhirLib.EngineTypes.startp = _startpos__5_;
          MenhirLib.EngineTypes.endp = _endpos__5_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _4;
            MenhirLib.EngineTypes.startp = _startpos__4_;
            MenhirLib.EngineTypes.endp = _endpos__4_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = _3;
              MenhirLib.EngineTypes.startp = _startpos__3_;
              MenhirLib.EngineTypes.endp = _endpos__3_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _;
                MenhirLib.EngineTypes.semv = x;
                MenhirLib.EngineTypes.startp = _startpos_x_;
                MenhirLib.EngineTypes.endp = _endpos_x_;
                MenhirLib.EngineTypes.next = {
                  MenhirLib.EngineTypes.state = _menhir_s;
                  MenhirLib.EngineTypes.semv = _1;
                  MenhirLib.EngineTypes.startp = _startpos__1_;
                  MenhirLib.EngineTypes.endp = _endpos__1_;
                  MenhirLib.EngineTypes.next = _menhir_stack;
                };
              };
            };
          };
        } = _menhir_stack in
        let _5 : 'tv_core_type = Obj.magic _5 in
        let _4 : unit = Obj.magic _4 in
        let _3 : 'tv_type_variables_with_variance = Obj.magic _3 in
        let x : 'tv_label_longident = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos__5_ in
        let _v : 'tv_with_constraint = let _2 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 69837 "reason_parser.ml"
          
        in
        let (_endpos__2_, _startpos__2_) = (_endpos_x_, _startpos_x_) in
        let _endpos = _endpos__5_ in
        let _symbolstartpos = _startpos__1_ in
        
# 4188 "reason_parser.mly"
    ( let last = match _2.txt with
        | Lident s -> s
        | _ -> not_expecting _startpos__2_ _endpos__2_ "Long type identifier"
      in
      let loc = mklocation _symbolstartpos _endpos in
      Pwith_typesubst (Type.mk {_2 with txt=last} ~params:_3 ~manifest:_5 ~loc)
    )
# 69852 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : 'tv_mod_ext_longident = Obj.magic x_inlined1 in
        let _3 : unit = Obj.magic _3 in
        let x : 'tv_mod_longident = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_with_constraint = let _4 =
          let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 69902 "reason_parser.ml"
          
        in
        let _2 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 69911 "reason_parser.ml"
          
        in
        
# 4196 "reason_parser.mly"
      ( Pwith_module (_2, _4) )
# 69917 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
      (fun _menhir_env ->
        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
        let {
          MenhirLib.EngineTypes.state = _;
          MenhirLib.EngineTypes.semv = x_inlined1;
          MenhirLib.EngineTypes.startp = _startpos_x_inlined1_;
          MenhirLib.EngineTypes.endp = _endpos_x_inlined1_;
          MenhirLib.EngineTypes.next = {
            MenhirLib.EngineTypes.state = _;
            MenhirLib.EngineTypes.semv = _3;
            MenhirLib.EngineTypes.startp = _startpos__3_;
            MenhirLib.EngineTypes.endp = _endpos__3_;
            MenhirLib.EngineTypes.next = {
              MenhirLib.EngineTypes.state = _;
              MenhirLib.EngineTypes.semv = x;
              MenhirLib.EngineTypes.startp = _startpos_x_;
              MenhirLib.EngineTypes.endp = _endpos_x_;
              MenhirLib.EngineTypes.next = {
                MenhirLib.EngineTypes.state = _menhir_s;
                MenhirLib.EngineTypes.semv = _1;
                MenhirLib.EngineTypes.startp = _startpos__1_;
                MenhirLib.EngineTypes.endp = _endpos__1_;
                MenhirLib.EngineTypes.next = _menhir_stack;
              };
            };
          };
        } = _menhir_stack in
        let x_inlined1 : 'tv_mod_ext_longident = Obj.magic x_inlined1 in
        let _3 : unit = Obj.magic _3 in
        let x : (
# 1220 "reason_parser.mly"
       (string)
# 69958 "reason_parser.ml"
        ) = Obj.magic x in
        let _1 : unit = Obj.magic _1 in
        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
        let _startpos = _startpos__1_ in
        let _endpos = _endpos_x_inlined1_ in
        let _v : 'tv_with_constraint = let _4 =
          let (_endpos_x_, _startpos_x_, x) = (_endpos_x_inlined1_, _startpos_x_inlined1_, x_inlined1) in
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 69971 "reason_parser.ml"
          
        in
        let _2 =
          let _endpos = _endpos_x_ in
          let _symbolstartpos = _startpos_x_ in
          
# 4936 "reason_parser.mly"
  ( mkloc x (mklocation _symbolstartpos _endpos) )
# 69980 "reason_parser.ml"
          
        in
        
# 4198 "reason_parser.mly"
      ( Pwith_modsubst (_2, _4) )
# 69986 "reason_parser.ml"
         in
        {
          MenhirLib.EngineTypes.state = _menhir_s;
          MenhirLib.EngineTypes.semv = Obj.repr _v;
          MenhirLib.EngineTypes.startp = _startpos;
          MenhirLib.EngineTypes.endp = _endpos;
          MenhirLib.EngineTypes.next = _menhir_stack;
        });
    |]
  
  and trace =
    None
  
end

module MenhirInterpreter = struct
  
  module ET = MenhirLib.TableInterpreter.MakeEngineTable (Tables)
  
  module TI = MenhirLib.Engine.Make (ET)
  
  include TI
  
end

let use_file =
  fun lexer lexbuf ->
    (Obj.magic (MenhirInterpreter.entry 4301 lexer lexbuf) : (
# 1381 "reason_parser.mly"
      (Ast_404.Parsetree.toplevel_phrase list)
# 70017 "reason_parser.ml"
    ))

and toplevel_phrase =
  fun lexer lexbuf ->
    (Obj.magic (MenhirInterpreter.entry 3946 lexer lexbuf) : (
# 1379 "reason_parser.mly"
      (Ast_404.Parsetree.toplevel_phrase)
# 70025 "reason_parser.ml"
    ))

and parse_pattern =
  fun lexer lexbuf ->
    (Obj.magic (MenhirInterpreter.entry 3942 lexer lexbuf) : (
# 1387 "reason_parser.mly"
      (Ast_404.Parsetree.pattern)
# 70033 "reason_parser.ml"
    ))

and parse_expression =
  fun lexer lexbuf ->
    (Obj.magic (MenhirInterpreter.entry 3938 lexer lexbuf) : (
# 1385 "reason_parser.mly"
      (Ast_404.Parsetree.expression)
# 70041 "reason_parser.ml"
    ))

and parse_core_type =
  fun lexer lexbuf ->
    (Obj.magic (MenhirInterpreter.entry 3934 lexer lexbuf) : (
# 1383 "reason_parser.mly"
      (Ast_404.Parsetree.core_type)
# 70049 "reason_parser.ml"
    ))

and interface =
  fun lexer lexbuf ->
    (Obj.magic (MenhirInterpreter.entry 3930 lexer lexbuf) : (
# 1377 "reason_parser.mly"
      (Ast_404.Parsetree.signature)
# 70057 "reason_parser.ml"
    ))

and implementation =
  fun lexer lexbuf ->
    (Obj.magic (MenhirInterpreter.entry 0 lexer lexbuf) : (
# 1375 "reason_parser.mly"
      (Ast_404.Parsetree.structure)
# 70065 "reason_parser.ml"
    ))

module Incremental = struct
  
  let use_file =
    fun initial_position ->
      (Obj.magic (MenhirInterpreter.start 4301 initial_position) : (
# 1381 "reason_parser.mly"
      (Ast_404.Parsetree.toplevel_phrase list)
# 70075 "reason_parser.ml"
      ) MenhirInterpreter.checkpoint)
  
  and toplevel_phrase =
    fun initial_position ->
      (Obj.magic (MenhirInterpreter.start 3946 initial_position) : (
# 1379 "reason_parser.mly"
      (Ast_404.Parsetree.toplevel_phrase)
# 70083 "reason_parser.ml"
      ) MenhirInterpreter.checkpoint)
  
  and parse_pattern =
    fun initial_position ->
      (Obj.magic (MenhirInterpreter.start 3942 initial_position) : (
# 1387 "reason_parser.mly"
      (Ast_404.Parsetree.pattern)
# 70091 "reason_parser.ml"
      ) MenhirInterpreter.checkpoint)
  
  and parse_expression =
    fun initial_position ->
      (Obj.magic (MenhirInterpreter.start 3938 initial_position) : (
# 1385 "reason_parser.mly"
      (Ast_404.Parsetree.expression)
# 70099 "reason_parser.ml"
      ) MenhirInterpreter.checkpoint)
  
  and parse_core_type =
    fun initial_position ->
      (Obj.magic (MenhirInterpreter.start 3934 initial_position) : (
# 1383 "reason_parser.mly"
      (Ast_404.Parsetree.core_type)
# 70107 "reason_parser.ml"
      ) MenhirInterpreter.checkpoint)
  
  and interface =
    fun initial_position ->
      (Obj.magic (MenhirInterpreter.start 3930 initial_position) : (
# 1377 "reason_parser.mly"
      (Ast_404.Parsetree.signature)
# 70115 "reason_parser.ml"
      ) MenhirInterpreter.checkpoint)
  
  and implementation =
    fun initial_position ->
      (Obj.magic (MenhirInterpreter.start 0 initial_position) : (
# 1375 "reason_parser.mly"
      (Ast_404.Parsetree.structure)
# 70123 "reason_parser.ml"
      ) MenhirInterpreter.checkpoint)
  
end

# 4980 "reason_parser.mly"
  

# 70131 "reason_parser.ml"

# 269 "/Users/chenglou/.opam/4.06.1/lib/menhir/standard.mly"
  

# 70136 "reason_parser.ml"

end
module Reason_lexer
= struct
#1 "reason_lexer.ml"
# 68 "src/reason-parser/reason_lexer.mll"
 
open Lexing
open Reason_parser
open Lexer_warning

type error =
  | Illegal_character of char
  | Illegal_escape of string
  | Unterminated_comment of Location.t
  | Unterminated_string
  | Unterminated_string_in_comment of Location.t * Location.t
  | Keyword_as_label of string
  | Literal_overflow of string
  | Invalid_literal of string
;;

exception Error of error * Location.t;;

(* The table of keywords *)

let keyword_table, reverse_keyword_table =
  let create_hashtable n l =
    let t = Hashtbl.create n in
    let rev_t = Hashtbl.create n in
    List.iter (fun (k, v) ->
      Hashtbl.add t k v;
      Hashtbl.add rev_t v k;
    ) l;
    t, rev_t
  in
  create_hashtable 149 [
    "and", AND;
    "as", AS;
    "assert", ASSERT;
    "begin", BEGIN;
    "class", CLASS;
    "constraint", CONSTRAINT;
    "do", DO;
    "done", DONE;
    "downto", DOWNTO;
    "else", ELSE;
    "end", END;
    "exception", EXCEPTION;
    "external", EXTERNAL;
    "false", FALSE;
    "for", FOR;
    "fun", FUN;
    "esfun", ES6_FUN;
    "function", FUNCTION;
    "functor", FUNCTOR;
    "if", IF;
    "in", IN;
    "include", INCLUDE;
    "inherit", INHERIT;
    "initializer", INITIALIZER;
    "lazy", LAZY;
    "let", LET;
    "switch", SWITCH;
    "module", MODULE;
    "pub", PUB;
    "mutable", MUTABLE;
    "new", NEW;
    "nonrec", NONREC;
    "object", OBJECT;
    "of", OF;
    "open", OPEN;
    "or", OR;
(*  "parser", PARSER; *)
    "pri", PRI;
    "rec", REC;
    "sig", SIG;
    "struct", STRUCT;
    "then", THEN;
    "to", TO;
    "true", TRUE;
    "try", TRY;
    "type", TYPE;
    "val", VAL;
    "virtual", VIRTUAL;
    "when", WHEN;
    "while", WHILE;
    "with", WITH;

    "mod", INFIXOP3("mod");
    "land", INFIXOP3("land");
    "lor", INFIXOP3("lor");
    "lxor", INFIXOP3("lxor");
    "lsl", INFIXOP4("lsl");
    "lsr", INFIXOP4("lsr");
    "asr", INFIXOP4("asr")
]

(* To buffer string literals *)

let string_buffer = Buffer.create 256
let raw_buffer = Buffer.create 256

let reset_string_buffer () =
  Buffer.reset string_buffer;
  Buffer.reset raw_buffer

let store_string_char c =
  Buffer.add_char string_buffer c

let store_string s =
  Buffer.add_string string_buffer s

let store_lexeme buffer lexbuf =
  Buffer.add_string buffer (Lexing.lexeme lexbuf)

let get_stored_string () =
  let str = Buffer.contents string_buffer in
  let raw =
    if Buffer.length raw_buffer = 0
    then None
    else Some (Buffer.contents raw_buffer)
  in
  Buffer.reset string_buffer;
  Buffer.reset raw_buffer;
  (str, raw)

(* To store the position of the beginning of a string and comment *)
let string_start_loc = ref Location.none;;
let comment_start_loc = ref [];;
let in_comment () = !comment_start_loc <> [];;
let is_in_string = ref false
let in_string () = !is_in_string
let print_warnings = ref true

(* To "unlex" a few characters *)
let set_lexeme_length buf n = (
  let open Lexing in
  if n < 0 then
    invalid_arg "set_lexeme_length: offset should be positive";
  if n > buf.lex_curr_pos - buf.lex_start_pos then
    invalid_arg "set_lexeme_length: offset larger than lexeme";
  buf.lex_curr_pos <- buf.lex_start_pos + n;
  buf.lex_curr_p <- {buf.lex_start_p
                     with pos_cnum = buf.lex_abs_pos + buf.lex_curr_pos};
)

(* This cut comment characters of the current buffer.
 * Operators (including "/*" and "//") are lexed with the same rule, and this
 * function cuts the lexeme at the beginning of an operator. *)
let lexeme_without_comment buf = (
  let lexeme = Lexing.lexeme buf in
  let i = ref 0 and len = String.length lexeme - 1 in
  let found = ref (-1) in
  while !i < len && !found = -1 do
    begin match lexeme.[!i], lexeme.[!i+1] with
      | ('/', '*') | ('/', '/') | ('*', '/') ->
        found := !i;
      | _ -> ()
    end;
    incr i
  done;
  match !found with
  | -1 -> lexeme
  | n ->
      set_lexeme_length buf n;
      String.sub lexeme 0 n
)

(* Operators that could conflict with comments (those containing /*, */ and //)
 * are escaped in the source. The lexer removes the escapes so that the
 * identifier looks like OCaml ones.
 * An escape in first position is kept to distinguish "verbatim" operators
 * (\=== for instance). *)
let unescape_operator str =
  if (str <> "" && String.contains_from str 1 '\\') then (
    let b = Buffer.create (String.length str) in
    Buffer.add_char b str.[0];
    for i = 1 to String.length str - 1 do
      let c = str.[i] in
      if c <> '\\' then Buffer.add_char b c
    done;
    Buffer.contents b
  ) else str

let lexeme_operator lexbuf =
  unescape_operator (lexeme_without_comment lexbuf)

(* To translate escape sequences *)

let char_for_backslash = function
  | 'n' -> '\010'
  | 'r' -> '\013'
  | 'b' -> '\008'
  | 't' -> '\009'
  | c   -> c

let char_for_decimal_code lexbuf i =
  let c = 100 * (Char.code(Lexing.lexeme_char lexbuf i) - 48) +
           10 * (Char.code(Lexing.lexeme_char lexbuf (i+1)) - 48) +
                (Char.code(Lexing.lexeme_char lexbuf (i+2)) - 48) in
  if (c < 0 || c > 255) then
    if in_comment ()
    then 'x'
    else raise (Error(Illegal_escape (Lexing.lexeme lexbuf),
                      Location.curr lexbuf))
  else Char.chr c

let char_for_hexadecimal_code lexbuf i =
  let d1 = Char.code (Lexing.lexeme_char lexbuf i) in
  let val1 = if d1 >= 97 then d1 - 87
             else if d1 >= 65 then d1 - 55
             else d1 - 48
  in
  let d2 = Char.code (Lexing.lexeme_char lexbuf (i+1)) in
  let val2 = if d2 >= 97 then d2 - 87
             else if d2 >= 65 then d2 - 55
             else d2 - 48
  in
  Char.chr (val1 * 16 + val2)

(* To convert integer literals, allowing max_int + 1 (PR#4210) *)

let cvt_int_literal s =
  - int_of_string ("-" ^ s)
let cvt_int32_literal s =
  Int32.neg (Int32.of_string ("-" ^ String.sub s 0 (String.length s - 1)))
let cvt_int64_literal s =
  Int64.neg (Int64.of_string ("-" ^ String.sub s 0 (String.length s - 1)))
let cvt_nativeint_literal s =
  Nativeint.neg (Nativeint.of_string ("-" ^ String.sub s 0
                                                       (String.length s - 1)))

(* Remove underscores from float literals *)

let remove_underscores s =
  let l = String.length s in
  let b = Bytes.create l in
  let rec remove src dst =
    if src >= l then
      if dst >= l then s else Bytes.sub_string b 0 dst
    else
      match s.[src] with
        '_' -> remove (src + 1) dst
      |  c  -> Bytes.set b dst c; remove (src + 1) (dst + 1)
  in remove 0 0

(* Update the current location with file name and line number. *)

let update_loc lexbuf file line absolute chars =
  let pos = lexbuf.lex_curr_p in
  let new_file = match file with
                 | None -> pos.pos_fname
                 | Some s -> s
  in
  lexbuf.lex_curr_p <- { pos with
    pos_fname = new_file;
    pos_lnum = if absolute then line else pos.pos_lnum + line;
    pos_bol = pos.pos_cnum - chars;
  }
;;

let preprocessor = ref None

(* Error report *)

open Format

let report_error ppf = function
  | Illegal_character c ->
      fprintf ppf "Illegal character (%s)" (Char.escaped c)
  | Illegal_escape s ->
      fprintf ppf "Illegal backslash escape in string or character (%s)" s
  | Unterminated_comment _ ->
      fprintf ppf "Comment not terminated"
  | Unterminated_string ->
      fprintf ppf "String literal not terminated"
  | Unterminated_string_in_comment (_, loc) ->
      fprintf ppf "This comment contains an unterminated string literal@.\
                   %aString literal begins here"
              Location.print_error loc
  | Keyword_as_label kwd ->
      fprintf ppf "`%s' is a keyword, it cannot be used as label name" kwd
  | Literal_overflow ty ->
      fprintf ppf "Integer literal exceeds the range of representable \
                   integers of type %s" ty
  | Invalid_literal s ->
      fprintf ppf "Invalid literal %s" s

let () =
  Location.register_error_of_exn
    (function
      | Error (err, loc) ->
          Some (Location.error_of_printer loc report_error err)
      | _ ->
          None
    )


# 296 "src/reason-parser/reason_lexer.ml"
let __ocaml_lex_tables = {
  Lexing.lex_base =
   "\000\000\152\255\153\255\224\000\003\001\038\001\073\001\108\001\
    \143\001\178\001\188\255\213\001\195\255\250\001\091\000\063\002\
    \068\000\071\000\084\000\155\002\220\255\190\002\222\255\223\255\
    \225\255\225\002\064\003\012\001\094\003\239\255\178\003\006\004\
    \090\004\042\005\250\005\202\006\169\007\204\007\239\007\013\008\
    \122\000\254\255\001\000\003\009\038\009\073\009\108\009\143\009\
    \178\009\255\255\005\000\213\009\093\000\248\009\027\010\094\000\
    \062\010\095\000\096\000\097\000\006\000\103\000\129\010\221\010\
    \000\011\067\011\151\011\148\004\235\011\063\012\147\012\231\012\
    \059\013\143\013\227\013\055\014\139\014\223\014\051\015\108\000\
    \135\015\219\015\047\016\131\016\215\016\118\000\100\005\238\255\
    \062\003\073\017\157\017\198\255\011\001\248\017\107\000\108\000\
    \007\000\237\255\236\255\232\255\242\002\128\000\109\000\235\255\
    \011\002\110\000\234\255\069\006\113\000\233\255\060\007\124\006\
    \017\018\144\000\058\018\093\018\228\255\011\000\012\000\008\001\
    \024\001\016\000\228\255\017\000\128\018\163\018\198\018\141\000\
    \213\255\209\255\210\255\211\255\207\255\233\018\012\019\079\019\
    \163\019\247\019\071\008\081\020\144\020\002\021\196\255\015\001\
    \002\021\094\021\151\000\180\255\201\255\202\255\129\000\184\255\
    \178\255\161\021\187\255\253\021\032\022\067\022\097\022\187\022\
    \249\022\190\255\083\023\118\023\153\023\188\023\185\255\255\023\
    \061\024\151\024\186\024\221\024\000\025\035\025\216\000\010\001\
    \070\025\040\001\012\001\105\025\046\001\070\001\248\255\143\000\
    \079\001\081\001\254\000\254\255\255\255\250\255\100\001\251\255\
    \205\000\249\255\040\011\243\255\244\255\018\000\245\255\064\002\
    \103\025\253\255\218\000\231\000\255\255\254\255\252\255\135\025\
    \226\025\236\000\252\000\112\001\251\255\250\255\249\255\030\007\
    \155\002\005\001\248\255\081\003\014\001\247\255\080\010\016\001\
    \246\255\139\001\199\001\247\255\248\255\249\255\146\001\253\025\
    \255\255\250\255\030\019\091\003\253\255\059\001\147\001\148\001\
    \223\004\252\255\112\021\251\255\164\001\234\001\252\255\021\026\
    \254\255\255\255\174\001\181\001\253\255\050\026\035\001\039\001\
    \069\001\079\001\045\001\080\001\068\001\013\000\255\255";
  Lexing.lex_backtrk =
   "\255\255\255\255\255\255\099\000\094\000\093\000\092\000\083\000\
    \078\000\100\000\255\255\063\000\255\255\066\000\051\000\049\000\
    \047\000\043\000\040\000\086\000\255\255\034\000\255\255\255\255\
    \255\255\028\000\039\000\031\000\061\000\255\255\011\000\011\000\
    \010\000\009\000\008\000\007\000\050\000\005\000\004\000\003\000\
    \002\000\255\255\103\000\103\000\100\000\100\000\096\000\255\255\
    \255\255\255\255\255\255\091\000\255\255\081\000\082\000\255\255\
    \098\000\255\255\255\255\255\255\255\255\255\255\092\000\037\000\
    \006\000\092\000\038\000\069\000\015\000\015\000\013\000\012\000\
    \015\000\012\000\012\000\011\000\013\000\012\000\013\000\255\255\
    \014\000\014\000\011\000\011\000\013\000\255\255\062\000\255\255\
    \255\255\058\000\058\000\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\023\000\023\000\023\000\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \026\000\255\255\025\000\024\000\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\029\000\087\000\036\000\041\000\
    \255\255\255\255\255\255\255\255\255\255\092\000\088\000\092\000\
    \055\000\255\255\255\255\089\000\255\255\255\255\255\255\255\255\
    \092\000\090\000\076\000\255\255\255\255\255\255\052\000\255\255\
    \255\255\092\000\255\255\092\000\092\000\056\000\074\000\092\000\
    \073\000\255\255\064\000\097\000\100\000\100\000\255\255\100\000\
    \072\000\079\000\080\000\095\000\085\000\084\000\255\255\255\255\
    \094\000\255\255\255\255\101\000\255\255\255\255\255\255\007\000\
    \007\000\002\000\255\255\255\255\255\255\255\255\003\000\255\255\
    \002\000\255\255\255\255\255\255\255\255\012\000\255\255\012\000\
    \012\000\255\255\012\000\012\000\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\008\000\008\000\
    \255\255\255\255\005\000\005\000\255\255\001\000\005\000\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\003\000\
    \255\255\255\255\003\000\255\255\255\255\255\255\002\000\255\255\
    \255\255\001\000\255\255\255\255\255\255\255\255\255\255";
  Lexing.lex_default =
   "\001\000\000\000\000\000\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\000\000\255\255\000\000\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\000\000\255\255\000\000\000\000\
    \000\000\255\255\255\255\094\000\255\255\000\000\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\000\000\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\000\000\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\000\000\
    \255\255\255\255\255\255\000\000\255\255\099\000\255\255\255\255\
    \255\255\000\000\000\000\000\000\255\255\255\255\255\255\000\000\
    \255\255\255\255\000\000\255\255\255\255\000\000\118\000\255\255\
    \255\255\255\255\255\255\255\255\000\000\255\255\118\000\119\000\
    \118\000\121\000\000\000\255\255\255\255\255\255\255\255\255\255\
    \000\000\000\000\000\000\000\000\000\000\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\000\000\255\255\
    \255\255\255\255\255\255\000\000\000\000\000\000\255\255\000\000\
    \000\000\255\255\000\000\255\255\255\255\255\255\255\255\255\255\
    \255\255\000\000\255\255\255\255\255\255\255\255\000\000\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\182\000\000\000\255\255\
    \255\255\255\255\186\000\000\000\000\000\000\000\255\255\000\000\
    \255\255\000\000\195\000\000\000\000\000\255\255\000\000\209\000\
    \255\255\000\000\255\255\255\255\000\000\000\000\000\000\255\255\
    \255\255\255\255\255\255\255\255\000\000\000\000\000\000\255\255\
    \255\255\255\255\000\000\255\255\255\255\000\000\255\255\255\255\
    \000\000\255\255\227\000\000\000\000\000\000\000\255\255\233\000\
    \000\000\000\000\255\255\255\255\000\000\255\255\255\255\255\255\
    \255\255\000\000\255\255\000\000\255\255\246\000\000\000\255\255\
    \000\000\000\000\255\255\255\255\000\000\255\255\255\255\255\255\
    \000\001\003\001\255\255\003\001\255\255\255\255\000\000";
  Lexing.lex_trans =
   "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\040\000\041\000\041\000\040\000\042\000\060\000\049\000\
    \041\000\095\000\050\000\060\000\096\000\116\000\116\000\006\001\
    \117\000\117\000\122\000\122\000\196\000\123\000\123\000\225\000\
    \040\000\008\000\029\000\026\000\006\000\003\000\025\000\027\000\
    \023\000\022\000\021\000\007\000\020\000\019\000\018\000\009\000\
    \031\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\
    \030\000\030\000\017\000\016\000\015\000\036\000\013\000\037\000\
    \005\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\
    \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\
    \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\
    \033\000\033\000\033\000\014\000\043\000\012\000\004\000\039\000\
    \024\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
    \035\000\035\000\035\000\028\000\011\000\010\000\038\000\132\000\
    \146\000\131\000\127\000\040\000\130\000\129\000\040\000\051\000\
    \046\000\056\000\056\000\044\000\051\000\046\000\044\000\056\000\
    \044\000\006\000\098\000\097\000\103\000\106\000\006\000\149\000\
    \109\000\148\000\040\000\147\000\078\000\078\000\078\000\078\000\
    \078\000\078\000\078\000\078\000\078\000\078\000\084\000\084\000\
    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\
    \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\
    \104\000\104\000\112\000\128\000\152\000\151\000\193\000\112\000\
    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\150\000\
    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\192\000\
    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \002\000\179\000\171\000\179\000\179\000\179\000\179\000\171\000\
    \188\000\205\000\179\000\179\000\255\255\179\000\179\000\179\000\
    \255\255\204\000\116\000\214\000\092\000\117\000\095\000\092\000\
    \143\000\096\000\179\000\143\000\179\000\179\000\179\000\179\000\
    \179\000\120\000\116\000\213\000\176\000\117\000\176\000\176\000\
    \176\000\176\000\121\000\092\000\218\000\176\000\176\000\143\000\
    \176\000\176\000\176\000\255\255\005\000\221\000\176\000\224\000\
    \120\000\005\000\119\000\176\000\180\000\176\000\179\000\176\000\
    \176\000\176\000\176\000\176\000\237\000\091\000\255\000\005\000\
    \000\001\005\000\005\000\005\000\005\000\142\000\004\001\001\001\
    \005\000\005\000\176\000\005\000\005\000\005\000\176\000\176\000\
    \179\000\002\001\002\001\237\000\179\000\179\000\179\000\177\000\
    \005\000\176\000\005\000\005\000\005\000\005\000\005\000\005\001\
    \093\000\000\000\006\000\000\000\006\000\006\000\006\000\006\000\
    \183\000\000\000\000\000\006\000\006\000\184\000\006\000\006\000\
    \006\000\185\000\210\000\190\000\000\000\211\000\186\000\176\000\
    \189\000\176\000\175\000\006\000\005\000\006\000\006\000\006\000\
    \006\000\006\000\000\000\000\000\000\000\046\000\192\000\046\000\
    \046\000\046\000\046\000\191\000\000\000\196\000\046\000\171\000\
    \225\000\046\000\173\000\046\000\229\000\237\000\237\000\244\000\
    \239\000\239\000\005\000\000\000\005\000\061\000\046\000\006\000\
    \046\000\172\000\046\000\046\000\046\000\000\000\229\000\000\000\
    \051\000\244\000\051\000\051\000\051\000\051\000\000\000\000\000\
    \249\000\051\000\051\000\251\000\051\000\051\000\051\000\249\000\
    \000\000\000\000\251\000\000\000\000\000\006\000\000\000\006\000\
    \055\000\051\000\046\000\051\000\169\000\051\000\051\000\051\000\
    \000\000\229\000\000\000\044\000\230\000\044\000\044\000\044\000\
    \044\000\000\000\000\000\000\000\044\000\044\000\000\000\044\000\
    \044\000\044\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \046\000\232\000\046\000\052\000\044\000\051\000\044\000\044\000\
    \163\000\044\000\044\000\000\000\249\000\000\000\006\000\250\000\
    \006\000\006\000\006\000\006\000\000\000\000\000\187\000\006\000\
    \006\000\000\000\006\000\006\000\006\000\000\000\000\000\000\000\
    \255\255\000\000\000\000\051\000\255\255\051\000\059\000\006\000\
    \044\000\006\000\006\000\006\000\006\000\006\000\000\000\000\000\
    \255\255\000\000\000\000\006\000\000\000\006\000\006\000\006\000\
    \006\000\000\000\000\000\231\000\006\000\006\000\000\000\006\000\
    \155\000\006\000\000\000\000\000\000\000\000\000\044\000\000\000\
    \044\000\061\000\161\000\006\000\006\000\000\000\153\000\006\000\
    \006\000\006\000\006\000\105\000\105\000\105\000\105\000\105\000\
    \105\000\105\000\105\000\105\000\105\000\255\255\255\255\000\000\
    \000\000\000\000\210\000\000\000\000\000\211\000\000\000\255\255\
    \255\255\162\000\000\000\006\000\000\000\000\000\061\000\000\000\
    \006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \006\000\000\000\006\000\006\000\006\000\006\000\247\000\212\000\
    \000\000\006\000\006\000\000\000\006\000\133\000\135\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\006\000\154\000\
    \006\000\006\000\000\000\006\000\006\000\134\000\006\000\006\000\
    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\
    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\
    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\
    \137\000\137\000\000\000\061\000\208\000\006\000\136\000\000\000\
    \136\000\136\000\136\000\136\000\136\000\136\000\136\000\136\000\
    \136\000\136\000\136\000\136\000\136\000\136\000\136\000\136\000\
    \136\000\136\000\136\000\136\000\136\000\136\000\136\000\136\000\
    \136\000\136\000\000\000\006\000\046\000\006\000\046\000\046\000\
    \046\000\046\000\000\000\000\000\000\000\046\000\046\000\228\000\
    \046\000\125\000\046\000\219\000\219\000\219\000\219\000\219\000\
    \219\000\219\000\219\000\219\000\219\000\046\000\000\000\046\000\
    \046\000\126\000\046\000\046\000\000\000\000\000\000\000\044\000\
    \000\000\044\000\044\000\044\000\044\000\000\000\000\000\000\000\
    \056\000\044\000\248\000\044\000\044\000\044\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\055\000\
    \044\000\046\000\044\000\044\000\044\000\044\000\044\000\000\000\
    \000\000\000\000\006\000\000\000\006\000\006\000\006\000\124\000\
    \000\000\000\000\000\000\006\000\006\000\000\000\006\000\006\000\
    \006\000\000\000\000\000\000\000\000\000\000\000\000\000\046\000\
    \000\000\046\000\057\000\006\000\044\000\006\000\006\000\006\000\
    \006\000\006\000\107\000\107\000\107\000\107\000\107\000\107\000\
    \107\000\107\000\107\000\107\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\107\000\107\000\107\000\107\000\107\000\
    \107\000\000\000\044\000\000\000\044\000\061\000\000\000\006\000\
    \255\255\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\111\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\107\000\107\000\107\000\107\000\107\000\
    \107\000\000\000\000\000\000\000\000\000\006\000\000\000\006\000\
    \111\000\112\000\000\000\112\000\112\000\112\000\112\000\000\000\
    \000\000\000\000\112\000\112\000\000\000\112\000\112\000\112\000\
    \110\000\110\000\110\000\110\000\110\000\110\000\110\000\110\000\
    \110\000\110\000\112\000\000\000\112\000\114\000\112\000\112\000\
    \112\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\
    \220\000\220\000\220\000\240\000\240\000\240\000\240\000\240\000\
    \240\000\240\000\240\000\240\000\240\000\000\000\000\000\000\000\
    \000\000\000\000\086\000\000\000\113\000\088\000\112\000\088\000\
    \088\000\088\000\088\000\088\000\088\000\088\000\088\000\088\000\
    \088\000\088\000\088\000\088\000\088\000\088\000\088\000\088\000\
    \088\000\088\000\088\000\088\000\088\000\088\000\088\000\088\000\
    \088\000\000\000\087\000\000\000\112\000\088\000\112\000\088\000\
    \088\000\088\000\088\000\088\000\088\000\088\000\088\000\088\000\
    \088\000\088\000\088\000\088\000\088\000\088\000\088\000\088\000\
    \088\000\088\000\088\000\088\000\088\000\088\000\088\000\088\000\
    \088\000\068\000\087\000\000\000\000\000\000\000\000\000\000\000\
    \070\000\000\000\030\000\030\000\030\000\030\000\030\000\030\000\
    \030\000\030\000\030\000\030\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\068\000\068\000\068\000\068\000\069\000\
    \068\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
    \071\000\071\000\071\000\071\000\071\000\000\000\000\000\000\000\
    \000\000\030\000\000\000\068\000\068\000\068\000\068\000\069\000\
    \068\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
    \071\000\071\000\071\000\071\000\071\000\068\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\070\000\000\000\030\000\030\000\
    \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\068\000\
    \072\000\068\000\068\000\069\000\068\000\071\000\071\000\071\000\
    \071\000\071\000\071\000\071\000\071\000\073\000\071\000\071\000\
    \071\000\071\000\071\000\071\000\071\000\071\000\074\000\071\000\
    \071\000\000\000\000\000\000\000\000\000\030\000\000\000\068\000\
    \072\000\068\000\068\000\069\000\068\000\071\000\071\000\071\000\
    \071\000\071\000\071\000\071\000\071\000\073\000\071\000\071\000\
    \071\000\071\000\071\000\071\000\071\000\071\000\074\000\071\000\
    \071\000\032\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\032\000\032\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\032\000\032\000\032\000\000\000\000\000\000\000\
    \000\000\032\000\000\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\032\000\032\000\032\000\067\000\067\000\067\000\
    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\000\000\
    \000\000\000\000\000\000\067\000\000\000\067\000\067\000\067\000\
    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\241\000\
    \241\000\241\000\241\000\241\000\241\000\241\000\241\000\241\000\
    \241\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\033\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\033\000\033\000\033\000\033\000\033\000\033\000\
    \033\000\033\000\033\000\033\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\033\000\033\000\033\000\033\000\033\000\
    \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\
    \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\
    \033\000\033\000\033\000\033\000\033\000\000\000\000\000\000\000\
    \000\000\033\000\000\000\033\000\033\000\033\000\033\000\033\000\
    \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\
    \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\
    \033\000\033\000\033\000\033\000\033\000\089\000\089\000\089\000\
    \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\
    \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\
    \089\000\089\000\089\000\089\000\089\000\089\000\089\000\000\000\
    \000\000\000\000\000\000\089\000\000\000\089\000\089\000\089\000\
    \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\
    \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\
    \089\000\089\000\089\000\089\000\089\000\089\000\089\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\000\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\034\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\000\000\000\000\000\000\
    \000\000\034\000\000\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\108\000\108\000\108\000\
    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\111\000\108\000\108\000\
    \108\000\108\000\108\000\108\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\111\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\108\000\108\000\
    \108\000\108\000\108\000\108\000\110\000\110\000\110\000\110\000\
    \110\000\110\000\110\000\110\000\110\000\110\000\000\000\000\000\
    \000\000\000\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\000\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\035\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\035\000\035\000\035\000\035\000\035\000\035\000\
    \035\000\035\000\035\000\035\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\035\000\035\000\035\000\035\000\035\000\
    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
    \035\000\035\000\035\000\035\000\035\000\000\000\000\000\000\000\
    \000\000\035\000\000\000\035\000\035\000\035\000\035\000\035\000\
    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
    \035\000\035\000\035\000\035\000\035\000\120\000\116\000\000\000\
    \000\000\117\000\000\000\000\000\000\000\000\000\222\000\222\000\
    \222\000\222\000\222\000\222\000\222\000\222\000\222\000\222\000\
    \000\000\000\000\000\000\000\000\120\000\000\000\119\000\222\000\
    \222\000\222\000\222\000\222\000\222\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\110\000\110\000\110\000\110\000\
    \110\000\110\000\110\000\110\000\110\000\110\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\222\000\
    \222\000\222\000\222\000\222\000\222\000\000\000\000\000\000\000\
    \000\000\000\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\000\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\000\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\006\000\000\000\006\000\006\000\006\000\006\000\
    \000\000\000\000\000\000\006\000\006\000\000\000\006\000\006\000\
    \006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\006\000\000\000\062\000\006\000\063\000\
    \064\000\006\000\000\000\000\000\000\000\051\000\000\000\051\000\
    \051\000\051\000\051\000\000\000\000\000\000\000\051\000\051\000\
    \000\000\051\000\051\000\051\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\061\000\051\000\006\000\
    \051\000\051\000\051\000\051\000\051\000\000\000\000\000\000\000\
    \051\000\000\000\051\000\051\000\051\000\051\000\000\000\000\000\
    \000\000\051\000\051\000\000\000\051\000\051\000\051\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\006\000\000\000\006\000\
    \052\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\
    \000\000\000\000\000\000\000\000\035\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\255\255\035\000\035\000\035\000\
    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\000\000\
    \051\000\000\000\051\000\052\000\000\000\051\000\035\000\035\000\
    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
    \000\000\000\000\000\000\051\000\035\000\051\000\035\000\035\000\
    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\
    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\
    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\
    \137\000\137\000\000\000\000\000\000\000\000\000\136\000\000\000\
    \136\000\136\000\136\000\136\000\136\000\136\000\136\000\136\000\
    \136\000\136\000\136\000\136\000\136\000\136\000\136\000\136\000\
    \136\000\136\000\136\000\136\000\136\000\136\000\136\000\136\000\
    \136\000\136\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\000\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\000\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\049\000\000\000\000\000\
    \050\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\048\000\000\000\000\000\006\000\
    \000\000\006\000\000\000\000\000\000\000\045\000\046\000\000\000\
    \046\000\000\000\044\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\
    \006\000\006\000\047\000\005\000\000\000\000\000\000\000\044\000\
    \000\000\044\000\044\000\044\000\044\000\000\000\000\000\000\000\
    \044\000\044\000\000\000\044\000\044\000\044\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \044\000\004\000\044\000\044\000\044\000\044\000\044\000\000\000\
    \000\000\000\000\044\000\000\000\044\000\044\000\044\000\044\000\
    \000\000\000\000\000\000\056\000\044\000\000\000\044\000\044\000\
    \044\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\
    \000\000\047\000\059\000\044\000\044\000\044\000\044\000\044\000\
    \044\000\044\000\000\000\000\000\000\000\046\000\000\000\046\000\
    \046\000\046\000\046\000\000\000\000\000\000\000\046\000\046\000\
    \000\000\046\000\046\000\046\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\044\000\000\000\044\000\057\000\046\000\044\000\
    \046\000\046\000\046\000\046\000\046\000\000\000\000\000\000\000\
    \051\000\000\000\051\000\051\000\051\000\051\000\000\000\000\000\
    \000\000\051\000\051\000\000\000\051\000\051\000\051\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\044\000\000\000\044\000\
    \055\000\051\000\046\000\051\000\051\000\051\000\051\000\051\000\
    \000\000\000\000\000\000\051\000\000\000\051\000\051\000\051\000\
    \051\000\000\000\000\000\000\000\051\000\051\000\000\000\051\000\
    \051\000\051\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \046\000\000\000\046\000\052\000\051\000\051\000\051\000\053\000\
    \051\000\051\000\051\000\000\000\000\000\000\000\051\000\000\000\
    \051\000\051\000\051\000\051\000\000\000\000\000\000\000\051\000\
    \051\000\000\000\051\000\051\000\051\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\051\000\000\000\051\000\052\000\051\000\
    \051\000\051\000\051\000\051\000\051\000\051\000\000\000\000\000\
    \000\000\051\000\000\000\051\000\051\000\051\000\051\000\000\000\
    \000\000\000\000\051\000\051\000\000\000\051\000\051\000\051\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\051\000\000\000\
    \051\000\052\000\051\000\051\000\051\000\054\000\051\000\051\000\
    \051\000\000\000\000\000\000\000\051\000\000\000\051\000\051\000\
    \051\000\051\000\000\000\000\000\000\000\051\000\051\000\000\000\
    \051\000\051\000\051\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\051\000\000\000\051\000\052\000\051\000\051\000\051\000\
    \051\000\051\000\051\000\051\000\000\000\000\000\000\000\056\000\
    \000\000\056\000\056\000\056\000\056\000\000\000\000\000\000\000\
    \056\000\056\000\000\000\056\000\056\000\056\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\051\000\000\000\051\000\052\000\
    \056\000\051\000\056\000\056\000\056\000\056\000\056\000\000\000\
    \223\000\223\000\223\000\223\000\223\000\223\000\223\000\223\000\
    \223\000\223\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\223\000\223\000\223\000\223\000\223\000\223\000\051\000\
    \000\000\051\000\058\000\000\000\056\000\000\000\000\000\000\000\
    \000\000\000\000\006\000\000\000\006\000\006\000\006\000\006\000\
    \000\000\000\000\000\000\006\000\006\000\000\000\006\000\006\000\
    \006\000\223\000\223\000\223\000\223\000\223\000\223\000\000\000\
    \000\000\000\000\056\000\006\000\056\000\006\000\006\000\006\000\
    \006\000\006\000\067\000\067\000\067\000\067\000\067\000\067\000\
    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
    \067\000\067\000\067\000\067\000\000\000\061\000\000\000\006\000\
    \067\000\000\000\067\000\067\000\067\000\067\000\067\000\067\000\
    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
    \067\000\067\000\067\000\067\000\000\000\006\000\006\000\006\000\
    \006\000\006\000\006\000\006\000\000\000\000\000\000\000\006\000\
    \006\000\000\000\006\000\006\000\006\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\
    \000\000\065\000\006\000\006\000\006\000\006\000\000\000\000\000\
    \000\000\006\000\000\000\006\000\006\000\006\000\006\000\000\000\
    \000\000\000\000\006\000\006\000\000\000\006\000\006\000\006\000\
    \000\000\000\000\196\000\000\000\000\000\197\000\000\000\000\000\
    \000\000\061\000\006\000\006\000\006\000\006\000\006\000\006\000\
    \006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\201\000\000\000\000\000\000\000\000\000\199\000\
    \000\000\000\000\202\000\000\000\000\000\000\000\000\000\203\000\
    \000\000\006\000\000\000\006\000\061\000\000\000\006\000\000\000\
    \000\000\000\000\000\000\000\000\006\000\000\000\006\000\006\000\
    \006\000\006\000\000\000\000\000\000\000\006\000\006\000\000\000\
    \006\000\006\000\006\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\006\000\006\000\006\000\006\000\
    \006\000\006\000\006\000\006\000\066\000\066\000\066\000\066\000\
    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
    \066\000\066\000\066\000\066\000\066\000\066\000\000\000\061\000\
    \000\000\006\000\066\000\200\000\066\000\066\000\066\000\066\000\
    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\006\000\
    \000\000\006\000\000\000\000\000\000\000\066\000\000\000\066\000\
    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
    \066\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
    \066\000\066\000\000\000\000\000\000\000\000\000\066\000\000\000\
    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
    \066\000\066\000\068\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\000\000\000\000\000\000\
    \198\000\000\000\000\000\000\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\000\000\000\000\
    \000\000\000\000\068\000\000\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\000\000\
    \000\000\000\000\085\000\000\000\085\000\000\000\000\000\084\000\
    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\
    \084\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\000\000\000\000\000\000\000\000\068\000\000\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\070\000\070\000\070\000\070\000\070\000\
    \070\000\070\000\070\000\070\000\070\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\068\000\068\000\068\000\068\000\
    \069\000\068\000\080\000\080\000\080\000\080\000\080\000\080\000\
    \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\
    \080\000\080\000\080\000\080\000\080\000\080\000\000\000\000\000\
    \000\000\000\000\070\000\000\000\068\000\068\000\068\000\068\000\
    \069\000\068\000\080\000\080\000\080\000\080\000\080\000\080\000\
    \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\
    \080\000\080\000\080\000\080\000\080\000\080\000\068\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\000\000\000\000\000\000\000\000\068\000\000\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\083\000\083\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\000\000\000\000\
    \000\000\000\000\068\000\000\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\082\000\
    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\068\000\
    \068\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\000\000\000\000\000\000\000\000\068\000\000\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\075\000\075\000\075\000\075\000\075\000\
    \075\000\075\000\075\000\075\000\075\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\075\000\075\000\075\000\075\000\
    \075\000\075\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\000\000\000\000\
    \000\000\000\000\068\000\000\000\075\000\075\000\075\000\075\000\
    \075\000\075\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\076\000\000\000\075\000\
    \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\
    \075\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \075\000\075\000\075\000\075\000\075\000\075\000\071\000\071\000\
    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\077\000\
    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
    \071\000\071\000\000\000\000\000\000\000\000\000\075\000\000\000\
    \075\000\075\000\075\000\075\000\075\000\075\000\071\000\071\000\
    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\077\000\
    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
    \071\000\071\000\068\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\076\000\076\000\076\000\076\000\076\000\
    \076\000\076\000\076\000\076\000\076\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\076\000\076\000\076\000\076\000\
    \076\000\076\000\080\000\080\000\080\000\080\000\080\000\080\000\
    \080\000\080\000\080\000\081\000\080\000\080\000\080\000\080\000\
    \080\000\080\000\080\000\080\000\080\000\080\000\000\000\000\000\
    \000\000\000\000\076\000\000\000\076\000\076\000\076\000\076\000\
    \076\000\076\000\080\000\080\000\080\000\080\000\080\000\080\000\
    \080\000\080\000\080\000\081\000\080\000\080\000\080\000\080\000\
    \080\000\080\000\080\000\080\000\080\000\080\000\068\000\000\000\
    \000\000\000\000\079\000\000\000\079\000\000\000\000\000\078\000\
    \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\
    \078\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\000\000\000\000\000\000\000\000\068\000\000\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\078\000\078\000\078\000\078\000\078\000\
    \078\000\078\000\078\000\078\000\078\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\080\000\080\000\080\000\080\000\080\000\080\000\
    \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\
    \080\000\080\000\080\000\080\000\080\000\080\000\000\000\000\000\
    \000\000\000\000\078\000\000\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\080\000\080\000\080\000\080\000\080\000\080\000\
    \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\
    \080\000\080\000\080\000\080\000\080\000\080\000\068\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\000\000\000\000\000\000\000\000\068\000\000\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\000\000\000\000\000\000\079\000\000\000\
    \079\000\000\000\000\000\078\000\078\000\078\000\078\000\078\000\
    \078\000\078\000\078\000\078\000\078\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\000\000\000\000\
    \000\000\000\000\068\000\000\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\082\000\
    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\068\000\
    \068\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\071\000\071\000\
    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
    \071\000\071\000\000\000\000\000\000\000\000\000\082\000\000\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\071\000\071\000\
    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
    \071\000\071\000\068\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\083\000\083\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\071\000\071\000\071\000\071\000\071\000\071\000\
    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
    \071\000\071\000\071\000\071\000\071\000\071\000\000\000\000\000\
    \000\000\000\000\083\000\000\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\071\000\071\000\071\000\071\000\071\000\071\000\
    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
    \071\000\071\000\071\000\071\000\071\000\071\000\068\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\084\000\
    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\
    \084\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\080\000\080\000\
    \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\
    \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\
    \080\000\080\000\000\000\000\000\000\000\000\000\084\000\000\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\080\000\080\000\
    \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\
    \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\
    \080\000\080\000\092\000\000\000\000\000\092\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\092\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \089\000\000\000\000\000\000\000\000\000\000\000\000\000\090\000\
    \000\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\
    \089\000\089\000\089\000\091\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\089\000\089\000\089\000\089\000\089\000\089\000\
    \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\
    \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\
    \089\000\089\000\089\000\089\000\000\000\000\000\000\000\000\000\
    \089\000\000\000\089\000\089\000\089\000\089\000\089\000\089\000\
    \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\
    \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\
    \089\000\089\000\089\000\089\000\090\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\090\000\000\000\090\000\090\000\090\000\
    \090\000\090\000\090\000\090\000\090\000\090\000\090\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\090\000\090\000\
    \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\
    \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\
    \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\
    \000\000\000\000\000\000\000\000\090\000\000\000\090\000\090\000\
    \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\
    \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\
    \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\
    \102\000\000\000\102\000\000\000\000\000\000\000\000\000\102\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \101\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\
    \101\000\101\000\112\000\000\000\112\000\112\000\112\000\112\000\
    \000\000\000\000\000\000\112\000\112\000\000\000\112\000\112\000\
    \112\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\112\000\000\000\112\000\112\000\112\000\
    \112\000\112\000\000\000\000\000\102\000\000\000\000\000\000\000\
    \000\000\000\000\102\000\112\000\000\000\112\000\112\000\112\000\
    \112\000\000\000\000\000\000\000\112\000\112\000\102\000\112\000\
    \112\000\112\000\102\000\000\000\102\000\113\000\000\000\112\000\
    \100\000\000\000\000\000\000\000\112\000\000\000\115\000\112\000\
    \112\000\112\000\112\000\000\000\000\000\000\000\112\000\000\000\
    \112\000\112\000\112\000\112\000\000\000\000\000\000\000\112\000\
    \112\000\000\000\112\000\112\000\112\000\112\000\000\000\112\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\113\000\112\000\
    \112\000\112\000\112\000\112\000\112\000\112\000\000\000\000\000\
    \000\000\006\000\000\000\006\000\006\000\006\000\006\000\000\000\
    \000\000\000\000\006\000\006\000\000\000\006\000\006\000\006\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\112\000\000\000\
    \112\000\113\000\006\000\112\000\006\000\006\000\006\000\006\000\
    \006\000\000\000\000\000\000\000\046\000\000\000\046\000\046\000\
    \046\000\046\000\000\000\000\000\000\000\046\000\046\000\000\000\
    \046\000\046\000\046\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\112\000\000\000\112\000\061\000\046\000\006\000\046\000\
    \046\000\046\000\046\000\046\000\000\000\000\000\000\000\046\000\
    \000\000\046\000\046\000\046\000\046\000\000\000\000\000\000\000\
    \046\000\046\000\000\000\046\000\046\000\046\000\000\000\000\000\
    \255\255\000\000\000\000\000\000\006\000\000\000\006\000\055\000\
    \046\000\046\000\046\000\046\000\046\000\046\000\046\000\000\000\
    \000\000\000\000\006\000\000\000\006\000\006\000\006\000\006\000\
    \000\000\000\000\000\000\006\000\006\000\000\000\006\000\144\000\
    \006\000\000\000\000\000\000\000\000\000\000\000\000\000\046\000\
    \000\000\046\000\055\000\006\000\046\000\006\000\006\000\006\000\
    \006\000\006\000\000\000\000\000\000\000\006\000\000\000\006\000\
    \006\000\006\000\006\000\000\000\000\000\000\000\006\000\006\000\
    \000\000\006\000\006\000\006\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\046\000\000\000\046\000\061\000\006\000\006\000\
    \006\000\006\000\006\000\006\000\006\000\000\000\242\000\242\000\
    \242\000\242\000\242\000\242\000\242\000\242\000\242\000\242\000\
    \141\000\000\000\000\000\141\000\000\000\000\000\000\000\242\000\
    \242\000\242\000\242\000\242\000\242\000\006\000\000\000\006\000\
    \061\000\000\000\006\000\000\000\000\000\000\000\000\000\141\000\
    \006\000\000\000\006\000\006\000\006\000\006\000\000\000\000\000\
    \000\000\006\000\006\000\000\000\006\000\006\000\006\000\242\000\
    \242\000\242\000\242\000\242\000\242\000\000\000\000\000\000\000\
    \006\000\006\000\006\000\006\000\006\000\139\000\006\000\006\000\
    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
    \140\000\140\000\000\000\061\000\000\000\006\000\140\000\000\000\
    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
    \140\000\140\000\136\000\006\000\000\000\006\000\000\000\000\000\
    \000\000\000\000\000\000\136\000\136\000\136\000\136\000\136\000\
    \136\000\136\000\136\000\136\000\136\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\136\000\136\000\136\000\136\000\
    \136\000\136\000\136\000\136\000\136\000\136\000\136\000\136\000\
    \136\000\136\000\136\000\136\000\136\000\136\000\136\000\136\000\
    \136\000\136\000\136\000\136\000\136\000\136\000\000\000\000\000\
    \000\000\000\000\136\000\000\000\136\000\136\000\136\000\136\000\
    \136\000\136\000\136\000\136\000\136\000\136\000\136\000\136\000\
    \136\000\136\000\136\000\136\000\136\000\136\000\136\000\136\000\
    \136\000\136\000\136\000\136\000\136\000\136\000\137\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\138\000\000\000\137\000\
    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\
    \137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\
    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\
    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\
    \137\000\137\000\000\000\000\000\000\000\000\000\137\000\000\000\
    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\
    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\
    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\
    \137\000\137\000\006\000\000\000\006\000\006\000\006\000\006\000\
    \000\000\000\000\000\000\006\000\006\000\000\000\006\000\006\000\
    \006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\006\000\000\000\006\000\006\000\006\000\
    \006\000\006\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\143\000\000\000\000\000\143\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\061\000\000\000\006\000\
    \143\000\000\000\000\000\000\000\000\000\000\000\000\000\140\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\140\000\000\000\
    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
    \140\000\140\000\000\000\000\000\000\000\006\000\142\000\006\000\
    \000\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
    \140\000\140\000\140\000\000\000\000\000\000\000\000\000\140\000\
    \000\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
    \140\000\140\000\140\000\141\000\000\000\000\000\141\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\141\000\006\000\000\000\006\000\006\000\006\000\
    \006\000\000\000\000\000\000\000\006\000\006\000\000\000\006\000\
    \006\000\006\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\006\000\000\000\006\000\006\000\
    \145\000\006\000\006\000\140\000\140\000\140\000\140\000\140\000\
    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
    \140\000\140\000\140\000\140\000\140\000\000\000\061\000\000\000\
    \006\000\140\000\000\000\140\000\140\000\140\000\140\000\140\000\
    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
    \140\000\140\000\140\000\140\000\140\000\000\000\006\000\006\000\
    \006\000\006\000\006\000\006\000\006\000\000\000\000\000\000\000\
    \006\000\006\000\000\000\006\000\006\000\006\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \006\000\000\000\006\000\006\000\006\000\006\000\006\000\000\000\
    \243\000\243\000\243\000\243\000\243\000\243\000\243\000\243\000\
    \243\000\243\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\243\000\243\000\243\000\243\000\243\000\243\000\000\000\
    \000\000\000\000\061\000\000\000\006\000\000\000\000\000\000\000\
    \000\000\000\000\006\000\000\000\006\000\006\000\006\000\006\000\
    \000\000\000\000\000\000\006\000\006\000\000\000\006\000\006\000\
    \159\000\243\000\243\000\243\000\243\000\243\000\243\000\000\000\
    \000\000\000\000\006\000\006\000\006\000\006\000\006\000\006\000\
    \006\000\006\000\158\000\158\000\158\000\158\000\158\000\158\000\
    \158\000\158\000\158\000\158\000\158\000\158\000\158\000\158\000\
    \158\000\158\000\158\000\158\000\158\000\158\000\158\000\158\000\
    \158\000\158\000\158\000\158\000\000\000\061\000\000\000\006\000\
    \158\000\000\000\158\000\158\000\158\000\158\000\158\000\158\000\
    \158\000\158\000\158\000\158\000\158\000\158\000\158\000\158\000\
    \158\000\158\000\158\000\158\000\158\000\158\000\158\000\158\000\
    \158\000\158\000\158\000\158\000\000\000\006\000\006\000\006\000\
    \006\000\006\000\006\000\006\000\000\000\000\000\000\000\006\000\
    \006\000\000\000\006\000\156\000\006\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\
    \000\000\006\000\006\000\006\000\006\000\006\000\000\000\000\000\
    \000\000\006\000\000\000\006\000\006\000\006\000\006\000\000\000\
    \000\000\000\000\006\000\006\000\000\000\006\000\157\000\006\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\061\000\006\000\006\000\006\000\006\000\006\000\006\000\
    \006\000\000\000\000\000\000\000\006\000\000\000\006\000\006\000\
    \006\000\006\000\000\000\000\000\000\000\006\000\006\000\000\000\
    \006\000\006\000\006\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\006\000\000\000\006\000\061\000\006\000\006\000\006\000\
    \006\000\006\000\006\000\006\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\006\000\000\000\006\000\061\000\
    \000\000\006\000\158\000\158\000\158\000\158\000\158\000\158\000\
    \158\000\158\000\158\000\158\000\158\000\158\000\158\000\158\000\
    \158\000\158\000\158\000\158\000\158\000\158\000\158\000\158\000\
    \158\000\158\000\158\000\158\000\000\000\000\000\000\000\006\000\
    \158\000\006\000\158\000\158\000\158\000\158\000\158\000\158\000\
    \158\000\158\000\158\000\158\000\158\000\158\000\158\000\158\000\
    \158\000\158\000\158\000\158\000\158\000\158\000\158\000\158\000\
    \158\000\158\000\158\000\158\000\006\000\000\000\006\000\006\000\
    \006\000\006\000\000\000\000\000\000\000\006\000\006\000\000\000\
    \006\000\006\000\006\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\006\000\000\000\006\000\
    \006\000\006\000\006\000\006\000\160\000\160\000\160\000\160\000\
    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
    \160\000\160\000\160\000\160\000\160\000\160\000\000\000\061\000\
    \000\000\006\000\160\000\000\000\160\000\160\000\160\000\160\000\
    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
    \160\000\160\000\160\000\160\000\160\000\160\000\000\000\006\000\
    \000\000\006\000\160\000\160\000\160\000\160\000\160\000\160\000\
    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
    \160\000\160\000\160\000\160\000\000\000\000\000\000\000\000\000\
    \160\000\000\000\160\000\160\000\160\000\160\000\160\000\160\000\
    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
    \160\000\160\000\160\000\160\000\006\000\000\000\006\000\006\000\
    \006\000\006\000\000\000\000\000\000\000\006\000\006\000\000\000\
    \006\000\006\000\006\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\006\000\000\000\006\000\
    \006\000\006\000\006\000\006\000\000\000\000\000\000\000\044\000\
    \000\000\044\000\044\000\044\000\044\000\000\000\000\000\000\000\
    \044\000\044\000\000\000\044\000\044\000\044\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\061\000\
    \044\000\006\000\164\000\044\000\044\000\044\000\044\000\000\000\
    \000\000\000\000\044\000\000\000\044\000\044\000\044\000\044\000\
    \000\000\000\000\000\000\044\000\044\000\000\000\044\000\044\000\
    \167\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\
    \000\000\006\000\059\000\044\000\044\000\044\000\044\000\044\000\
    \044\000\044\000\000\000\000\000\000\000\044\000\000\000\044\000\
    \044\000\044\000\044\000\000\000\000\000\000\000\044\000\044\000\
    \000\000\044\000\044\000\044\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\165\000\000\000\044\000\059\000\044\000\044\000\
    \044\000\044\000\044\000\044\000\044\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\044\000\000\000\044\000\
    \059\000\166\000\044\000\000\000\000\000\000\000\000\000\000\000\
    \044\000\000\000\044\000\044\000\044\000\044\000\000\000\000\000\
    \000\000\044\000\044\000\000\000\044\000\044\000\044\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\
    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
    \168\000\168\000\000\000\059\000\000\000\044\000\168\000\000\000\
    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
    \168\000\168\000\000\000\044\000\000\000\044\000\168\000\168\000\
    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
    \000\000\000\000\000\000\000\000\168\000\000\000\168\000\168\000\
    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
    \051\000\000\000\051\000\051\000\051\000\051\000\000\000\000\000\
    \000\000\051\000\051\000\000\000\051\000\051\000\051\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\051\000\000\000\051\000\170\000\051\000\051\000\051\000\
    \000\000\000\000\000\000\051\000\000\000\051\000\051\000\051\000\
    \051\000\000\000\000\000\000\000\051\000\051\000\000\000\051\000\
    \051\000\051\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\052\000\051\000\051\000\051\000\051\000\
    \051\000\051\000\051\000\000\000\000\000\000\000\171\000\000\000\
    \171\000\171\000\171\000\171\000\000\000\000\000\000\000\171\000\
    \171\000\000\000\171\000\171\000\171\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\051\000\000\000\051\000\052\000\171\000\
    \051\000\171\000\171\000\171\000\171\000\171\000\000\000\000\000\
    \000\000\046\000\000\000\046\000\046\000\046\000\046\000\000\000\
    \000\000\000\000\046\000\046\000\000\000\046\000\046\000\046\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\051\000\000\000\
    \051\000\174\000\046\000\171\000\046\000\046\000\046\000\046\000\
    \046\000\000\000\000\000\000\000\046\000\000\000\046\000\046\000\
    \046\000\046\000\000\000\000\000\000\000\046\000\046\000\000\000\
    \046\000\046\000\046\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\171\000\000\000\171\000\055\000\046\000\046\000\046\000\
    \046\000\046\000\046\000\046\000\000\000\000\000\000\000\176\000\
    \000\000\176\000\176\000\176\000\176\000\000\000\000\000\000\000\
    \176\000\176\000\000\000\176\000\176\000\176\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\046\000\000\000\046\000\055\000\
    \176\000\046\000\176\000\176\000\176\000\176\000\176\000\000\000\
    \000\000\000\000\179\000\000\000\179\000\179\000\179\000\179\000\
    \000\000\000\000\000\000\179\000\179\000\000\000\179\000\179\000\
    \179\000\000\000\000\000\000\000\000\000\000\000\000\000\046\000\
    \000\000\046\000\178\000\179\000\176\000\179\000\179\000\179\000\
    \179\000\179\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\176\000\000\000\176\000\180\000\207\000\179\000\
    \207\000\207\000\207\000\207\000\207\000\207\000\207\000\207\000\
    \207\000\207\000\207\000\207\000\207\000\207\000\207\000\207\000\
    \207\000\207\000\207\000\207\000\207\000\207\000\207\000\207\000\
    \207\000\207\000\000\000\206\000\000\000\179\000\207\000\179\000\
    \207\000\207\000\207\000\207\000\207\000\207\000\207\000\207\000\
    \207\000\207\000\207\000\207\000\207\000\207\000\207\000\207\000\
    \207\000\207\000\207\000\207\000\207\000\207\000\207\000\207\000\
    \207\000\207\000\217\000\206\000\217\000\000\000\000\000\237\000\
    \000\000\217\000\238\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\216\000\216\000\216\000\216\000\216\000\216\000\
    \216\000\216\000\216\000\216\000\000\000\236\000\000\000\236\000\
    \000\000\000\000\000\000\000\000\236\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\235\000\235\000\235\000\
    \235\000\235\000\235\000\235\000\235\000\235\000\235\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\217\000\000\000\
    \000\000\000\000\000\000\000\000\217\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \217\000\000\000\000\000\000\000\217\000\000\000\217\000\000\000\
    \000\000\236\000\215\000\000\000\000\000\000\000\000\000\236\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\236\000\000\000\000\000\000\000\236\000\
    \000\000\236\000\000\000\000\000\253\000\234\000\253\000\253\000\
    \253\000\253\000\253\000\253\000\253\000\253\000\253\000\253\000\
    \253\000\253\000\253\000\253\000\253\000\253\000\253\000\253\000\
    \253\000\253\000\253\000\253\000\253\000\253\000\253\000\253\000\
    \000\000\253\000\252\000\253\000\253\000\253\000\253\000\253\000\
    \253\000\253\000\253\000\253\000\253\000\253\000\253\000\253\000\
    \253\000\253\000\253\000\253\000\253\000\253\000\253\000\253\000\
    \253\000\253\000\253\000\253\000\253\000\000\000\000\000\252\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\255\255\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000";
  Lexing.lex_check =
   "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\000\000\000\000\042\000\000\000\000\000\042\000\050\000\
    \060\000\096\000\050\000\060\000\096\000\117\000\118\000\005\001\
    \117\000\118\000\121\000\123\000\197\000\121\000\123\000\197\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
    \014\000\017\000\018\000\040\000\017\000\017\000\040\000\052\000\
    \055\000\057\000\058\000\059\000\052\000\055\000\057\000\058\000\
    \059\000\061\000\094\000\095\000\102\000\105\000\061\000\014\000\
    \108\000\014\000\040\000\014\000\079\000\079\000\079\000\079\000\
    \079\000\079\000\079\000\079\000\079\000\079\000\085\000\085\000\
    \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\
    \101\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\
    \101\000\101\000\113\000\127\000\146\000\150\000\183\000\113\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\003\000\174\000\003\000\003\000\003\000\003\000\174\000\
    \186\000\202\000\003\000\003\000\118\000\003\000\003\000\003\000\
    \121\000\203\000\119\000\209\000\092\000\119\000\027\000\092\000\
    \143\000\027\000\003\000\143\000\003\000\003\000\003\000\003\000\
    \003\000\120\000\120\000\210\000\004\000\120\000\004\000\004\000\
    \004\000\004\000\119\000\092\000\217\000\004\000\004\000\143\000\
    \004\000\004\000\004\000\027\000\175\000\220\000\178\000\223\000\
    \120\000\175\000\120\000\178\000\003\000\004\000\003\000\004\000\
    \004\000\004\000\004\000\004\000\237\000\092\000\254\000\005\000\
    \255\000\005\000\005\000\005\000\005\000\143\000\002\001\000\001\
    \005\000\005\000\177\000\005\000\005\000\005\000\177\000\177\000\
    \180\000\001\001\003\001\237\000\003\000\180\000\003\000\004\000\
    \005\000\004\000\005\000\005\000\005\000\005\000\005\000\004\001\
    \027\000\255\255\006\000\255\255\006\000\006\000\006\000\006\000\
    \181\000\255\255\255\255\006\000\006\000\181\000\006\000\006\000\
    \006\000\184\000\211\000\185\000\255\255\211\000\184\000\004\000\
    \185\000\004\000\005\000\006\000\005\000\006\000\006\000\006\000\
    \006\000\006\000\255\255\255\255\255\255\007\000\190\000\007\000\
    \007\000\007\000\007\000\190\000\255\255\225\000\007\000\007\000\
    \225\000\007\000\007\000\007\000\230\000\238\000\239\000\230\000\
    \238\000\239\000\005\000\255\255\005\000\006\000\007\000\006\000\
    \007\000\007\000\007\000\007\000\007\000\255\255\244\000\255\255\
    \008\000\244\000\008\000\008\000\008\000\008\000\255\255\255\255\
    \250\000\008\000\008\000\250\000\008\000\008\000\008\000\251\000\
    \255\255\255\255\251\000\255\255\255\255\006\000\255\255\006\000\
    \007\000\008\000\007\000\008\000\008\000\008\000\008\000\008\000\
    \255\255\226\000\255\255\009\000\226\000\009\000\009\000\009\000\
    \009\000\255\255\255\255\255\255\009\000\009\000\255\255\009\000\
    \009\000\009\000\255\255\255\255\255\255\255\255\255\255\255\255\
    \007\000\226\000\007\000\008\000\009\000\008\000\009\000\009\000\
    \009\000\009\000\009\000\255\255\245\000\255\255\011\000\245\000\
    \011\000\011\000\011\000\011\000\255\255\255\255\186\000\011\000\
    \011\000\255\255\011\000\011\000\011\000\255\255\255\255\255\255\
    \119\000\255\255\255\255\008\000\027\000\008\000\009\000\011\000\
    \009\000\011\000\011\000\011\000\011\000\011\000\255\255\255\255\
    \120\000\255\255\255\255\013\000\255\255\013\000\013\000\013\000\
    \013\000\255\255\255\255\226\000\013\000\013\000\255\255\013\000\
    \013\000\013\000\255\255\255\255\255\255\255\255\009\000\255\255\
    \009\000\011\000\011\000\011\000\013\000\255\255\013\000\013\000\
    \013\000\013\000\013\000\104\000\104\000\104\000\104\000\104\000\
    \104\000\104\000\104\000\104\000\104\000\000\001\181\000\255\255\
    \255\255\255\255\199\000\255\255\255\255\199\000\255\255\001\001\
    \003\001\011\000\255\255\011\000\255\255\255\255\013\000\255\255\
    \013\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \015\000\255\255\015\000\015\000\015\000\015\000\245\000\199\000\
    \255\255\015\000\015\000\255\255\015\000\015\000\015\000\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\013\000\013\000\
    \013\000\015\000\255\255\015\000\015\000\015\000\015\000\015\000\
    \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\
    \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\
    \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\
    \015\000\015\000\255\255\015\000\199\000\015\000\015\000\255\255\
    \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\
    \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\
    \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\
    \015\000\015\000\255\255\015\000\019\000\015\000\019\000\019\000\
    \019\000\019\000\255\255\255\255\255\255\019\000\019\000\226\000\
    \019\000\019\000\019\000\216\000\216\000\216\000\216\000\216\000\
    \216\000\216\000\216\000\216\000\216\000\019\000\255\255\019\000\
    \019\000\019\000\019\000\019\000\255\255\255\255\255\255\021\000\
    \255\255\021\000\021\000\021\000\021\000\255\255\255\255\255\255\
    \021\000\021\000\245\000\021\000\021\000\021\000\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\019\000\
    \021\000\019\000\021\000\021\000\021\000\021\000\021\000\255\255\
    \255\255\255\255\025\000\255\255\025\000\025\000\025\000\025\000\
    \255\255\255\255\255\255\025\000\025\000\255\255\025\000\025\000\
    \025\000\255\255\255\255\255\255\255\255\255\255\255\255\019\000\
    \255\255\019\000\021\000\025\000\021\000\025\000\025\000\025\000\
    \025\000\025\000\100\000\100\000\100\000\100\000\100\000\100\000\
    \100\000\100\000\100\000\100\000\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\100\000\100\000\100\000\100\000\100\000\
    \100\000\255\255\021\000\255\255\021\000\025\000\255\255\025\000\
    \199\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\026\000\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\100\000\100\000\100\000\100\000\100\000\
    \100\000\255\255\255\255\255\255\255\255\025\000\255\255\025\000\
    \026\000\026\000\255\255\026\000\026\000\026\000\026\000\255\255\
    \255\255\255\255\026\000\026\000\255\255\026\000\026\000\026\000\
    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
    \026\000\026\000\026\000\255\255\026\000\026\000\026\000\026\000\
    \026\000\219\000\219\000\219\000\219\000\219\000\219\000\219\000\
    \219\000\219\000\219\000\235\000\235\000\235\000\235\000\235\000\
    \235\000\235\000\235\000\235\000\235\000\255\255\255\255\255\255\
    \255\255\255\255\028\000\255\255\026\000\088\000\026\000\088\000\
    \088\000\088\000\088\000\088\000\088\000\088\000\088\000\088\000\
    \088\000\088\000\088\000\088\000\088\000\088\000\088\000\088\000\
    \088\000\088\000\088\000\088\000\088\000\088\000\088\000\088\000\
    \088\000\255\255\088\000\255\255\026\000\028\000\026\000\028\000\
    \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\
    \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\
    \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\
    \028\000\030\000\028\000\255\255\255\255\255\255\255\255\255\255\
    \030\000\255\255\030\000\030\000\030\000\030\000\030\000\030\000\
    \030\000\030\000\030\000\030\000\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\030\000\030\000\030\000\030\000\030\000\
    \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\
    \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\
    \030\000\030\000\030\000\030\000\030\000\255\255\255\255\255\255\
    \255\255\030\000\255\255\030\000\030\000\030\000\030\000\030\000\
    \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\
    \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\
    \030\000\030\000\030\000\030\000\030\000\031\000\255\255\255\255\
    \255\255\255\255\255\255\255\255\031\000\255\255\031\000\031\000\
    \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\031\000\
    \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\
    \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\
    \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\
    \031\000\255\255\255\255\255\255\255\255\031\000\255\255\031\000\
    \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\
    \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\
    \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\
    \031\000\032\000\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\032\000\032\000\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\032\000\032\000\032\000\255\255\255\255\255\255\
    \255\255\032\000\255\255\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\032\000\032\000\032\000\067\000\067\000\067\000\
    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\255\255\
    \255\255\255\255\255\255\067\000\255\255\067\000\067\000\067\000\
    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\240\000\
    \240\000\240\000\240\000\240\000\240\000\240\000\240\000\240\000\
    \240\000\255\255\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\255\255\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\033\000\032\000\032\000\032\000\032\000\032\000\032\000\
    \032\000\032\000\033\000\033\000\033\000\033\000\033\000\033\000\
    \033\000\033\000\033\000\033\000\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\033\000\033\000\033\000\033\000\033\000\
    \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\
    \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\
    \033\000\033\000\033\000\033\000\033\000\255\255\255\255\255\255\
    \255\255\033\000\255\255\033\000\033\000\033\000\033\000\033\000\
    \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\
    \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\
    \033\000\033\000\033\000\033\000\033\000\086\000\086\000\086\000\
    \086\000\086\000\086\000\086\000\086\000\086\000\086\000\086\000\
    \086\000\086\000\086\000\086\000\086\000\086\000\086\000\086\000\
    \086\000\086\000\086\000\086\000\086\000\086\000\086\000\255\255\
    \255\255\255\255\255\255\086\000\255\255\086\000\086\000\086\000\
    \086\000\086\000\086\000\086\000\086\000\086\000\086\000\086\000\
    \086\000\086\000\086\000\086\000\086\000\086\000\086\000\086\000\
    \086\000\086\000\086\000\086\000\086\000\086\000\086\000\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\033\000\033\000\033\000\033\000\033\000\033\000\
    \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\
    \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\
    \033\000\255\255\033\000\033\000\033\000\033\000\033\000\033\000\
    \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\
    \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\
    \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\
    \033\000\034\000\033\000\033\000\033\000\033\000\033\000\033\000\
    \033\000\033\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\255\255\255\255\255\255\
    \255\255\034\000\255\255\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\107\000\107\000\107\000\
    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\255\255\
    \255\255\255\255\255\255\255\255\255\255\111\000\107\000\107\000\
    \107\000\107\000\107\000\107\000\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\111\000\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\107\000\107\000\
    \107\000\107\000\107\000\107\000\111\000\111\000\111\000\111\000\
    \111\000\111\000\111\000\111\000\111\000\111\000\255\255\255\255\
    \255\255\255\255\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\255\255\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\035\000\034\000\034\000\034\000\034\000\034\000\034\000\
    \034\000\034\000\035\000\035\000\035\000\035\000\035\000\035\000\
    \035\000\035\000\035\000\035\000\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\035\000\035\000\035\000\035\000\035\000\
    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
    \035\000\035\000\035\000\035\000\035\000\255\255\255\255\255\255\
    \255\255\035\000\255\255\035\000\035\000\035\000\035\000\035\000\
    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
    \035\000\035\000\035\000\035\000\035\000\110\000\110\000\255\255\
    \255\255\110\000\255\255\255\255\255\255\255\255\215\000\215\000\
    \215\000\215\000\215\000\215\000\215\000\215\000\215\000\215\000\
    \255\255\255\255\255\255\255\255\110\000\255\255\110\000\215\000\
    \215\000\215\000\215\000\215\000\215\000\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\110\000\110\000\110\000\110\000\
    \110\000\110\000\110\000\110\000\110\000\110\000\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\215\000\
    \215\000\215\000\215\000\215\000\215\000\255\255\255\255\255\255\
    \255\255\255\255\035\000\035\000\035\000\035\000\035\000\035\000\
    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
    \035\000\255\255\035\000\035\000\035\000\035\000\035\000\035\000\
    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
    \035\000\255\255\035\000\035\000\035\000\035\000\035\000\035\000\
    \035\000\035\000\036\000\255\255\036\000\036\000\036\000\036\000\
    \255\255\255\255\255\255\036\000\036\000\255\255\036\000\036\000\
    \036\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\036\000\255\255\036\000\036\000\036\000\
    \036\000\036\000\255\255\255\255\255\255\037\000\255\255\037\000\
    \037\000\037\000\037\000\255\255\255\255\255\255\037\000\037\000\
    \255\255\037\000\037\000\037\000\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\036\000\037\000\036\000\
    \037\000\037\000\037\000\037\000\037\000\255\255\255\255\255\255\
    \038\000\255\255\038\000\038\000\038\000\038\000\255\255\255\255\
    \255\255\038\000\038\000\255\255\038\000\038\000\038\000\255\255\
    \255\255\255\255\255\255\255\255\255\255\036\000\255\255\036\000\
    \037\000\038\000\037\000\038\000\038\000\038\000\038\000\038\000\
    \255\255\255\255\255\255\255\255\039\000\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\110\000\039\000\039\000\039\000\
    \039\000\039\000\039\000\039\000\039\000\039\000\039\000\255\255\
    \037\000\255\255\037\000\038\000\255\255\038\000\039\000\039\000\
    \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\
    \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\
    \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\
    \255\255\255\255\255\255\038\000\039\000\038\000\039\000\039\000\
    \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\
    \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\
    \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\
    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
    \138\000\138\000\255\255\255\255\255\255\255\255\138\000\255\255\
    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
    \138\000\138\000\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\039\000\039\000\039\000\
    \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\
    \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\
    \039\000\039\000\039\000\039\000\255\255\039\000\039\000\039\000\
    \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\
    \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\
    \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\
    \039\000\039\000\039\000\039\000\255\255\039\000\039\000\039\000\
    \039\000\039\000\039\000\039\000\039\000\043\000\255\255\255\255\
    \043\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\043\000\255\255\255\255\043\000\
    \255\255\043\000\255\255\255\255\255\255\043\000\043\000\255\255\
    \043\000\255\255\043\000\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\043\000\
    \043\000\043\000\043\000\043\000\255\255\255\255\255\255\044\000\
    \255\255\044\000\044\000\044\000\044\000\255\255\255\255\255\255\
    \044\000\044\000\255\255\044\000\044\000\044\000\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \044\000\043\000\044\000\044\000\044\000\044\000\044\000\255\255\
    \255\255\255\255\045\000\255\255\045\000\045\000\045\000\045\000\
    \255\255\255\255\255\255\045\000\045\000\255\255\045\000\045\000\
    \045\000\255\255\255\255\255\255\255\255\255\255\255\255\043\000\
    \255\255\043\000\044\000\045\000\044\000\045\000\045\000\045\000\
    \045\000\045\000\255\255\255\255\255\255\046\000\255\255\046\000\
    \046\000\046\000\046\000\255\255\255\255\255\255\046\000\046\000\
    \255\255\046\000\046\000\046\000\255\255\255\255\255\255\255\255\
    \255\255\255\255\044\000\255\255\044\000\045\000\046\000\045\000\
    \046\000\046\000\046\000\046\000\046\000\255\255\255\255\255\255\
    \047\000\255\255\047\000\047\000\047\000\047\000\255\255\255\255\
    \255\255\047\000\047\000\255\255\047\000\047\000\047\000\255\255\
    \255\255\255\255\255\255\255\255\255\255\045\000\255\255\045\000\
    \046\000\047\000\046\000\047\000\047\000\047\000\047\000\047\000\
    \255\255\255\255\255\255\048\000\255\255\048\000\048\000\048\000\
    \048\000\255\255\255\255\255\255\048\000\048\000\255\255\048\000\
    \048\000\048\000\255\255\255\255\255\255\255\255\255\255\255\255\
    \046\000\255\255\046\000\047\000\048\000\047\000\048\000\048\000\
    \048\000\048\000\048\000\255\255\255\255\255\255\051\000\255\255\
    \051\000\051\000\051\000\051\000\255\255\255\255\255\255\051\000\
    \051\000\255\255\051\000\051\000\051\000\255\255\255\255\255\255\
    \255\255\255\255\255\255\047\000\255\255\047\000\048\000\051\000\
    \048\000\051\000\051\000\051\000\051\000\051\000\255\255\255\255\
    \255\255\053\000\255\255\053\000\053\000\053\000\053\000\255\255\
    \255\255\255\255\053\000\053\000\255\255\053\000\053\000\053\000\
    \255\255\255\255\255\255\255\255\255\255\255\255\048\000\255\255\
    \048\000\051\000\053\000\051\000\053\000\053\000\053\000\053\000\
    \053\000\255\255\255\255\255\255\054\000\255\255\054\000\054\000\
    \054\000\054\000\255\255\255\255\255\255\054\000\054\000\255\255\
    \054\000\054\000\054\000\255\255\255\255\255\255\255\255\255\255\
    \255\255\051\000\255\255\051\000\053\000\054\000\053\000\054\000\
    \054\000\054\000\054\000\054\000\255\255\255\255\255\255\056\000\
    \255\255\056\000\056\000\056\000\056\000\255\255\255\255\255\255\
    \056\000\056\000\255\255\056\000\056\000\056\000\255\255\255\255\
    \255\255\255\255\255\255\255\255\053\000\255\255\053\000\054\000\
    \056\000\054\000\056\000\056\000\056\000\056\000\056\000\255\255\
    \222\000\222\000\222\000\222\000\222\000\222\000\222\000\222\000\
    \222\000\222\000\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\222\000\222\000\222\000\222\000\222\000\222\000\054\000\
    \255\255\054\000\056\000\255\255\056\000\255\255\255\255\255\255\
    \255\255\255\255\062\000\255\255\062\000\062\000\062\000\062\000\
    \255\255\255\255\255\255\062\000\062\000\255\255\062\000\062\000\
    \062\000\222\000\222\000\222\000\222\000\222\000\222\000\255\255\
    \255\255\255\255\056\000\062\000\056\000\062\000\062\000\062\000\
    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
    \062\000\062\000\062\000\062\000\255\255\062\000\255\255\062\000\
    \062\000\255\255\062\000\062\000\062\000\062\000\062\000\062\000\
    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
    \062\000\062\000\062\000\062\000\255\255\062\000\063\000\062\000\
    \063\000\063\000\063\000\063\000\255\255\255\255\255\255\063\000\
    \063\000\255\255\063\000\063\000\063\000\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\063\000\
    \255\255\063\000\063\000\063\000\063\000\063\000\255\255\255\255\
    \255\255\064\000\255\255\064\000\064\000\064\000\064\000\255\255\
    \255\255\255\255\064\000\064\000\255\255\064\000\064\000\064\000\
    \255\255\255\255\194\000\255\255\255\255\194\000\255\255\255\255\
    \255\255\063\000\064\000\063\000\064\000\064\000\064\000\064\000\
    \064\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\194\000\255\255\255\255\255\255\255\255\194\000\
    \255\255\255\255\194\000\255\255\255\255\255\255\255\255\194\000\
    \255\255\063\000\255\255\063\000\064\000\255\255\064\000\255\255\
    \255\255\255\255\255\255\255\255\065\000\255\255\065\000\065\000\
    \065\000\065\000\255\255\255\255\255\255\065\000\065\000\255\255\
    \065\000\065\000\065\000\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\064\000\065\000\064\000\065\000\
    \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\
    \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\
    \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\
    \065\000\065\000\065\000\065\000\065\000\065\000\255\255\065\000\
    \255\255\065\000\065\000\194\000\065\000\065\000\065\000\065\000\
    \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\
    \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\
    \065\000\065\000\065\000\065\000\065\000\065\000\066\000\065\000\
    \255\255\065\000\255\255\255\255\255\255\066\000\255\255\066\000\
    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
    \066\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
    \066\000\066\000\255\255\255\255\255\255\255\255\066\000\255\255\
    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
    \066\000\066\000\068\000\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\255\255\255\255\255\255\
    \194\000\255\255\255\255\255\255\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\255\255\255\255\
    \255\255\255\255\068\000\255\255\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
    \068\000\068\000\068\000\068\000\068\000\068\000\069\000\255\255\
    \255\255\255\255\069\000\255\255\069\000\255\255\255\255\069\000\
    \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\
    \069\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\
    \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\
    \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\
    \069\000\069\000\255\255\255\255\255\255\255\255\069\000\255\255\
    \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\
    \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\
    \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\
    \069\000\069\000\070\000\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\070\000\070\000\070\000\070\000\070\000\
    \070\000\070\000\070\000\070\000\070\000\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\070\000\070\000\070\000\070\000\
    \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\
    \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\
    \070\000\070\000\070\000\070\000\070\000\070\000\255\255\255\255\
    \255\255\255\255\070\000\255\255\070\000\070\000\070\000\070\000\
    \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\
    \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\
    \070\000\070\000\070\000\070\000\070\000\070\000\071\000\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\071\000\
    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
    \071\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
    \071\000\071\000\255\255\255\255\255\255\255\255\071\000\255\255\
    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
    \071\000\071\000\072\000\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\072\000\072\000\072\000\072\000\072\000\
    \072\000\072\000\072\000\072\000\072\000\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\072\000\072\000\072\000\072\000\
    \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\
    \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\
    \072\000\072\000\072\000\072\000\072\000\072\000\255\255\255\255\
    \255\255\255\255\072\000\255\255\072\000\072\000\072\000\072\000\
    \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\
    \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\
    \072\000\072\000\072\000\072\000\072\000\072\000\073\000\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\073\000\
    \073\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\
    \073\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \073\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\
    \073\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\
    \073\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\
    \073\000\073\000\255\255\255\255\255\255\255\255\073\000\255\255\
    \073\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\
    \073\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\
    \073\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\
    \073\000\073\000\074\000\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\074\000\074\000\074\000\074\000\074\000\
    \074\000\074\000\074\000\074\000\074\000\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\074\000\074\000\074\000\074\000\
    \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\
    \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\
    \074\000\074\000\074\000\074\000\074\000\074\000\255\255\255\255\
    \255\255\255\255\074\000\255\255\074\000\074\000\074\000\074\000\
    \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\
    \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\
    \074\000\074\000\074\000\074\000\074\000\074\000\075\000\255\255\
    \255\255\255\255\255\255\255\255\255\255\075\000\255\255\075\000\
    \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\
    \075\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\
    \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\
    \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\
    \075\000\075\000\255\255\255\255\255\255\255\255\075\000\255\255\
    \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\
    \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\
    \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\
    \075\000\075\000\076\000\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\076\000\076\000\076\000\076\000\076\000\
    \076\000\076\000\076\000\076\000\076\000\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\076\000\076\000\076\000\076\000\
    \076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\
    \076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\
    \076\000\076\000\076\000\076\000\076\000\076\000\255\255\255\255\
    \255\255\255\255\076\000\255\255\076\000\076\000\076\000\076\000\
    \076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\
    \076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\
    \076\000\076\000\076\000\076\000\076\000\076\000\077\000\255\255\
    \255\255\255\255\077\000\255\255\077\000\255\255\255\255\077\000\
    \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\
    \077\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\
    \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\
    \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\
    \077\000\077\000\255\255\255\255\255\255\255\255\077\000\255\255\
    \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\
    \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\
    \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\
    \077\000\077\000\078\000\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\078\000\078\000\078\000\078\000\078\000\
    \078\000\078\000\078\000\078\000\078\000\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\078\000\078\000\078\000\078\000\
    \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\
    \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\
    \078\000\078\000\078\000\078\000\078\000\078\000\255\255\255\255\
    \255\255\255\255\078\000\255\255\078\000\078\000\078\000\078\000\
    \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\
    \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\
    \078\000\078\000\078\000\078\000\078\000\078\000\080\000\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\080\000\
    \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\
    \080\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\
    \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\
    \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\
    \080\000\080\000\255\255\255\255\255\255\255\255\080\000\255\255\
    \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\
    \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\
    \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\
    \080\000\080\000\081\000\255\255\255\255\255\255\081\000\255\255\
    \081\000\255\255\255\255\081\000\081\000\081\000\081\000\081\000\
    \081\000\081\000\081\000\081\000\081\000\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\081\000\081\000\081\000\081\000\
    \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\
    \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\
    \081\000\081\000\081\000\081\000\081\000\081\000\255\255\255\255\
    \255\255\255\255\081\000\255\255\081\000\081\000\081\000\081\000\
    \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\
    \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\
    \081\000\081\000\081\000\081\000\081\000\081\000\082\000\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\082\000\
    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
    \082\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
    \082\000\082\000\255\255\255\255\255\255\255\255\082\000\255\255\
    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
    \082\000\082\000\083\000\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\083\000\083\000\083\000\083\000\083\000\
    \083\000\083\000\083\000\083\000\083\000\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\083\000\083\000\083\000\083\000\
    \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\
    \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\
    \083\000\083\000\083\000\083\000\083\000\083\000\255\255\255\255\
    \255\255\255\255\083\000\255\255\083\000\083\000\083\000\083\000\
    \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\
    \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\
    \083\000\083\000\083\000\083\000\083\000\083\000\084\000\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\084\000\
    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\
    \084\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\
    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\
    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\
    \084\000\084\000\255\255\255\255\255\255\255\255\084\000\255\255\
    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\
    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\
    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\
    \084\000\084\000\089\000\255\255\255\255\089\000\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\089\000\255\255\255\255\255\255\255\255\255\255\255\255\
    \089\000\255\255\255\255\255\255\255\255\255\255\255\255\089\000\
    \255\255\089\000\089\000\089\000\089\000\089\000\089\000\089\000\
    \089\000\089\000\089\000\089\000\255\255\255\255\255\255\255\255\
    \255\255\255\255\089\000\089\000\089\000\089\000\089\000\089\000\
    \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\
    \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\
    \089\000\089\000\089\000\089\000\255\255\255\255\255\255\255\255\
    \089\000\255\255\089\000\089\000\089\000\089\000\089\000\089\000\
    \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\
    \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\
    \089\000\089\000\089\000\089\000\090\000\255\255\255\255\255\255\
    \255\255\255\255\255\255\090\000\255\255\090\000\090\000\090\000\
    \090\000\090\000\090\000\090\000\090\000\090\000\090\000\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\090\000\090\000\
    \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\
    \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\
    \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\
    \255\255\255\255\255\255\255\255\090\000\255\255\090\000\090\000\
    \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\
    \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\
    \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\
    \093\000\255\255\093\000\255\255\255\255\255\255\255\255\093\000\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \093\000\093\000\093\000\093\000\093\000\093\000\093\000\093\000\
    \093\000\093\000\112\000\255\255\112\000\112\000\112\000\112\000\
    \255\255\255\255\255\255\112\000\112\000\255\255\112\000\112\000\
    \112\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\112\000\255\255\112\000\112\000\112\000\
    \112\000\112\000\255\255\255\255\093\000\255\255\255\255\255\255\
    \255\255\255\255\093\000\114\000\255\255\114\000\114\000\114\000\
    \114\000\255\255\255\255\255\255\114\000\114\000\093\000\114\000\
    \114\000\114\000\093\000\255\255\093\000\112\000\255\255\112\000\
    \093\000\255\255\255\255\255\255\114\000\255\255\114\000\114\000\
    \114\000\114\000\114\000\255\255\255\255\255\255\115\000\255\255\
    \115\000\115\000\115\000\115\000\255\255\255\255\255\255\115\000\
    \115\000\255\255\115\000\115\000\115\000\112\000\255\255\112\000\
    \255\255\255\255\255\255\255\255\255\255\255\255\114\000\115\000\
    \114\000\115\000\115\000\115\000\115\000\115\000\255\255\255\255\
    \255\255\124\000\255\255\124\000\124\000\124\000\124\000\255\255\
    \255\255\255\255\124\000\124\000\255\255\124\000\124\000\124\000\
    \255\255\255\255\255\255\255\255\255\255\255\255\114\000\255\255\
    \114\000\115\000\124\000\115\000\124\000\124\000\124\000\124\000\
    \124\000\255\255\255\255\255\255\125\000\255\255\125\000\125\000\
    \125\000\125\000\255\255\255\255\255\255\125\000\125\000\255\255\
    \125\000\125\000\125\000\255\255\255\255\255\255\255\255\255\255\
    \255\255\115\000\255\255\115\000\124\000\125\000\124\000\125\000\
    \125\000\125\000\125\000\125\000\255\255\255\255\255\255\126\000\
    \255\255\126\000\126\000\126\000\126\000\255\255\255\255\255\255\
    \126\000\126\000\255\255\126\000\126\000\126\000\255\255\255\255\
    \093\000\255\255\255\255\255\255\124\000\255\255\124\000\125\000\
    \126\000\125\000\126\000\126\000\126\000\126\000\126\000\255\255\
    \255\255\255\255\133\000\255\255\133\000\133\000\133\000\133\000\
    \255\255\255\255\255\255\133\000\133\000\255\255\133\000\133\000\
    \133\000\255\255\255\255\255\255\255\255\255\255\255\255\125\000\
    \255\255\125\000\126\000\133\000\126\000\133\000\133\000\133\000\
    \133\000\133\000\255\255\255\255\255\255\134\000\255\255\134\000\
    \134\000\134\000\134\000\255\255\255\255\255\255\134\000\134\000\
    \255\255\134\000\134\000\134\000\255\255\255\255\255\255\255\255\
    \255\255\255\255\126\000\255\255\126\000\133\000\134\000\133\000\
    \134\000\134\000\134\000\134\000\134\000\255\255\234\000\234\000\
    \234\000\234\000\234\000\234\000\234\000\234\000\234\000\234\000\
    \135\000\255\255\255\255\135\000\255\255\255\255\255\255\234\000\
    \234\000\234\000\234\000\234\000\234\000\133\000\255\255\133\000\
    \134\000\255\255\134\000\255\255\255\255\255\255\255\255\135\000\
    \135\000\255\255\135\000\135\000\135\000\135\000\255\255\255\255\
    \255\255\135\000\135\000\255\255\135\000\135\000\135\000\234\000\
    \234\000\234\000\234\000\234\000\234\000\255\255\255\255\255\255\
    \134\000\135\000\134\000\135\000\135\000\135\000\135\000\135\000\
    \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\
    \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\
    \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\
    \135\000\135\000\255\255\135\000\255\255\135\000\135\000\255\255\
    \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\
    \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\
    \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\
    \135\000\135\000\136\000\135\000\255\255\135\000\255\255\255\255\
    \255\255\255\255\255\255\136\000\136\000\136\000\136\000\136\000\
    \136\000\136\000\136\000\136\000\136\000\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\136\000\136\000\136\000\136\000\
    \136\000\136\000\136\000\136\000\136\000\136\000\136\000\136\000\
    \136\000\136\000\136\000\136\000\136\000\136\000\136\000\136\000\
    \136\000\136\000\136\000\136\000\136\000\136\000\255\255\255\255\
    \255\255\255\255\136\000\255\255\136\000\136\000\136\000\136\000\
    \136\000\136\000\136\000\136\000\136\000\136\000\136\000\136\000\
    \136\000\136\000\136\000\136\000\136\000\136\000\136\000\136\000\
    \136\000\136\000\136\000\136\000\136\000\136\000\137\000\255\255\
    \255\255\255\255\255\255\255\255\255\255\137\000\255\255\137\000\
    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\
    \137\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\
    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\
    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\
    \137\000\137\000\255\255\255\255\255\255\255\255\137\000\255\255\
    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\
    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\
    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\
    \137\000\137\000\139\000\255\255\139\000\139\000\139\000\139\000\
    \255\255\255\255\255\255\139\000\139\000\255\255\139\000\139\000\
    \139\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\139\000\255\255\139\000\139\000\139\000\
    \139\000\139\000\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\140\000\255\255\255\255\140\000\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\139\000\255\255\139\000\
    \140\000\255\255\255\255\255\255\255\255\255\255\255\255\140\000\
    \255\255\255\255\255\255\255\255\255\255\255\255\140\000\255\255\
    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
    \140\000\140\000\255\255\255\255\255\255\139\000\140\000\139\000\
    \255\255\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
    \140\000\140\000\140\000\255\255\255\255\255\255\255\255\140\000\
    \255\255\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
    \140\000\140\000\140\000\141\000\255\255\255\255\141\000\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\141\000\144\000\255\255\144\000\144\000\144\000\
    \144\000\255\255\255\255\255\255\144\000\144\000\255\255\144\000\
    \144\000\144\000\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\144\000\255\255\144\000\144\000\
    \144\000\144\000\144\000\141\000\141\000\141\000\141\000\141\000\
    \141\000\141\000\141\000\141\000\141\000\141\000\141\000\141\000\
    \141\000\141\000\141\000\141\000\141\000\141\000\141\000\141\000\
    \141\000\141\000\141\000\141\000\141\000\255\255\144\000\255\255\
    \144\000\141\000\255\255\141\000\141\000\141\000\141\000\141\000\
    \141\000\141\000\141\000\141\000\141\000\141\000\141\000\141\000\
    \141\000\141\000\141\000\141\000\141\000\141\000\141\000\141\000\
    \141\000\141\000\141\000\141\000\141\000\255\255\144\000\145\000\
    \144\000\145\000\145\000\145\000\145\000\255\255\255\255\255\255\
    \145\000\145\000\255\255\145\000\145\000\145\000\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \145\000\255\255\145\000\145\000\145\000\145\000\145\000\255\255\
    \242\000\242\000\242\000\242\000\242\000\242\000\242\000\242\000\
    \242\000\242\000\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\242\000\242\000\242\000\242\000\242\000\242\000\255\255\
    \255\255\255\255\145\000\255\255\145\000\255\255\255\255\255\255\
    \255\255\255\255\153\000\255\255\153\000\153\000\153\000\153\000\
    \255\255\255\255\255\255\153\000\153\000\255\255\153\000\153\000\
    \153\000\242\000\242\000\242\000\242\000\242\000\242\000\255\255\
    \255\255\255\255\145\000\153\000\145\000\153\000\153\000\153\000\
    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
    \153\000\153\000\153\000\153\000\255\255\153\000\255\255\153\000\
    \153\000\255\255\153\000\153\000\153\000\153\000\153\000\153\000\
    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
    \153\000\153\000\153\000\153\000\255\255\153\000\155\000\153\000\
    \155\000\155\000\155\000\155\000\255\255\255\255\255\255\155\000\
    \155\000\255\255\155\000\155\000\155\000\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\155\000\
    \255\255\155\000\155\000\155\000\155\000\155\000\255\255\255\255\
    \255\255\156\000\255\255\156\000\156\000\156\000\156\000\255\255\
    \255\255\255\255\156\000\156\000\255\255\156\000\156\000\156\000\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\155\000\156\000\155\000\156\000\156\000\156\000\156\000\
    \156\000\255\255\255\255\255\255\157\000\255\255\157\000\157\000\
    \157\000\157\000\255\255\255\255\255\255\157\000\157\000\255\255\
    \157\000\157\000\157\000\255\255\255\255\255\255\255\255\255\255\
    \255\255\155\000\255\255\155\000\156\000\157\000\156\000\157\000\
    \157\000\157\000\157\000\157\000\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\156\000\255\255\156\000\157\000\
    \255\255\157\000\158\000\158\000\158\000\158\000\158\000\158\000\
    \158\000\158\000\158\000\158\000\158\000\158\000\158\000\158\000\
    \158\000\158\000\158\000\158\000\158\000\158\000\158\000\158\000\
    \158\000\158\000\158\000\158\000\255\255\255\255\255\255\157\000\
    \158\000\157\000\158\000\158\000\158\000\158\000\158\000\158\000\
    \158\000\158\000\158\000\158\000\158\000\158\000\158\000\158\000\
    \158\000\158\000\158\000\158\000\158\000\158\000\158\000\158\000\
    \158\000\158\000\158\000\158\000\159\000\255\255\159\000\159\000\
    \159\000\159\000\255\255\255\255\255\255\159\000\159\000\255\255\
    \159\000\159\000\159\000\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\159\000\255\255\159\000\
    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
    \159\000\159\000\159\000\159\000\159\000\159\000\255\255\159\000\
    \255\255\159\000\159\000\255\255\159\000\159\000\159\000\159\000\
    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
    \159\000\159\000\159\000\159\000\159\000\159\000\255\255\159\000\
    \255\255\159\000\160\000\160\000\160\000\160\000\160\000\160\000\
    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
    \160\000\160\000\160\000\160\000\255\255\255\255\255\255\255\255\
    \160\000\255\255\160\000\160\000\160\000\160\000\160\000\160\000\
    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
    \160\000\160\000\160\000\160\000\162\000\255\255\162\000\162\000\
    \162\000\162\000\255\255\255\255\255\255\162\000\162\000\255\255\
    \162\000\162\000\162\000\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\162\000\255\255\162\000\
    \162\000\162\000\162\000\162\000\255\255\255\255\255\255\163\000\
    \255\255\163\000\163\000\163\000\163\000\255\255\255\255\255\255\
    \163\000\163\000\255\255\163\000\163\000\163\000\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\162\000\
    \163\000\162\000\163\000\163\000\163\000\163\000\163\000\255\255\
    \255\255\255\255\164\000\255\255\164\000\164\000\164\000\164\000\
    \255\255\255\255\255\255\164\000\164\000\255\255\164\000\164\000\
    \164\000\255\255\255\255\255\255\255\255\255\255\255\255\162\000\
    \255\255\162\000\163\000\164\000\163\000\164\000\164\000\164\000\
    \164\000\164\000\255\255\255\255\255\255\165\000\255\255\165\000\
    \165\000\165\000\165\000\255\255\255\255\255\255\165\000\165\000\
    \255\255\165\000\165\000\165\000\255\255\255\255\255\255\255\255\
    \255\255\255\255\163\000\255\255\163\000\164\000\165\000\164\000\
    \165\000\165\000\165\000\165\000\165\000\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\164\000\255\255\164\000\
    \165\000\165\000\165\000\255\255\255\255\255\255\255\255\255\255\
    \167\000\255\255\167\000\167\000\167\000\167\000\255\255\255\255\
    \255\255\167\000\167\000\255\255\167\000\167\000\167\000\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \165\000\167\000\165\000\167\000\167\000\167\000\167\000\167\000\
    \167\000\167\000\167\000\167\000\167\000\167\000\167\000\167\000\
    \167\000\167\000\167\000\167\000\167\000\167\000\167\000\167\000\
    \167\000\167\000\167\000\167\000\167\000\167\000\167\000\167\000\
    \167\000\167\000\255\255\167\000\255\255\167\000\167\000\255\255\
    \167\000\167\000\167\000\167\000\167\000\167\000\167\000\167\000\
    \167\000\167\000\167\000\167\000\167\000\167\000\167\000\167\000\
    \167\000\167\000\167\000\167\000\167\000\167\000\167\000\167\000\
    \167\000\167\000\255\255\167\000\255\255\167\000\168\000\168\000\
    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
    \255\255\255\255\255\255\255\255\168\000\255\255\168\000\168\000\
    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
    \169\000\255\255\169\000\169\000\169\000\169\000\255\255\255\255\
    \255\255\169\000\169\000\255\255\169\000\169\000\169\000\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\169\000\255\255\169\000\169\000\169\000\169\000\169\000\
    \255\255\255\255\255\255\170\000\255\255\170\000\170\000\170\000\
    \170\000\255\255\255\255\255\255\170\000\170\000\255\255\170\000\
    \170\000\170\000\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\169\000\170\000\169\000\170\000\170\000\
    \170\000\170\000\170\000\255\255\255\255\255\255\171\000\255\255\
    \171\000\171\000\171\000\171\000\255\255\255\255\255\255\171\000\
    \171\000\255\255\171\000\171\000\171\000\255\255\255\255\255\255\
    \255\255\255\255\255\255\169\000\255\255\169\000\170\000\171\000\
    \170\000\171\000\171\000\171\000\171\000\171\000\255\255\255\255\
    \255\255\172\000\255\255\172\000\172\000\172\000\172\000\255\255\
    \255\255\255\255\172\000\172\000\255\255\172\000\172\000\172\000\
    \255\255\255\255\255\255\255\255\255\255\255\255\170\000\255\255\
    \170\000\171\000\172\000\171\000\172\000\172\000\172\000\172\000\
    \172\000\255\255\255\255\255\255\173\000\255\255\173\000\173\000\
    \173\000\173\000\255\255\255\255\255\255\173\000\173\000\255\255\
    \173\000\173\000\173\000\255\255\255\255\255\255\255\255\255\255\
    \255\255\171\000\255\255\171\000\172\000\173\000\172\000\173\000\
    \173\000\173\000\173\000\173\000\255\255\255\255\255\255\176\000\
    \255\255\176\000\176\000\176\000\176\000\255\255\255\255\255\255\
    \176\000\176\000\255\255\176\000\176\000\176\000\255\255\255\255\
    \255\255\255\255\255\255\255\255\172\000\255\255\172\000\173\000\
    \176\000\173\000\176\000\176\000\176\000\176\000\176\000\255\255\
    \255\255\255\255\179\000\255\255\179\000\179\000\179\000\179\000\
    \255\255\255\255\255\255\179\000\179\000\255\255\179\000\179\000\
    \179\000\255\255\255\255\255\255\255\255\255\255\255\255\173\000\
    \255\255\173\000\176\000\179\000\176\000\179\000\179\000\179\000\
    \179\000\179\000\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\176\000\255\255\176\000\179\000\200\000\179\000\
    \200\000\200\000\200\000\200\000\200\000\200\000\200\000\200\000\
    \200\000\200\000\200\000\200\000\200\000\200\000\200\000\200\000\
    \200\000\200\000\200\000\200\000\200\000\200\000\200\000\200\000\
    \200\000\200\000\255\255\200\000\255\255\179\000\207\000\179\000\
    \207\000\207\000\207\000\207\000\207\000\207\000\207\000\207\000\
    \207\000\207\000\207\000\207\000\207\000\207\000\207\000\207\000\
    \207\000\207\000\207\000\207\000\207\000\207\000\207\000\207\000\
    \207\000\207\000\208\000\207\000\208\000\255\255\255\255\231\000\
    \255\255\208\000\231\000\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\208\000\208\000\208\000\208\000\208\000\208\000\
    \208\000\208\000\208\000\208\000\255\255\231\000\255\255\231\000\
    \255\255\255\255\255\255\255\255\231\000\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\231\000\231\000\231\000\
    \231\000\231\000\231\000\231\000\231\000\231\000\231\000\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\208\000\255\255\
    \255\255\255\255\255\255\255\255\208\000\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \208\000\255\255\255\255\255\255\208\000\255\255\208\000\255\255\
    \255\255\231\000\208\000\255\255\255\255\255\255\255\255\231\000\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\231\000\255\255\255\255\255\255\231\000\
    \255\255\231\000\255\255\255\255\247\000\231\000\247\000\247\000\
    \247\000\247\000\247\000\247\000\247\000\247\000\247\000\247\000\
    \247\000\247\000\247\000\247\000\247\000\247\000\247\000\247\000\
    \247\000\247\000\247\000\247\000\247\000\247\000\247\000\247\000\
    \255\255\253\000\247\000\253\000\253\000\253\000\253\000\253\000\
    \253\000\253\000\253\000\253\000\253\000\253\000\253\000\253\000\
    \253\000\253\000\253\000\253\000\253\000\253\000\253\000\253\000\
    \253\000\253\000\253\000\253\000\253\000\255\255\255\255\253\000\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\231\000\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255";
  Lexing.lex_base_code =
   "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\010\000\036\000\
    \000\000\000\000\000\000\000\000\012\000\000\000\000\000\000\000\
    \002\000\000\000\027\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\002\000\004\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000";
  Lexing.lex_backtrk_code =
   "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\039\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000";
  Lexing.lex_default_code =
   "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\019\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000";
  Lexing.lex_trans_code =
   "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\001\000\000\000\036\000\036\000\000\000\036\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \001\000\000\000\000\000\001\000\022\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\007\000\001\000\000\000\000\000\
    \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\
    \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\
    \004\000\004\000\004\000\004\000\001\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\004\000\004\000\004\000\004\000\
    \004\000\004\000\004\000\004\000\004\000\004\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000";
  Lexing.lex_check_code =
   "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\026\000\119\000\231\000\238\000\119\000\239\000\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \026\000\255\255\119\000\000\000\120\000\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\110\000\111\000\255\255\255\255\
    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
    \026\000\026\000\110\000\110\000\110\000\110\000\110\000\110\000\
    \110\000\110\000\110\000\110\000\111\000\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\111\000\111\000\111\000\111\000\
    \111\000\111\000\111\000\111\000\111\000\111\000\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \119\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255";
  Lexing.lex_code =
   "\255\004\255\255\005\255\255\007\255\006\255\255\003\255\000\004\
    \001\005\255\007\255\255\006\255\007\255\255\000\004\001\005\003\
    \006\002\007\255\001\255\255\000\001\255";
}

let rec token lexbuf =
  lexbuf.Lexing.lex_mem <- Array.make 8 (-1); __ocaml_lex_token_rec lexbuf 0
and __ocaml_lex_token_rec lexbuf __ocaml_lex_state =
  match Lexing.new_engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
# 404 "src/reason-parser/reason_lexer.mll"
                 (
      match !preprocessor with
      | None ->
        raise (Error(Illegal_character (Lexing.lexeme_char lexbuf 0),
                     Location.curr lexbuf))
      | Some _ ->
        update_loc lexbuf None 1 false 0;
        token lexbuf )
# 2342 "src/reason-parser/reason_lexer.ml"

  | 1 ->
# 413 "src/reason-parser/reason_lexer.mll"
      ( update_loc lexbuf None 1 false 0;
        match !preprocessor with
        | None -> token lexbuf
        | Some _ -> EOL
      )
# 2351 "src/reason-parser/reason_lexer.ml"

  | 2 ->
# 419 "src/reason-parser/reason_lexer.mll"
      ( token lexbuf )
# 2356 "src/reason-parser/reason_lexer.ml"

  | 3 ->
# 421 "src/reason-parser/reason_lexer.mll"
      ( UNDERSCORE )
# 2361 "src/reason-parser/reason_lexer.ml"

  | 4 ->
# 423 "src/reason-parser/reason_lexer.mll"
      ( TILDE )
# 2366 "src/reason-parser/reason_lexer.ml"

  | 5 ->
# 425 "src/reason-parser/reason_lexer.mll"
      ( QUESTION )
# 2371 "src/reason-parser/reason_lexer.ml"

  | 6 ->
# 427 "src/reason-parser/reason_lexer.mll"
      ( set_lexeme_length lexbuf 1; EQUAL )
# 2376 "src/reason-parser/reason_lexer.ml"

  | 7 ->
# 429 "src/reason-parser/reason_lexer.mll"
      ( let s = Lexing.lexeme lexbuf in
        try Hashtbl.find keyword_table s
        with Not_found -> LIDENT s )
# 2383 "src/reason-parser/reason_lexer.ml"

  | 8 ->
# 433 "src/reason-parser/reason_lexer.mll"
      ( warn_latin1 lexbuf; LIDENT (Lexing.lexeme lexbuf) )
# 2388 "src/reason-parser/reason_lexer.ml"

  | 9 ->
# 435 "src/reason-parser/reason_lexer.mll"
      ( UIDENT(Lexing.lexeme lexbuf) )
# 2393 "src/reason-parser/reason_lexer.ml"

  | 10 ->
# 437 "src/reason-parser/reason_lexer.mll"
      ( warn_latin1 lexbuf; UIDENT(Lexing.lexeme lexbuf) )
# 2398 "src/reason-parser/reason_lexer.ml"

  | 11 ->
# 438 "src/reason-parser/reason_lexer.mll"
                ( INT (Lexing.lexeme lexbuf, None) )
# 2403 "src/reason-parser/reason_lexer.ml"

  | 12 ->
let
# 439 "src/reason-parser/reason_lexer.mll"
                    lit
# 2409 "src/reason-parser/reason_lexer.ml"
= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos (lexbuf.Lexing.lex_curr_pos + -1)
and
# 439 "src/reason-parser/reason_lexer.mll"
                                              modif
# 2414 "src/reason-parser/reason_lexer.ml"
= Lexing.sub_lexeme_char lexbuf (lexbuf.Lexing.lex_curr_pos + -1) in
# 440 "src/reason-parser/reason_lexer.mll"
      ( INT (lit, Some modif) )
# 2418 "src/reason-parser/reason_lexer.ml"

  | 13 ->
# 442 "src/reason-parser/reason_lexer.mll"
      ( FLOAT (Lexing.lexeme lexbuf, None) )
# 2423 "src/reason-parser/reason_lexer.ml"

  | 14 ->
let
# 443 "src/reason-parser/reason_lexer.mll"
                                            lit
# 2429 "src/reason-parser/reason_lexer.ml"
= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos (lexbuf.Lexing.lex_curr_pos + -1)
and
# 443 "src/reason-parser/reason_lexer.mll"
                                                                      modif
# 2434 "src/reason-parser/reason_lexer.ml"
= Lexing.sub_lexeme_char lexbuf (lexbuf.Lexing.lex_curr_pos + -1) in
# 444 "src/reason-parser/reason_lexer.mll"
      ( FLOAT (lit, Some modif) )
# 2438 "src/reason-parser/reason_lexer.ml"

  | 15 ->
# 446 "src/reason-parser/reason_lexer.mll"
      ( raise (Error(Invalid_literal (Lexing.lexeme lexbuf),
                     Location.curr lexbuf)) )
# 2444 "src/reason-parser/reason_lexer.ml"

  | 16 ->
# 449 "src/reason-parser/reason_lexer.mll"
      ( reset_string_buffer();
        is_in_string := true;
        let string_start = lexbuf.lex_start_p in
        string_start_loc := Location.curr lexbuf;
        string raw_buffer lexbuf;
        is_in_string := false;
        lexbuf.lex_start_p <- string_start;
        let text, raw = get_stored_string() in
        STRING (text, raw, None) )
# 2457 "src/reason-parser/reason_lexer.ml"

  | 17 ->
# 459 "src/reason-parser/reason_lexer.mll"
      ( reset_string_buffer();
        let delim = Lexing.lexeme lexbuf in
        let delim = String.sub delim 1 (String.length delim - 2) in
        is_in_string := true;
        let string_start = lexbuf.lex_start_p in
        string_start_loc := Location.curr lexbuf;
        quoted_string delim lexbuf;
        is_in_string := false;
        lexbuf.lex_start_p <- string_start;
        STRING (fst (get_stored_string()), None, Some delim) )
# 2471 "src/reason-parser/reason_lexer.ml"

  | 18 ->
# 470 "src/reason-parser/reason_lexer.mll"
      ( update_loc lexbuf None 1 false 1;
        CHAR (Lexing.lexeme_char lexbuf 1) )
# 2477 "src/reason-parser/reason_lexer.ml"

  | 19 ->
# 473 "src/reason-parser/reason_lexer.mll"
      ( CHAR(Lexing.lexeme_char lexbuf 1) )
# 2482 "src/reason-parser/reason_lexer.ml"

  | 20 ->
# 475 "src/reason-parser/reason_lexer.mll"
      ( CHAR(char_for_backslash (Lexing.lexeme_char lexbuf 2)) )
# 2487 "src/reason-parser/reason_lexer.ml"

  | 21 ->
# 477 "src/reason-parser/reason_lexer.mll"
      ( CHAR(char_for_decimal_code lexbuf 2) )
# 2492 "src/reason-parser/reason_lexer.ml"

  | 22 ->
# 479 "src/reason-parser/reason_lexer.mll"
      ( CHAR(char_for_hexadecimal_code lexbuf 3) )
# 2497 "src/reason-parser/reason_lexer.ml"

  | 23 ->
# 481 "src/reason-parser/reason_lexer.mll"
      ( let l = Lexing.lexeme lexbuf in
        let esc = String.sub l 1 (String.length l - 1) in
        raise (Error(Illegal_escape esc, Location.curr lexbuf))
      )
# 2505 "src/reason-parser/reason_lexer.ml"

  | 24 ->
# 485 "src/reason-parser/reason_lexer.mll"
          (
    (* Allow parsing of foo#=<bar /> *)
    set_lexeme_length lexbuf 2;
    SHARPEQUAL
  )
# 2514 "src/reason-parser/reason_lexer.ml"

  | 25 ->
# 490 "src/reason-parser/reason_lexer.mll"
         ( SHARPEQUAL )
# 2519 "src/reason-parser/reason_lexer.ml"

  | 26 ->
# 492 "src/reason-parser/reason_lexer.mll"
      ( SHARPOP(lexeme_operator lexbuf) )
# 2524 "src/reason-parser/reason_lexer.ml"

  | 27 ->
let
# 493 "src/reason-parser/reason_lexer.mll"
                                   num
# 2530 "src/reason-parser/reason_lexer.ml"
= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_mem.(0) lexbuf.Lexing.lex_mem.(1)
and
# 494 "src/reason-parser/reason_lexer.mll"
                                           name
# 2535 "src/reason-parser/reason_lexer.ml"
= Lexing.sub_lexeme_opt lexbuf lexbuf.Lexing.lex_mem.(3) lexbuf.Lexing.lex_mem.(2) in
# 496 "src/reason-parser/reason_lexer.mll"
      ( update_loc lexbuf name (int_of_string num) true 0;
        token lexbuf
      )
# 2541 "src/reason-parser/reason_lexer.ml"

  | 28 ->
# 499 "src/reason-parser/reason_lexer.mll"
         ( AMPERSAND )
# 2546 "src/reason-parser/reason_lexer.ml"

  | 29 ->
# 500 "src/reason-parser/reason_lexer.mll"
         ( AMPERAMPER )
# 2551 "src/reason-parser/reason_lexer.ml"

  | 30 ->
# 501 "src/reason-parser/reason_lexer.mll"
         ( BACKQUOTE )
# 2556 "src/reason-parser/reason_lexer.ml"

  | 31 ->
# 502 "src/reason-parser/reason_lexer.mll"
         ( QUOTE )
# 2561 "src/reason-parser/reason_lexer.ml"

  | 32 ->
# 503 "src/reason-parser/reason_lexer.mll"
         ( LPAREN )
# 2566 "src/reason-parser/reason_lexer.ml"

  | 33 ->
# 504 "src/reason-parser/reason_lexer.mll"
         ( RPAREN )
# 2571 "src/reason-parser/reason_lexer.ml"

  | 34 ->
# 505 "src/reason-parser/reason_lexer.mll"
         ( STAR )
# 2576 "src/reason-parser/reason_lexer.ml"

  | 35 ->
# 506 "src/reason-parser/reason_lexer.mll"
         ( COMMA )
# 2581 "src/reason-parser/reason_lexer.ml"

  | 36 ->
# 507 "src/reason-parser/reason_lexer.mll"
         ( MINUSGREATER )
# 2586 "src/reason-parser/reason_lexer.ml"

  | 37 ->
# 508 "src/reason-parser/reason_lexer.mll"
         ( EQUALGREATER )
# 2591 "src/reason-parser/reason_lexer.ml"

  | 38 ->
# 510 "src/reason-parser/reason_lexer.mll"
                                                     (
    set_lexeme_length lexbuf 2;
    EQUALGREATER
  )
# 2599 "src/reason-parser/reason_lexer.ml"

  | 39 ->
# 514 "src/reason-parser/reason_lexer.mll"
         ( SHARP )
# 2604 "src/reason-parser/reason_lexer.ml"

  | 40 ->
# 515 "src/reason-parser/reason_lexer.mll"
         ( DOT )
# 2609 "src/reason-parser/reason_lexer.ml"

  | 41 ->
# 516 "src/reason-parser/reason_lexer.mll"
         ( DOTDOT )
# 2614 "src/reason-parser/reason_lexer.ml"

  | 42 ->
# 517 "src/reason-parser/reason_lexer.mll"
         ( DOTDOTDOT )
# 2619 "src/reason-parser/reason_lexer.ml"

  | 43 ->
# 518 "src/reason-parser/reason_lexer.mll"
         ( COLON )
# 2624 "src/reason-parser/reason_lexer.ml"

  | 44 ->
# 519 "src/reason-parser/reason_lexer.mll"
         ( COLONCOLON )
# 2629 "src/reason-parser/reason_lexer.ml"

  | 45 ->
# 520 "src/reason-parser/reason_lexer.mll"
         ( COLONEQUAL )
# 2634 "src/reason-parser/reason_lexer.ml"

  | 46 ->
# 521 "src/reason-parser/reason_lexer.mll"
         ( COLONGREATER )
# 2639 "src/reason-parser/reason_lexer.ml"

  | 47 ->
# 522 "src/reason-parser/reason_lexer.mll"
         ( SEMI )
# 2644 "src/reason-parser/reason_lexer.ml"

  | 48 ->
# 523 "src/reason-parser/reason_lexer.mll"
         ( SEMISEMI )
# 2649 "src/reason-parser/reason_lexer.ml"

  | 49 ->
# 524 "src/reason-parser/reason_lexer.mll"
         ( LESS )
# 2654 "src/reason-parser/reason_lexer.ml"

  | 50 ->
# 525 "src/reason-parser/reason_lexer.mll"
         ( EQUAL )
# 2659 "src/reason-parser/reason_lexer.ml"

  | 51 ->
# 526 "src/reason-parser/reason_lexer.mll"
         ( LBRACKET )
# 2664 "src/reason-parser/reason_lexer.ml"

  | 52 ->
# 527 "src/reason-parser/reason_lexer.mll"
         ( LBRACKETBAR )
# 2669 "src/reason-parser/reason_lexer.ml"

  | 53 ->
# 528 "src/reason-parser/reason_lexer.mll"
         ( LBRACKETLESS )
# 2674 "src/reason-parser/reason_lexer.ml"

  | 54 ->
# 529 "src/reason-parser/reason_lexer.mll"
         ( LBRACKETGREATER )
# 2679 "src/reason-parser/reason_lexer.ml"

  | 55 ->
# 530 "src/reason-parser/reason_lexer.mll"
                                                         (
    let buf = Lexing.lexeme lexbuf in
    LESSIDENT (String.sub buf 1 (String.length buf - 1))
  )
# 2687 "src/reason-parser/reason_lexer.ml"

  | 56 ->
# 534 "src/reason-parser/reason_lexer.mll"
           ( GREATERDOTDOTDOT )
# 2692 "src/reason-parser/reason_lexer.ml"

  | 57 ->
# 543 "src/reason-parser/reason_lexer.mll"
                                                       (
    set_lexeme_length lexbuf 2;
    LBRACELESS
  )
# 2700 "src/reason-parser/reason_lexer.ml"

  | 58 ->
# 547 "src/reason-parser/reason_lexer.mll"
                                                    (
    (* allows parsing of `{<Text` in <Description term={<Text text="Age" />}> as correct jsx *)
    set_lexeme_length lexbuf 1;
    LBRACE
  )
# 2709 "src/reason-parser/reason_lexer.ml"

  | 59 ->
# 552 "src/reason-parser/reason_lexer.mll"
                                                                      (
    let buf = Lexing.lexeme lexbuf in
    LESSSLASHIDENTGREATER (String.trim (String.sub buf 2 (String.length buf - 2 - 1)))
  )
# 2717 "src/reason-parser/reason_lexer.ml"

  | 60 ->
# 556 "src/reason-parser/reason_lexer.mll"
         ( RBRACKET )
# 2722 "src/reason-parser/reason_lexer.ml"

  | 61 ->
# 557 "src/reason-parser/reason_lexer.mll"
         ( LBRACE )
# 2727 "src/reason-parser/reason_lexer.ml"

  | 62 ->
# 558 "src/reason-parser/reason_lexer.mll"
         ( LBRACELESS )
# 2732 "src/reason-parser/reason_lexer.ml"

  | 63 ->
# 559 "src/reason-parser/reason_lexer.mll"
         ( BAR )
# 2737 "src/reason-parser/reason_lexer.ml"

  | 64 ->
# 560 "src/reason-parser/reason_lexer.mll"
         ( BARBAR )
# 2742 "src/reason-parser/reason_lexer.ml"

  | 65 ->
# 561 "src/reason-parser/reason_lexer.mll"
         ( BARRBRACKET )
# 2747 "src/reason-parser/reason_lexer.ml"

  | 66 ->
# 562 "src/reason-parser/reason_lexer.mll"
         ( GREATER )
# 2752 "src/reason-parser/reason_lexer.ml"

  | 67 ->
# 568 "src/reason-parser/reason_lexer.mll"
         ( RBRACE )
# 2757 "src/reason-parser/reason_lexer.ml"

  | 68 ->
# 569 "src/reason-parser/reason_lexer.mll"
         ( GREATERRBRACE )
# 2762 "src/reason-parser/reason_lexer.ml"

  | 69 ->
# 570 "src/reason-parser/reason_lexer.mll"
                                 (
    (* allow `let x=<div />;` *)
    set_lexeme_length lexbuf 1;
    EQUAL
  )
# 2771 "src/reason-parser/reason_lexer.ml"

  | 70 ->
# 576 "src/reason-parser/reason_lexer.mll"
           (
    set_lexeme_length lexbuf 2;
    SLASHGREATER
  )
# 2779 "src/reason-parser/reason_lexer.ml"

  | 71 ->
# 580 "src/reason-parser/reason_lexer.mll"
          (
    set_lexeme_length lexbuf 2;
    LBRACKETBAR
  )
# 2787 "src/reason-parser/reason_lexer.ml"

  | 72 ->
# 585 "src/reason-parser/reason_lexer.mll"
                                   (
    (* allow parsing of <div asd=1></div> *)
    set_lexeme_length lexbuf 2;
    SLASHGREATER
  )
# 2796 "src/reason-parser/reason_lexer.ml"

  | 73 ->
# 590 "src/reason-parser/reason_lexer.mll"
                                  (
    (* allow parsing of <div asd=1></div> *)
    set_lexeme_length lexbuf 1;
    GREATER
  )
# 2805 "src/reason-parser/reason_lexer.ml"

  | 74 ->
# 595 "src/reason-parser/reason_lexer.mll"
                                 (
    (* allow parsing of <div><span> *)
    set_lexeme_length lexbuf 1;
    GREATER
  )
# 2814 "src/reason-parser/reason_lexer.ml"

  | 75 ->
# 600 "src/reason-parser/reason_lexer.mll"
         ( LBRACKETAT )
# 2819 "src/reason-parser/reason_lexer.ml"

  | 76 ->
# 601 "src/reason-parser/reason_lexer.mll"
         ( LBRACKETPERCENT )
# 2824 "src/reason-parser/reason_lexer.ml"

  | 77 ->
# 602 "src/reason-parser/reason_lexer.mll"
          ( LBRACKETPERCENTPERCENT )
# 2829 "src/reason-parser/reason_lexer.ml"

  | 78 ->
# 603 "src/reason-parser/reason_lexer.mll"
         ( BANG )
# 2834 "src/reason-parser/reason_lexer.ml"

  | 79 ->
# 604 "src/reason-parser/reason_lexer.mll"
         ( INFIXOP0 "!=" )
# 2839 "src/reason-parser/reason_lexer.ml"

  | 80 ->
# 605 "src/reason-parser/reason_lexer.mll"
          ( INFIXOP0 "!==" )
# 2844 "src/reason-parser/reason_lexer.ml"

  | 81 ->
# 606 "src/reason-parser/reason_lexer.mll"
           ( INFIXOP0 "!=" )
# 2849 "src/reason-parser/reason_lexer.ml"

  | 82 ->
# 607 "src/reason-parser/reason_lexer.mll"
            ( INFIXOP0 "!==" )
# 2854 "src/reason-parser/reason_lexer.ml"

  | 83 ->
# 608 "src/reason-parser/reason_lexer.mll"
         ( PLUS )
# 2859 "src/reason-parser/reason_lexer.ml"

  | 84 ->
# 609 "src/reason-parser/reason_lexer.mll"
         ( PLUSDOT )
# 2864 "src/reason-parser/reason_lexer.ml"

  | 85 ->
# 610 "src/reason-parser/reason_lexer.mll"
         ( PLUSEQ )
# 2869 "src/reason-parser/reason_lexer.ml"

  | 86 ->
# 611 "src/reason-parser/reason_lexer.mll"
         ( MINUS )
# 2874 "src/reason-parser/reason_lexer.ml"

  | 87 ->
# 612 "src/reason-parser/reason_lexer.mll"
         ( MINUSDOT )
# 2879 "src/reason-parser/reason_lexer.ml"

  | 88 ->
# 613 "src/reason-parser/reason_lexer.mll"
         ( LESSGREATER )
# 2884 "src/reason-parser/reason_lexer.ml"

  | 89 ->
# 614 "src/reason-parser/reason_lexer.mll"
          ( LESSSLASHGREATER )
# 2889 "src/reason-parser/reason_lexer.ml"

  | 90 ->
# 615 "src/reason-parser/reason_lexer.mll"
           ( LESSDOTDOTGREATER )
# 2894 "src/reason-parser/reason_lexer.ml"

  | 91 ->
# 617 "src/reason-parser/reason_lexer.mll"
            ( PREFIXOP(lexeme_operator lexbuf) )
# 2899 "src/reason-parser/reason_lexer.ml"

  | 92 ->
# 619 "src/reason-parser/reason_lexer.mll"
            (
              INFIXOP0(lexeme_operator lexbuf)
            )
# 2906 "src/reason-parser/reason_lexer.ml"

  | 93 ->
# 623 "src/reason-parser/reason_lexer.mll"
            ( INFIXOP1(lexeme_operator lexbuf) )
# 2911 "src/reason-parser/reason_lexer.ml"

  | 94 ->
# 625 "src/reason-parser/reason_lexer.mll"
            ( match lexeme_without_comment lexbuf with
              | "^." -> set_lexeme_length lexbuf 1; POSTFIXOP("^")
              | "^|" ->
                  (* ^| is not an infix op in [|a^|] *)
                  set_lexeme_length lexbuf 1; POSTFIXOP("^")
              | "^" -> POSTFIXOP("^")
              | op -> INFIXOP1(unescape_operator op) )
# 2922 "src/reason-parser/reason_lexer.ml"

  | 95 ->
# 633 "src/reason-parser/reason_lexer.mll"
            ( INFIXOP1(lexeme_operator lexbuf) )
# 2927 "src/reason-parser/reason_lexer.ml"

  | 96 ->
# 635 "src/reason-parser/reason_lexer.mll"
            ( INFIXOP2(lexeme_operator lexbuf) )
# 2932 "src/reason-parser/reason_lexer.ml"

  | 97 ->
# 637 "src/reason-parser/reason_lexer.mll"
         ( SLASHGREATER )
# 2937 "src/reason-parser/reason_lexer.ml"

  | 98 ->
# 648 "src/reason-parser/reason_lexer.mll"
            ( INFIXOP4(lexeme_operator lexbuf) )
# 2942 "src/reason-parser/reason_lexer.ml"

  | 99 ->
# 649 "src/reason-parser/reason_lexer.mll"
            ( PERCENT )
# 2947 "src/reason-parser/reason_lexer.ml"

  | 100 ->
# 651 "src/reason-parser/reason_lexer.mll"
            ( match lexeme_operator lexbuf with
              | "" ->
                  (* If the operator is empty, it means the lexeme is beginning
                   * by a comment sequence: we let the comment lexer handle
                   * the case. *)
                  enter_comment lexbuf
              | op -> INFIXOP3 op )
# 2958 "src/reason-parser/reason_lexer.ml"

  | 101 ->
# 659 "src/reason-parser/reason_lexer.mll"
            ( INFIXOP3(lexeme_operator lexbuf) )
# 2963 "src/reason-parser/reason_lexer.ml"

  | 102 ->
# 660 "src/reason-parser/reason_lexer.mll"
        ( EOF )
# 2968 "src/reason-parser/reason_lexer.ml"

  | 103 ->
# 662 "src/reason-parser/reason_lexer.mll"
      ( raise (Error(Illegal_character (Lexing.lexeme_char lexbuf 0),
                     Location.curr lexbuf))
      )
# 2975 "src/reason-parser/reason_lexer.ml"

  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf;
      __ocaml_lex_token_rec lexbuf __ocaml_lex_state

and enter_comment lexbuf =
   __ocaml_lex_enter_comment_rec lexbuf 181
and __ocaml_lex_enter_comment_rec lexbuf __ocaml_lex_state =
  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
let
# 667 "src/reason-parser/reason_lexer.mll"
                                line
# 2988 "src/reason-parser/reason_lexer.ml"
= Lexing.sub_lexeme lexbuf (lexbuf.Lexing.lex_start_pos + 2) lexbuf.Lexing.lex_curr_pos in
# 668 "src/reason-parser/reason_lexer.mll"
      ( update_loc lexbuf None 1 false 0;
        let physical_loc = Location.curr lexbuf in
        let location = { physical_loc with
          loc_end = { physical_loc.loc_end with
            (* Don't track trailing `\n` in the location
             * 1| // comment
             * 2| let x = 1;
             * By omitting the `\n` at the end of line 1, the location of the
             * comment spans line 1. Otherwise the comment on line 1 would end
             * on the second line. The printer looks at the closing pos_lnum
             * location to interleave whitespace correct. It needs to align
             * with what we visually see (i.e. it ends on line 1) *)
            pos_lnum = physical_loc.loc_end.pos_lnum - 1;
            pos_cnum = physical_loc.loc_end.pos_cnum + 1;
        }} in
        COMMENT (line, location)
      )
# 3008 "src/reason-parser/reason_lexer.ml"

  | 1 ->
let
# 685 "src/reason-parser/reason_lexer.mll"
                            line
# 3014 "src/reason-parser/reason_lexer.ml"
= Lexing.sub_lexeme lexbuf (lexbuf.Lexing.lex_start_pos + 2) lexbuf.Lexing.lex_curr_pos in
# 686 "src/reason-parser/reason_lexer.mll"
      ( update_loc lexbuf None 1 false 0;
        let physical_loc = Location.curr lexbuf in
        let location = { physical_loc with
          loc_end = { physical_loc.loc_end with
            pos_lnum = physical_loc.loc_end.pos_lnum - 1;
            pos_cnum = physical_loc.loc_end.pos_cnum + 1;
        }} in
        COMMENT (line, location)
      )
# 3026 "src/reason-parser/reason_lexer.ml"

  | 2 ->
# 696 "src/reason-parser/reason_lexer.mll"
      ( set_lexeme_length lexbuf 2;
        let start_loc = Location.curr lexbuf  in
        comment_start_loc := [start_loc];
        reset_string_buffer ();
        let {Location. loc_end; _} = comment lexbuf in
        let s, _ = get_stored_string () in
        reset_string_buffer ();
        COMMENT (s, { start_loc with Location.loc_end })
      )
# 3039 "src/reason-parser/reason_lexer.ml"

  | 3 ->
# 706 "src/reason-parser/reason_lexer.mll"
      ( let start_p = lexbuf.Lexing.lex_start_p in
        let start_loc = Location.curr lexbuf in
        comment_start_loc := [start_loc];
        reset_string_buffer ();
        let _ = comment lexbuf in
        let s, _ = get_stored_string () in
        reset_string_buffer ();
        lexbuf.Lexing.lex_start_p <- start_p;
        DOCSTRING s
      )
# 3053 "src/reason-parser/reason_lexer.ml"

  | 4 ->
# 717 "src/reason-parser/reason_lexer.mll"
      ( DOCSTRING "" )
# 3058 "src/reason-parser/reason_lexer.ml"

  | 5 ->
# 719 "src/reason-parser/reason_lexer.mll"
      ( let loc = Location.curr lexbuf  in
        if !print_warnings then
          Location.prerr_warning loc Warnings.Comment_start;
        comment_start_loc := [loc];
        reset_string_buffer ();
        let {Location. loc_end; _} = comment lexbuf in
        let s, _ = get_stored_string () in
        reset_string_buffer ();
        COMMENT (s, { loc with Location.loc_end })
      )
# 3072 "src/reason-parser/reason_lexer.ml"

  | 6 ->
# 730 "src/reason-parser/reason_lexer.mll"
      ( let loc = Location.curr lexbuf in
        Location.prerr_warning loc Warnings.Comment_not_end;
        set_lexeme_length lexbuf 1;
        STAR
      )
# 3081 "src/reason-parser/reason_lexer.ml"

  | 7 ->
# 735 "src/reason-parser/reason_lexer.mll"
      ( assert false )
# 3086 "src/reason-parser/reason_lexer.ml"

  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf;
      __ocaml_lex_enter_comment_rec lexbuf __ocaml_lex_state

and comment lexbuf =
   __ocaml_lex_comment_rec lexbuf 194
and __ocaml_lex_comment_rec lexbuf __ocaml_lex_state =
  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
# 739 "src/reason-parser/reason_lexer.mll"
      ( comment_start_loc := (Location.curr lexbuf) :: !comment_start_loc;
        store_lexeme string_buffer lexbuf;
        comment lexbuf;
      )
# 3101 "src/reason-parser/reason_lexer.ml"

  | 1 ->
# 744 "src/reason-parser/reason_lexer.mll"
      ( match !comment_start_loc with
        | [] -> assert false
        | [_] -> comment_start_loc := []; Location.curr lexbuf
        | _ :: l -> comment_start_loc := l;
                  store_lexeme string_buffer lexbuf;
                  comment lexbuf;
       )
# 3112 "src/reason-parser/reason_lexer.ml"

  | 2 ->
# 752 "src/reason-parser/reason_lexer.mll"
      (
        string_start_loc := Location.curr lexbuf;
        store_string_char '"';
        is_in_string := true;
        begin try string string_buffer lexbuf
        with Error (Unterminated_string, str_start) ->
          match !comment_start_loc with
          | [] -> assert false
          | loc :: _ ->
            let start = List.hd (List.rev !comment_start_loc) in
            comment_start_loc := [];
            raise (Error (Unterminated_string_in_comment (start, str_start),
                          loc))
        end;
        is_in_string := false;
        store_string_char '"';
        comment lexbuf )
# 3133 "src/reason-parser/reason_lexer.ml"

  | 3 ->
# 770 "src/reason-parser/reason_lexer.mll"
      (
        let delim = Lexing.lexeme lexbuf in
        let delim = String.sub delim 1 (String.length delim - 2) in
        string_start_loc := Location.curr lexbuf;
        store_lexeme string_buffer lexbuf;
        is_in_string := true;
        begin try quoted_string delim lexbuf
        with Error (Unterminated_string, str_start) ->
          match !comment_start_loc with
          | [] -> assert false
          | loc :: _ ->
            let start = List.hd (List.rev !comment_start_loc) in
            comment_start_loc := [];
            raise (Error (Unterminated_string_in_comment (start, str_start),
                          loc))
        end;
        is_in_string := false;
        store_string_char '|';
        store_string delim;
        store_string_char '}';
        comment lexbuf )
# 3158 "src/reason-parser/reason_lexer.ml"

  | 4 ->
# 793 "src/reason-parser/reason_lexer.mll"
      ( store_lexeme string_buffer lexbuf; comment lexbuf )
# 3163 "src/reason-parser/reason_lexer.ml"

  | 5 ->
# 795 "src/reason-parser/reason_lexer.mll"
      ( update_loc lexbuf None 1 false 1;
        store_lexeme string_buffer lexbuf;
        comment lexbuf
      )
# 3171 "src/reason-parser/reason_lexer.ml"

  | 6 ->
# 800 "src/reason-parser/reason_lexer.mll"
      ( store_lexeme string_buffer lexbuf; comment lexbuf )
# 3176 "src/reason-parser/reason_lexer.ml"

  | 7 ->
# 802 "src/reason-parser/reason_lexer.mll"
      ( store_lexeme string_buffer lexbuf; comment lexbuf )
# 3181 "src/reason-parser/reason_lexer.ml"

  | 8 ->
# 804 "src/reason-parser/reason_lexer.mll"
      ( store_lexeme string_buffer lexbuf; comment lexbuf )
# 3186 "src/reason-parser/reason_lexer.ml"

  | 9 ->
# 806 "src/reason-parser/reason_lexer.mll"
      ( store_lexeme string_buffer lexbuf; comment lexbuf )
# 3191 "src/reason-parser/reason_lexer.ml"

  | 10 ->
# 808 "src/reason-parser/reason_lexer.mll"
      ( match !comment_start_loc with
        | [] -> assert false
        | loc :: _ ->
          let start = List.hd (List.rev !comment_start_loc) in
          comment_start_loc := [];
          raise (Error (Unterminated_comment start, loc))
      )
# 3202 "src/reason-parser/reason_lexer.ml"

  | 11 ->
# 816 "src/reason-parser/reason_lexer.mll"
      ( update_loc lexbuf None 1 false 0;
        store_lexeme string_buffer lexbuf;
        comment lexbuf
      )
# 3210 "src/reason-parser/reason_lexer.ml"

  | 12 ->
# 821 "src/reason-parser/reason_lexer.mll"
      ( store_lexeme string_buffer lexbuf; comment lexbuf )
# 3215 "src/reason-parser/reason_lexer.ml"

  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf;
      __ocaml_lex_comment_rec lexbuf __ocaml_lex_state

and string rawbuffer lexbuf =
  lexbuf.Lexing.lex_mem <- Array.make 2 (-1); __ocaml_lex_string_rec rawbuffer lexbuf 226
and __ocaml_lex_string_rec rawbuffer lexbuf __ocaml_lex_state =
  match Lexing.new_engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
# 825 "src/reason-parser/reason_lexer.mll"
      ( () )
# 3227 "src/reason-parser/reason_lexer.ml"

  | 1 ->
let
# 826 "src/reason-parser/reason_lexer.mll"
                                  space
# 3233 "src/reason-parser/reason_lexer.ml"
= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_mem.(0) lexbuf.Lexing.lex_curr_pos in
# 827 "src/reason-parser/reason_lexer.mll"
      ( update_loc lexbuf None 1 false (String.length space);
        store_lexeme rawbuffer lexbuf;
        string rawbuffer lexbuf
      )
# 3240 "src/reason-parser/reason_lexer.ml"

  | 2 ->
# 832 "src/reason-parser/reason_lexer.mll"
      ( store_lexeme rawbuffer lexbuf;
        if not (in_comment ()) then
          store_string_char(char_for_backslash(Lexing.lexeme_char lexbuf 1));
        string rawbuffer lexbuf )
# 3248 "src/reason-parser/reason_lexer.ml"

  | 3 ->
# 837 "src/reason-parser/reason_lexer.mll"
      ( store_lexeme rawbuffer lexbuf;
        if not (in_comment ()) then
          store_string_char(char_for_decimal_code lexbuf 1);
        string rawbuffer lexbuf )
# 3256 "src/reason-parser/reason_lexer.ml"

  | 4 ->
# 842 "src/reason-parser/reason_lexer.mll"
      ( store_lexeme rawbuffer lexbuf;
        if not (in_comment ()) then
          store_string_char(char_for_hexadecimal_code lexbuf 2);
        string rawbuffer lexbuf )
# 3264 "src/reason-parser/reason_lexer.ml"

  | 5 ->
# 847 "src/reason-parser/reason_lexer.mll"
      ( store_lexeme rawbuffer lexbuf;
        if not (in_comment ()) then
        begin
(*  Should be an error, but we are very lax.
          raise (Error (Illegal_escape (Lexing.lexeme lexbuf),
                        Location.curr lexbuf))
*)
          let loc = Location.curr lexbuf in
          Location.prerr_warning loc Warnings.Illegal_backslash;
          store_string_char (Lexing.lexeme_char lexbuf 0);
          store_string_char (Lexing.lexeme_char lexbuf 1);
        end;
        string rawbuffer lexbuf
      )
# 3282 "src/reason-parser/reason_lexer.ml"

  | 6 ->
# 862 "src/reason-parser/reason_lexer.mll"
      ( store_lexeme rawbuffer lexbuf;
        if not (in_comment ()) then (
          store_lexeme string_buffer lexbuf;
          Location.prerr_warning (Location.curr lexbuf) Warnings.Eol_in_string
        );
        update_loc lexbuf None 1 false 0;
        string rawbuffer lexbuf
      )
# 3294 "src/reason-parser/reason_lexer.ml"

  | 7 ->
# 871 "src/reason-parser/reason_lexer.mll"
      ( is_in_string := false;
        raise (Error (Unterminated_string, !string_start_loc)) )
# 3300 "src/reason-parser/reason_lexer.ml"

  | 8 ->
# 874 "src/reason-parser/reason_lexer.mll"
      ( store_lexeme rawbuffer lexbuf;
        if not (in_comment ()) then
          store_string_char(Lexing.lexeme_char lexbuf 0);
        string rawbuffer lexbuf )
# 3308 "src/reason-parser/reason_lexer.ml"

  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf;
      __ocaml_lex_string_rec rawbuffer lexbuf __ocaml_lex_state

and quoted_string delim lexbuf =
   __ocaml_lex_quoted_string_rec delim lexbuf 245
and __ocaml_lex_quoted_string_rec delim lexbuf __ocaml_lex_state =
  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
# 881 "src/reason-parser/reason_lexer.mll"
      ( update_loc lexbuf None 1 false 0;
        store_lexeme string_buffer lexbuf;
        quoted_string delim lexbuf
      )
# 3323 "src/reason-parser/reason_lexer.ml"

  | 1 ->
# 886 "src/reason-parser/reason_lexer.mll"
      ( is_in_string := false;
        raise (Error (Unterminated_string, !string_start_loc)) )
# 3329 "src/reason-parser/reason_lexer.ml"

  | 2 ->
# 889 "src/reason-parser/reason_lexer.mll"
      (
        let edelim = Lexing.lexeme lexbuf in
        let edelim = String.sub edelim 1 (String.length edelim - 2) in
        if delim = edelim then ()
        else (store_lexeme string_buffer lexbuf;
              quoted_string delim lexbuf)
      )
# 3340 "src/reason-parser/reason_lexer.ml"

  | 3 ->
# 897 "src/reason-parser/reason_lexer.mll"
      ( store_string_char (Lexing.lexeme_char lexbuf 0);
        quoted_string delim lexbuf )
# 3346 "src/reason-parser/reason_lexer.ml"

  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf;
      __ocaml_lex_quoted_string_rec delim lexbuf __ocaml_lex_state

and skip_sharp_bang lexbuf =
   __ocaml_lex_skip_sharp_bang_rec lexbuf 254
and __ocaml_lex_skip_sharp_bang_rec lexbuf __ocaml_lex_state =
  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
# 902 "src/reason-parser/reason_lexer.mll"
       ( update_loc lexbuf None 3 false 0 )
# 3358 "src/reason-parser/reason_lexer.ml"

  | 1 ->
# 904 "src/reason-parser/reason_lexer.mll"
       ( update_loc lexbuf None 1 false 0 )
# 3363 "src/reason-parser/reason_lexer.ml"

  | 2 ->
# 905 "src/reason-parser/reason_lexer.mll"
       ( () )
# 3368 "src/reason-parser/reason_lexer.ml"

  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf;
      __ocaml_lex_skip_sharp_bang_rec lexbuf __ocaml_lex_state

;;

# 907 "src/reason-parser/reason_lexer.mll"
 

  (* Filter commnets *)

  let token_with_comments lexbuf =
    match !preprocessor with
    | None -> token lexbuf
    | Some (_init, preprocess) -> preprocess token lexbuf

  let last_comments = ref []

  let rec token lexbuf =
    match token_with_comments lexbuf with
        COMMENT (s, comment_loc) ->
          last_comments := (s, comment_loc) :: !last_comments;
          token lexbuf
      | tok -> tok

  let add_invalid_docstring text loc =
    let open Location in
    let rec aux = function
      | ((_, loc') as x) :: xs
        when loc'.loc_start.pos_cnum > loc.loc_start.pos_cnum ->
        x :: aux xs
      | xs -> (text, loc) :: xs
    in
    last_comments := aux !last_comments

  let comments () = List.rev !last_comments

  (* Routines for manipulating lexer state *)

  let save_triple lexbuf tok =
    (tok, lexbuf.lex_start_p, lexbuf.lex_curr_p)

  let load_triple lexbuf (tok, p1, p2) = (
    lexbuf.lex_start_p <- p1;
    lexbuf.lex_curr_p <- p2;
    tok
  )

  let fake_triple t (_, pos, _) =
    (t, pos, pos)

  (* insert ES6_FUN *)

  exception Lex_balanced_failed of (token * position * position) list *
                                   (exn * position * position) option

  let closing_of = function
    | LPAREN -> RPAREN
    | LBRACE -> RBRACE
    | _ -> assert false

  let inject_es6_fun = function
    | tok :: acc ->
      tok :: fake_triple ES6_FUN tok :: acc
    | _ -> assert false

  let is_triggering_token = function
    | EQUALGREATER | COLON -> true
    | _ -> false

  let rec lex_balanced_step closing lexbuf acc tok =
    let acc = save_triple lexbuf tok :: acc in
    match tok, closing with
    | (RPAREN, RPAREN) | (RBRACE, RBRACE) | (RBRACKET, RBRACKET) ->
      acc
    | ((RPAREN | RBRACE | RBRACKET | EOF), _) ->
      raise (Lex_balanced_failed (acc, None))
    | (( LBRACKET | LBRACKETLESS | LBRACKETGREATER
       | LBRACKETAT
       | LBRACKETPERCENT | LBRACKETPERCENTPERCENT ), _) ->
      lex_balanced closing lexbuf (lex_balanced RBRACKET lexbuf acc)
    | ((LPAREN | LBRACE), _) ->
      let rparen =
        try lex_balanced (closing_of tok) lexbuf []
        with (Lex_balanced_failed (rparen, None)) ->
          raise (Lex_balanced_failed (rparen @ acc, None))
      in
      begin match token lexbuf with
      | exception exn ->
        raise (Lex_balanced_failed (rparen @ acc, Some (save_triple lexbuf exn)))
      | tok' ->
        let acc = if is_triggering_token tok' then inject_es6_fun acc else acc in
        lex_balanced_step closing lexbuf (rparen @ acc) tok'
      end
    | ((LIDENT _ | UNDERSCORE), _) ->
      begin match token lexbuf with
      | exception exn ->
        raise (Lex_balanced_failed (acc, Some (save_triple lexbuf exn)))
      | tok' ->
        let acc = if is_triggering_token tok' then inject_es6_fun acc else acc in
        lex_balanced_step closing lexbuf acc tok'
      end
    (* `...` with a closing `}` indicates that we're definitely not in an es6_fun
     * Image the following:
     *    true ? (Update({...a, b: 1}), None) : x;
     *    true ? ({...a, b: 1}) : a;
     *    true ? (a, {...a, b: 1}) : a;
     * The lookahead_esfun is triggered initiating the lex_balanced procedure.
     * Since we now "over"-parse spread operators in pattern position (for
     * better errors), the ... pattern in ({...a, b: 1}) is now a valid path.
     * This means that the above expression `({...a, b: 1}) :` is seen as a pattern.
     * I.e. the arguments of an es6 function: (pattern) :type => expr
     * We exit here, to indicate that an expression needs to be parsed instead
     * of a pattern.
     *)
    | (DOTDOTDOT, RBRACE) -> acc
    | _ -> lex_balanced closing lexbuf acc

  and lex_balanced closing lexbuf acc =
    match token lexbuf with
    | exception exn ->
      raise (Lex_balanced_failed (acc, Some (save_triple lexbuf exn)))
    | tok -> lex_balanced_step closing lexbuf acc tok

  let queued_tokens = ref []
  let queued_exn = ref None

  let lookahead_esfun lexbuf (tok, _, _ as lparen) =
    let triple =
      match lex_balanced (closing_of tok) lexbuf [] with
      | exception (Lex_balanced_failed (tokens, exn)) ->
        queued_tokens := List.rev tokens;
        queued_exn := exn;
        lparen
      | tokens ->
        begin match token lexbuf with
          | exception exn ->
            queued_tokens := List.rev tokens;
            queued_exn := Some (save_triple lexbuf exn);
            lparen
          | token ->
            let tokens = save_triple lexbuf token :: tokens in
            if is_triggering_token token then (
              queued_tokens := lparen :: List.rev tokens;
              fake_triple ES6_FUN lparen
            ) else (
              queued_tokens := List.rev tokens;
              lparen
            )
        end
    in
    load_triple lexbuf triple

  let token lexbuf =
    match !queued_tokens, !queued_exn with
    | [], Some exn ->
      queued_exn := None;
      raise (load_triple lexbuf exn)
    | [(LPAREN, _, _) as lparen], None ->
      let _ = load_triple lexbuf lparen in
      lookahead_esfun lexbuf lparen
    | [(LBRACE, _, _) as lparen], None ->
      let _ = load_triple lexbuf lparen in
      lookahead_esfun lexbuf lparen
    | [], None ->
      begin match token lexbuf with
      | LPAREN | LBRACE as tok ->
          lookahead_esfun lexbuf (save_triple lexbuf tok)
      | (LIDENT _ | UNDERSCORE) as tok ->
          let tok = save_triple lexbuf tok in
          begin match token lexbuf with
          | exception exn ->
              queued_exn := Some (save_triple lexbuf exn);
              load_triple lexbuf tok
          | tok' ->
            if is_triggering_token tok' then (
              queued_tokens := [tok; save_triple lexbuf tok'];
              load_triple lexbuf (fake_triple ES6_FUN tok)
            ) else (
              queued_tokens := [save_triple lexbuf tok'];
              load_triple lexbuf tok
            )
          end
      | token -> token
      end
    | x :: xs, _ -> queued_tokens := xs; load_triple lexbuf x

  let completion_ident_offset = ref min_int
  let completion_ident_pos = ref Lexing.dummy_pos

  let token lexbuf =
    let space_start = lexbuf.Lexing.lex_curr_p.Lexing.pos_cnum in
    let token = token lexbuf in
    let token_start = lexbuf.Lexing.lex_start_p.Lexing.pos_cnum in
    let token_stop = lexbuf.Lexing.lex_curr_p.Lexing.pos_cnum in
    if !completion_ident_offset > min_int &&
       space_start <= !completion_ident_offset &&
       token_stop >= !completion_ident_offset then (
      match token with
      | LIDENT _ | UIDENT _ when token_start <= !completion_ident_offset ->
          completion_ident_offset := min_int;
          token
      | _ ->
        queued_tokens := save_triple lexbuf token :: !queued_tokens;
        completion_ident_offset := min_int;
        load_triple lexbuf
          (LIDENT "_", !completion_ident_pos, !completion_ident_pos)
    ) else
      token

  let init ?insert_completion_ident () =
    is_in_string := false;
    last_comments := [];
    comment_start_loc := [];
    queued_tokens := [];
    queued_exn := None;
    begin match insert_completion_ident with
      | None ->
        completion_ident_offset := min_int;
      | Some pos ->
        completion_ident_offset := pos.Lexing.pos_cnum;
        completion_ident_pos := pos
    end;
    match !preprocessor with
    | None -> ()
    | Some (init, _preprocess) -> init ()

  let set_preprocessor init preprocess =
    preprocessor := Some (init, preprocess)


# 3600 "src/reason-parser/reason_lexer.ml"

end
module Reason_parser_explain_raw
= struct
#1 "reason_parser_explain_raw.ml"
let transitions_on_lident = function
  | 4309
  | 4306
  | 4301
  | 4299
  | 4297
  | 4296
  | 4295
  | 4294
  | 4293
  | 4292
  | 4291
  | 4290
  | 4289
  | 4286
  | 4284
  | 4283
  | 4281
  | 4280
  | 4277
  | 4275
  | 4274
  | 4272
  | 4271
  | 4270
  | 4269
  | 4268
  | 4267
  | 4261
  | 4254
  | 4253
  | 4252
  | 4251
  | 4248
  | 4238
  | 4235
  | 4232
  | 4228
  | 4226
  | 4223
  | 4222
  | 4220
  | 4217
  | 4215
  | 4214
  | 4210
  | 4206
  | 4203
  | 4200
  | 4197
  | 4194
  | 4190
  | 4188
  | 4185
  | 4182
  | 4179
  | 4176
  | 4173
  | 4170
  | 4167
  | 4164
  | 4161
  | 4158
  | 4155
  | 4152
  | 4149
  | 4146
  | 4143
  | 4141
  | 4139
  | 4136
  | 4133
  | 4132
  | 4130
  | 4128
  | 4125
  | 4123
  | 4120
  | 4102
  | 4099
  | 4089
  | 4085
  | 4082
  | 4079
  | 4077
  | 4076
  | 4073
  | 4071
  | 4069
  | 4067
  | 4066
  | 4063
  | 4061
  | 4059
  | 4057
  | 4055
  | 4053
  | 4044
  | 4042
  | 4039
  | 4036
  | 4035
  | 4033
  | 4032
  | 4029
  | 4027
  | 4024
  | 4023
  | 4022
  | 4021
  | 4020
  | 4019
  | 4011
  | 4010
  | 4004
  | 4003
  | 3995
  | 3994
  | 3988
  | 3952
  | 3951
  | 3949
  | 3946
  | 3942
  | 3938
  | 3934
  | 3924
  | 3922
  | 3921
  | 3917
  | 3914
  | 3913
  | 3912
  | 3910
  | 3909
  | 3907
  | 3906
  | 3904
  | 3903
  | 3901
  | 3899
  | 3898
  | 3896
  | 3874
  | 3872
  | 3871
  | 3867
  | 3866
  | 3865
  | 3863
  | 3861
  | 3860
  | 3859
  | 3853
  | 3848
  | 3846
  | 3841
  | 3839
  | 3833
  | 3830
  | 3823
  | 3805
  | 3800
  | 3782
  | 3781
  | 3779
  | 3751
  | 3748
  | 3747
  | 3739
  | 3730
  | 3728
  | 3726
  | 3725
  | 3724
  | 3720
  | 3717
  | 3699
  | 3698
  | 3695
  | 3679
  | 3674
  | 3670
  | 3666
  | 3663
  | 3656
  | 3653
  | 3652
  | 3651
  | 3645
  | 3641
  | 3640
  | 3632
  | 3630
  | 3629
  | 3627
  | 3626
  | 3624
  | 3622
  | 3621
  | 3619
  | 3614
  | 3611
  | 3607
  | 3600
  | 3598
  | 3597
  | 3594
  | 3589
  | 3587
  | 3584
  | 3582
  | 3580
  | 3577
  | 3576
  | 3572
  | 3570
  | 3565
  | 3561
  | 3560
  | 3559
  | 3557
  | 3556
  | 3554
  | 3553
  | 3552
  | 3551
  | 3548
  | 3547
  | 3545
  | 3544
  | 3543
  | 3542
  | 3540
  | 3539
  | 3537
  | 3536
  | 3535
  | 3533
  | 3531
  | 3530
  | 3526
  | 3519
  | 3514
  | 3512
  | 3499
  | 3498
  | 3495
  | 3494
  | 3491
  | 3480
  | 3479
  | 3477
  | 3476
  | 3475
  | 3474
  | 3456
  | 3450
  | 3448
  | 3447
  | 3445
  | 3444
  | 3442
  | 3440
  | 3439
  | 3437
  | 3430
  | 3428
  | 3426
  | 3422
  | 3415
  | 3411
  | 3409
  | 3407
  | 3381
  | 3380
  | 3379
  | 3376
  | 3368
  | 3361
  | 3358
  | 3357
  | 3352
  | 3347
  | 3344
  | 3342
  | 3340
  | 3335
  | 3333
  | 3330
  | 3328
  | 3325
  | 3324
  | 3321
  | 3320
  | 3317
  | 3311
  | 3307
  | 3306
  | 3302
  | 3300
  | 3297
  | 3295
  | 3293
  | 3285
  | 3280
  | 3275
  | 3272
  | 3270
  | 3267
  | 3265
  | 3261
  | 3258
  | 3254
  | 3252
  | 3250
  | 3248
  | 3247
  | 3245
  | 3243
  | 3240
  | 3238
  | 3225
  | 3220
  | 3216
  | 3212
  | 3209
  | 3194
  | 3189
  | 3168
  | 3162
  | 3160
  | 3158
  | 3156
  | 3154
  | 3151
  | 3150
  | 3144
  | 3137
  | 3136
  | 3118
  | 3101
  | 3098
  | 3095
  | 3092
  | 3091
  | 3085
  | 3083
  | 3081
  | 3078
  | 3075
  | 3070
  | 3053
  | 3052
  | 3046
  | 3044
  | 3042
  | 3040
  | 3038
  | 3034
  | 3032
  | 3031
  | 3022
  | 3014
  | 3013
  | 2995
  | 2978
  | 2975
  | 2972
  | 2969
  | 2964
  | 2961
  | 2956
  | 2953
  | 2952
  | 2951
  | 2942
  | 2940
  | 2938
  | 2937
  | 2936
  | 2931
  | 2925
  | 2924
  | 2922
  | 2921
  | 2920
  | 2919
  | 2918
  | 2913
  | 2910
  | 2908
  | 2907
  | 2906
  | 2905
  | 2902
  | 2900
  | 2899
  | 2895
  | 2894
  | 2891
  | 2888
  | 2886
  | 2885
  | 2882
  | 2881
  | 2880
  | 2879
  | 2877
  | 2876
  | 2875
  | 2874
  | 2865
  | 2828
  | 2827
  | 2826
  | 2825
  | 2821
  | 2819
  | 2816
  | 2801
  | 2790
  | 2789
  | 2773
  | 2764
  | 2761
  | 2758
  | 2754
  | 2752
  | 2749
  | 2748
  | 2746
  | 2743
  | 2741
  | 2740
  | 2738
  | 2735
  | 2734
  | 2731
  | 2728
  | 2725
  | 2722
  | 2718
  | 2716
  | 2713
  | 2710
  | 2707
  | 2704
  | 2701
  | 2698
  | 2695
  | 2692
  | 2689
  | 2686
  | 2683
  | 2680
  | 2677
  | 2674
  | 2671
  | 2669
  | 2667
  | 2664
  | 2661
  | 2660
  | 2658
  | 2656
  | 2653
  | 2651
  | 2648
  | 2630
  | 2627
  | 2617
  | 2611
  | 2608
  | 2605
  | 2601
  | 2598
  | 2593
  | 2590
  | 2589
  | 2582
  | 2580
  | 2579
  | 2576
  | 2574
  | 2573
  | 2572
  | 2569
  | 2566
  | 2565
  | 2563
  | 2561
  | 2555
  | 2552
  | 2549
  | 2544
  | 2539
  | 2537
  | 2535
  | 2530
  | 2528
  | 2522
  | 2521
  | 2520
  | 2519
  | 2518
  | 2516
  | 2512
  | 2508
  | 2503
  | 2497
  | 2490
  | 2483
  | 2480
  | 2478
  | 2474
  | 2471
  | 2466
  | 2463
  | 2462
  | 2454
  | 2452
  | 2451
  | 2448
  | 2446
  | 2445
  | 2444
  | 2441
  | 2438
  | 2437
  | 2435
  | 2433
  | 2432
  | 2431
  | 2429
  | 2423
  | 2420
  | 2417
  | 2412
  | 2407
  | 2405
  | 2403
  | 2398
  | 2396
  | 2390
  | 2389
  | 2388
  | 2386
  | 2384
  | 2383
  | 2381
  | 2380
  | 2379
  | 2377
  | 2376
  | 2374
  | 2372
  | 2371
  | 2369
  | 2367
  | 2366
  | 2365
  | 2360
  | 2355
  | 2352
  | 2350
  | 2348
  | 2345
  | 2343
  | 2342
  | 2340
  | 2338
  | 2337
  | 2336
  | 2335
  | 2334
  | 2333
  | 2332
  | 2331
  | 2329
  | 2326
  | 2324
  | 2321
  | 2319
  | 2318
  | 2317
  | 2313
  | 2311
  | 2310
  | 2309
  | 2308
  | 2305
  | 2301
  | 2299
  | 2297
  | 2292
  | 2289
  | 2284
  | 2276
  | 2268
  | 2267
  | 2264
  | 2263
  | 2260
  | 2258
  | 2256
  | 2254
  | 2253
  | 2251
  | 2249
  | 2248
  | 2246
  | 2242
  | 2239
  | 2237
  | 2235
  | 2226
  | 2225
  | 2222
  | 2220
  | 2214
  | 2210
  | 2208
  | 2206
  | 2204
  | 2203
  | 2201
  | 2199
  | 2198
  | 2196
  | 2192
  | 2189
  | 2187
  | 2186
  | 2185
  | 2183
  | 2181
  | 2179
  | 2178
  | 2176
  | 2174
  | 2173
  | 2172
  | 2170
  | 2168
  | 2166
  | 2165
  | 2163
  | 2155
  | 2151
  | 2148
  | 2146
  | 2144
  | 2143
  | 2140
  | 2136
  | 2135
  | 2133
  | 2132
  | 2130
  | 2128
  | 2126
  | 2125
  | 2124
  | 2123
  | 2122
  | 2121
  | 2111
  | 2105
  | 2104
  | 2103
  | 2102
  | 2101
  | 2099
  | 2097
  | 2095
  | 2093
  | 2066
  | 2061
  | 2059
  | 2057
  | 2055
  | 2054
  | 2053
  | 2051
  | 2049
  | 2041
  | 2038
  | 2036
  | 2033
  | 2032
  | 2030
  | 2028
  | 2025
  | 2022
  | 2021
  | 2019
  | 2017
  | 2015
  | 2013
  | 2010
  | 2003
  | 2000
  | 1999
  | 1996
  | 1994
  | 1993
  | 1992
  | 1991
  | 1989
  | 1988
  | 1986
  | 1985
  | 1984
  | 1982
  | 1981
  | 1979
  | 1977
  | 1976
  | 1974
  | 1971
  | 1970
  | 1969
  | 1968
  | 1963
  | 1958
  | 1955
  | 1953
  | 1951
  | 1948
  | 1946
  | 1945
  | 1943
  | 1941
  | 1940
  | 1939
  | 1938
  | 1936
  | 1935
  | 1929
  | 1927
  | 1926
  | 1924
  | 1923
  | 1921
  | 1920
  | 1919
  | 1918
  | 1915
  | 1914
  | 1912
  | 1911
  | 1910
  | 1909
  | 1907
  | 1906
  | 1904
  | 1903
  | 1902
  | 1895
  | 1892
  | 1888
  | 1886
  | 1882
  | 1881
  | 1879
  | 1866
  | 1864
  | 1863
  | 1860
  | 1852
  | 1850
  | 1849
  | 1830
  | 1828
  | 1827
  | 1823
  | 1821
  | 1816
  | 1814
  | 1811
  | 1809
  | 1808
  | 1805
  | 1803
  | 1802
  | 1800
  | 1795
  | 1792
  | 1787
  | 1783
  | 1779
  | 1776
  | 1770
  | 1767
  | 1764
  | 1761
  | 1756
  | 1729
  | 1726
  | 1725
  | 1722
  | 1715
  | 1714
  | 1712
  | 1711
  | 1709
  | 1707
  | 1704
  | 1702
  | 1701
  | 1700
  | 1698
  | 1697
  | 1694
  | 1691
  | 1688
  | 1685
  | 1681
  | 1679
  | 1676
  | 1673
  | 1670
  | 1667
  | 1664
  | 1661
  | 1658
  | 1655
  | 1652
  | 1649
  | 1646
  | 1643
  | 1640
  | 1637
  | 1635
  | 1633
  | 1632
  | 1629
  | 1627
  | 1625
  | 1618
  | 1615
  | 1614
  | 1610
  | 1608
  | 1607
  | 1606
  | 1605
  | 1604
  | 1602
  | 1599
  | 1596
  | 1591
  | 1588
  | 1587
  | 1586
  | 1585
  | 1582
  | 1580
  | 1577
  | 1574
  | 1571
  | 1568
  | 1564
  | 1562
  | 1559
  | 1556
  | 1553
  | 1550
  | 1547
  | 1544
  | 1541
  | 1538
  | 1535
  | 1532
  | 1529
  | 1526
  | 1523
  | 1520
  | 1518
  | 1515
  | 1513
  | 1511
  | 1510
  | 1509
  | 1506
  | 1503
  | 1502
  | 1500
  | 1499
  | 1497
  | 1496
  | 1491
  | 1490
  | 1488
  | 1486
  | 1485
  | 1484
  | 1482
  | 1481
  | 1478
  | 1477
  | 1476
  | 1475
  | 1472
  | 1471
  | 1470
  | 1468
  | 1466
  | 1464
  | 1455
  | 1453
  | 1444
  | 1441
  | 1440
  | 1439
  | 1430
  | 1423
  | 1422
  | 1419
  | 1417
  | 1416
  | 1415
  | 1413
  | 1412
  | 1410
  | 1409
  | 1407
  | 1404
  | 1402
  | 1400
  | 1398
  | 1395
  | 1393
  | 1392
  | 1391
  | 1385
  | 1382
  | 1381
  | 1380
  | 1379
  | 1377
  | 1376
  | 1375
  | 1365
  | 1361
  | 1357
  | 1355
  | 1354
  | 1352
  | 1348
  | 1340
  | 1335
  | 1333
  | 1321
  | 1312
  | 1304
  | 1299
  | 1296
  | 1289
  | 1288
  | 1284
  | 1280
  | 1276
  | 1274
  | 1272
  | 1266
  | 1262
  | 1259
  | 1250
  | 1245
  | 1242
  | 1237
  | 1235
  | 1229
  | 1225
  | 1220
  | 1219
  | 1216
  | 1215
  | 1211
  | 1208
  | 1207
  | 1206
  | 1204
  | 1201
  | 1196
  | 1195
  | 1192
  | 1190
  | 1179
  | 1178
  | 1177
  | 1176
  | 1175
  | 1170
  | 1169
  | 1167
  | 1166
  | 1162
  | 1158
  | 1156
  | 1154
  | 1143
  | 1142
  | 1141
  | 1140
  | 1139
  | 1138
  | 1137
  | 1131
  | 1128
  | 1125
  | 1124
  | 1122
  | 1117
  | 1116
  | 1115
  | 1114
  | 1113
  | 1112
  | 1107
  | 1102
  | 1101
  | 1098
  | 1096
  | 1094
  | 1093
  | 1089
  | 1087
  | 1085
  | 1082
  | 1081
  | 1079
  | 1076
  | 1074
  | 1073
  | 1072
  | 1068
  | 1066
  | 1065
  | 1064
  | 1063
  | 1057
  | 1054
  | 1051
  | 1050
  | 1044
  | 1043
  | 1042
  | 1041
  | 1039
  | 1035
  | 1034
  | 1033
  | 1030
  | 1029
  | 1023
  | 1019
  | 1018
  | 1016
  | 1014
  | 1013
  | 1011
  | 1010
  | 1009
  | 1008
  | 1007
  | 1006
  | 1005
  | 1004
  | 1003
  | 1001
  | 1000
  | 999
  | 998
  | 997
  | 996
  | 995
  | 994
  | 992
  | 991
  | 989
  | 988
  | 986
  | 985
  | 984
  | 983
  | 982
  | 981
  | 980
  | 979
  | 978
  | 977
  | 975
  | 974
  | 971
  | 969
  | 968
  | 967
  | 966
  | 954
  | 951
  | 946
  | 932
  | 929
  | 928
  | 925
  | 924
  | 922
  | 921
  | 915
  | 913
  | 911
  | 909
  | 908
  | 902
  | 896
  | 887
  | 883
  | 881
  | 831
  | 825
  | 821
  | 816
  | 810
  | 804
  | 801
  | 797
  | 795
  | 790
  | 788
  | 787
  | 777
  | 772
  | 770
  | 765
  | 758
  | 757
  | 755
  | 754
  | 753
  | 746
  | 745
  | 742
  | 741
  | 739
  | 731
  | 729
  | 728
  | 727
  | 725
  | 723
  | 701
  | 700
  | 697
  | 696
  | 686
  | 638
  | 623
  | 618
  | 599
  | 590
  | 586
  | 584
  | 579
  | 578
  | 576
  | 548
  | 544
  | 539
  | 538
  | 536
  | 529
  | 521
  | 513
  | 510
  | 508
  | 506
  | 504
  | 503
  | 501
  | 500
  | 494
  | 481
  | 475
  | 468
  | 457
  | 456
  | 451
  | 447
  | 445
  | 437
  | 434
  | 432
  | 425
  | 421
  | 417
  | 412
  | 411
  | 404
  | 400
  | 399
  | 397
  | 393
  | 391
  | 390
  | 385
  | 382
  | 375
  | 374
  | 372
  | 371
  | 370
  | 369
  | 365
  | 363
  | 362
  | 360
  | 357
  | 356
  | 355
  | 354
  | 353
  | 351
  | 345
  | 344
  | 342
  | 341
  | 340
  | 339
  | 338
  | 337
  | 336
  | 331
  | 329
  | 327
  | 326
  | 325
  | 324
  | 323
  | 322
  | 321
  | 320
  | 319
  | 318
  | 317
  | 316
  | 308
  | 304
  | 303
  | 300
  | 299
  | 298
  | 297
  | 296
  | 295
  | 294
  | 293
  | 291
  | 288
  | 287
  | 286
  | 285
  | 284
  | 283
  | 282
  | 281
  | 280
  | 279
  | 278
  | 277
  | 275
  | 274
  | 272
  | 271
  | 270
  | 269
  | 265
  | 264
  | 263
  | 262
  | 260
  | 259
  | 258
  | 256
  | 255
  | 253
  | 251
  | 250
  | 249
  | 248
  | 247
  | 246
  | 244
  | 242
  | 240
  | 239
  | 237
  | 236
  | 234
  | 232
  | 229
  | 218
  | 214
  | 210
  | 209
  | 208
  | 207
  | 205
  | 201
  | 198
  | 196
  | 192
  | 188
  | 187
  | 186
  | 185
  | 184
  | 183
  | 182
  | 181
  | 180
  | 179
  | 178
  | 177
  | 176
  | 175
  | 174
  | 173
  | 172
  | 171
  | 170
  | 169
  | 168
  | 167
  | 166
  | 165
  | 164
  | 163
  | 162
  | 161
  | 160
  | 159
  | 158
  | 157
  | 156
  | 155
  | 154
  | 153
  | 152
  | 151
  | 150
  | 149
  | 148
  | 147
  | 146
  | 145
  | 144
  | 143
  | 142
  | 141
  | 140
  | 139
  | 138
  | 137
  | 136
  | 135
  | 134
  | 133
  | 132
  | 131
  | 129
  | 128
  | 127
  | 126
  | 125
  | 124
  | 123
  | 118
  | 117
  | 114
  | 113
  | 112
  | 111
  | 110
  | 109
  | 108
  | 107
  | 104
  | 103
  | 102
  | 101
  | 100
  | 99
  | 97
  | 96
  | 95
  | 94
  | 93
  | 92
  | 91
  | 90
  | 88
  | 87
  | 85
  | 84
  | 83
  | 82
  | 81
  | 80
  | 79
  | 78
  | 75
  | 74
  | 71
  | 70
  | 69
  | 67
  | 65
  | 62
  | 59
  | 57
  | 56
  | 55
  | 54
  | 53
  | 52
  | 51
  | 50
  | 49
  | 48
  | 47
  | 46
  | 45
  | 44
  | 43
  | 42
  | 41
  | 40
  | 39
  | 38
  | 37
  | 36
  | 35
  | 34
  | 33
  | 32
  | 31
  | 30
  | 29
  | 28
  | 27
  | 26
  | 25
  | 24
  | 23
  | 22
  | 21
  | 20
  | 19
  | 18
  | 17
  | 16
  | 15
  | 14
  | 13
  | 12
  | 11
  | 10
  | 9
  | 8
  | 7
  | 6
  | 5
  | 4
  | 3
  | 1
  | 0
      -> true
  | _ -> false

let transitions_on_uident = function
  | 4309
  | 4306
  | 4301
  | 4299
  | 4297
  | 4296
  | 4295
  | 4294
  | 4293
  | 4292
  | 4291
  | 4290
  | 4289
  | 4286
  | 4284
  | 4283
  | 4280
  | 4277
  | 4274
  | 4273
  | 4272
  | 4271
  | 4270
  | 4269
  | 4268
  | 4267
  | 4265
  | 4264
  | 4261
  | 4258
  | 4257
  | 4254
  | 4253
  | 4252
  | 4251
  | 4248
  | 4245
  | 4241
  | 4238
  | 4235
  | 4232
  | 4228
  | 4226
  | 4223
  | 4222
  | 4220
  | 4217
  | 4215
  | 4214
  | 4210
  | 4206
  | 4203
  | 4200
  | 4197
  | 4194
  | 4190
  | 4188
  | 4185
  | 4182
  | 4179
  | 4176
  | 4173
  | 4170
  | 4167
  | 4164
  | 4161
  | 4158
  | 4155
  | 4152
  | 4149
  | 4146
  | 4143
  | 4141
  | 4139
  | 4136
  | 4133
  | 4132
  | 4130
  | 4128
  | 4125
  | 4102
  | 4099
  | 4089
  | 4085
  | 4082
  | 4079
  | 4073
  | 4071
  | 4069
  | 4066
  | 4063
  | 4059
  | 4057
  | 4055
  | 4053
  | 4044
  | 4042
  | 4039
  | 4038
  | 4036
  | 4035
  | 4033
  | 4032
  | 4029
  | 4027
  | 4024
  | 4023
  | 4022
  | 4021
  | 4020
  | 4019
  | 4011
  | 4010
  | 4004
  | 4003
  | 3995
  | 3994
  | 3992
  | 3991
  | 3988
  | 3977
  | 3976
  | 3973
  | 3972
  | 3963
  | 3962
  | 3958
  | 3957
  | 3956
  | 3955
  | 3952
  | 3951
  | 3949
  | 3946
  | 3942
  | 3938
  | 3934
  | 3924
  | 3922
  | 3921
  | 3917
  | 3914
  | 3913
  | 3912
  | 3910
  | 3909
  | 3907
  | 3906
  | 3904
  | 3903
  | 3901
  | 3899
  | 3898
  | 3896
  | 3871
  | 3867
  | 3866
  | 3865
  | 3863
  | 3861
  | 3860
  | 3859
  | 3853
  | 3848
  | 3846
  | 3841
  | 3839
  | 3833
  | 3830
  | 3827
  | 3826
  | 3823
  | 3820
  | 3819
  | 3812
  | 3807
  | 3804
  | 3803
  | 3800
  | 3783
  | 3782
  | 3781
  | 3779
  | 3762
  | 3758
  | 3751
  | 3748
  | 3747
  | 3739
  | 3730
  | 3728
  | 3726
  | 3725
  | 3724
  | 3720
  | 3717
  | 3699
  | 3698
  | 3695
  | 3679
  | 3670
  | 3666
  | 3663
  | 3656
  | 3654
  | 3653
  | 3652
  | 3651
  | 3645
  | 3641
  | 3640
  | 3632
  | 3630
  | 3629
  | 3627
  | 3626
  | 3624
  | 3622
  | 3621
  | 3619
  | 3617
  | 3616
  | 3614
  | 3611
  | 3607
  | 3605
  | 3604
  | 3600
  | 3598
  | 3597
  | 3594
  | 3589
  | 3587
  | 3582
  | 3580
  | 3577
  | 3576
  | 3572
  | 3570
  | 3565
  | 3561
  | 3560
  | 3559
  | 3557
  | 3556
  | 3554
  | 3553
  | 3552
  | 3551
  | 3547
  | 3545
  | 3544
  | 3543
  | 3542
  | 3540
  | 3539
  | 3537
  | 3536
  | 3535
  | 3533
  | 3531
  | 3530
  | 3526
  | 3519
  | 3514
  | 3512
  | 3499
  | 3498
  | 3495
  | 3494
  | 3491
  | 3480
  | 3479
  | 3477
  | 3476
  | 3475
  | 3474
  | 3456
  | 3454
  | 3450
  | 3448
  | 3447
  | 3445
  | 3444
  | 3442
  | 3440
  | 3439
  | 3437
  | 3435
  | 3434
  | 3431
  | 3430
  | 3428
  | 3426
  | 3422
  | 3420
  | 3419
  | 3415
  | 3411
  | 3409
  | 3407
  | 3402
  | 3399
  | 3396
  | 3392
  | 3388
  | 3384
  | 3382
  | 3381
  | 3380
  | 3379
  | 3376
  | 3368
  | 3361
  | 3358
  | 3357
  | 3352
  | 3347
  | 3344
  | 3342
  | 3340
  | 3335
  | 3333
  | 3330
  | 3328
  | 3325
  | 3324
  | 3321
  | 3320
  | 3317
  | 3311
  | 3307
  | 3306
  | 3302
  | 3300
  | 3295
  | 3293
  | 3285
  | 3280
  | 3275
  | 3272
  | 3270
  | 3267
  | 3265
  | 3261
  | 3258
  | 3254
  | 3252
  | 3250
  | 3248
  | 3247
  | 3245
  | 3243
  | 3240
  | 3238
  | 3225
  | 3216
  | 3212
  | 3209
  | 3204
  | 3194
  | 3189
  | 3172
  | 3166
  | 3162
  | 3158
  | 3156
  | 3151
  | 3150
  | 3148
  | 3147
  | 3144
  | 3141
  | 3140
  | 3137
  | 3136
  | 3128
  | 3124
  | 3118
  | 3114
  | 3095
  | 3089
  | 3085
  | 3081
  | 3078
  | 3075
  | 3070
  | 3059
  | 3050
  | 3046
  | 3042
  | 3040
  | 3034
  | 3032
  | 3031
  | 3029
  | 3028
  | 3026
  | 3025
  | 3022
  | 3018
  | 3017
  | 3014
  | 3013
  | 3005
  | 3001
  | 2995
  | 2991
  | 2972
  | 2956
  | 2949
  | 2942
  | 2938
  | 2937
  | 2936
  | 2931
  | 2925
  | 2924
  | 2922
  | 2921
  | 2920
  | 2919
  | 2918
  | 2913
  | 2910
  | 2908
  | 2907
  | 2906
  | 2905
  | 2902
  | 2900
  | 2899
  | 2892
  | 2891
  | 2888
  | 2885
  | 2884
  | 2882
  | 2881
  | 2880
  | 2879
  | 2877
  | 2876
  | 2875
  | 2874
  | 2872
  | 2871
  | 2869
  | 2868
  | 2865
  | 2853
  | 2852
  | 2849
  | 2848
  | 2839
  | 2838
  | 2834
  | 2833
  | 2832
  | 2831
  | 2828
  | 2827
  | 2826
  | 2825
  | 2821
  | 2819
  | 2816
  | 2813
  | 2809
  | 2801
  | 2799
  | 2797
  | 2790
  | 2789
  | 2782
  | 2773
  | 2769
  | 2766
  | 2764
  | 2761
  | 2758
  | 2754
  | 2752
  | 2749
  | 2748
  | 2746
  | 2743
  | 2741
  | 2740
  | 2738
  | 2735
  | 2734
  | 2731
  | 2728
  | 2725
  | 2722
  | 2718
  | 2716
  | 2713
  | 2710
  | 2707
  | 2704
  | 2701
  | 2698
  | 2695
  | 2692
  | 2689
  | 2686
  | 2683
  | 2680
  | 2677
  | 2674
  | 2671
  | 2669
  | 2667
  | 2664
  | 2661
  | 2660
  | 2658
  | 2656
  | 2653
  | 2630
  | 2627
  | 2617
  | 2611
  | 2608
  | 2605
  | 2601
  | 2598
  | 2590
  | 2589
  | 2582
  | 2579
  | 2576
  | 2569
  | 2566
  | 2565
  | 2563
  | 2555
  | 2549
  | 2544
  | 2539
  | 2537
  | 2535
  | 2530
  | 2528
  | 2522
  | 2521
  | 2520
  | 2519
  | 2518
  | 2516
  | 2512
  | 2508
  | 2503
  | 2497
  | 2490
  | 2483
  | 2480
  | 2478
  | 2474
  | 2471
  | 2463
  | 2462
  | 2454
  | 2451
  | 2448
  | 2441
  | 2438
  | 2437
  | 2435
  | 2433
  | 2432
  | 2431
  | 2423
  | 2417
  | 2412
  | 2407
  | 2405
  | 2403
  | 2398
  | 2396
  | 2390
  | 2389
  | 2388
  | 2386
  | 2384
  | 2383
  | 2381
  | 2380
  | 2379
  | 2377
  | 2376
  | 2374
  | 2372
  | 2371
  | 2369
  | 2366
  | 2365
  | 2360
  | 2355
  | 2352
  | 2350
  | 2348
  | 2345
  | 2343
  | 2342
  | 2340
  | 2338
  | 2337
  | 2336
  | 2335
  | 2334
  | 2333
  | 2329
  | 2326
  | 2321
  | 2313
  | 2308
  | 2305
  | 2301
  | 2299
  | 2284
  | 2276
  | 2268
  | 2267
  | 2264
  | 2263
  | 2260
  | 2258
  | 2256
  | 2251
  | 2242
  | 2239
  | 2237
  | 2235
  | 2226
  | 2225
  | 2222
  | 2220
  | 2214
  | 2210
  | 2208
  | 2206
  | 2201
  | 2192
  | 2189
  | 2187
  | 2186
  | 2185
  | 2183
  | 2181
  | 2176
  | 2172
  | 2170
  | 2165
  | 2163
  | 2155
  | 2151
  | 2148
  | 2146
  | 2140
  | 2136
  | 2135
  | 2130
  | 2121
  | 2111
  | 2101
  | 2099
  | 2097
  | 2095
  | 2088
  | 2085
  | 2082
  | 2078
  | 2074
  | 2070
  | 2068
  | 2066
  | 2061
  | 2057
  | 2055
  | 2054
  | 2053
  | 2051
  | 2049
  | 2041
  | 2038
  | 2036
  | 2033
  | 2032
  | 2030
  | 2028
  | 2025
  | 2022
  | 2021
  | 2019
  | 2017
  | 2015
  | 2013
  | 2010
  | 2009
  | 2008
  | 2003
  | 2000
  | 1999
  | 1996
  | 1994
  | 1993
  | 1992
  | 1991
  | 1989
  | 1988
  | 1986
  | 1985
  | 1984
  | 1982
  | 1981
  | 1979
  | 1977
  | 1976
  | 1974
  | 1969
  | 1968
  | 1963
  | 1958
  | 1955
  | 1953
  | 1951
  | 1948
  | 1946
  | 1945
  | 1943
  | 1941
  | 1940
  | 1939
  | 1938
  | 1936
  | 1935
  | 1929
  | 1927
  | 1926
  | 1924
  | 1923
  | 1921
  | 1920
  | 1919
  | 1918
  | 1914
  | 1912
  | 1911
  | 1910
  | 1909
  | 1907
  | 1906
  | 1904
  | 1903
  | 1902
  | 1895
  | 1892
  | 1888
  | 1886
  | 1882
  | 1881
  | 1879
  | 1866
  | 1864
  | 1863
  | 1860
  | 1852
  | 1850
  | 1849
  | 1830
  | 1828
  | 1827
  | 1823
  | 1821
  | 1816
  | 1814
  | 1811
  | 1809
  | 1808
  | 1805
  | 1803
  | 1802
  | 1800
  | 1795
  | 1792
  | 1783
  | 1779
  | 1776
  | 1770
  | 1767
  | 1764
  | 1761
  | 1756
  | 1749
  | 1745
  | 1741
  | 1739
  | 1735
  | 1733
  | 1731
  | 1729
  | 1726
  | 1725
  | 1722
  | 1715
  | 1714
  | 1712
  | 1711
  | 1709
  | 1707
  | 1704
  | 1702
  | 1701
  | 1700
  | 1698
  | 1697
  | 1694
  | 1691
  | 1688
  | 1685
  | 1681
  | 1679
  | 1676
  | 1673
  | 1670
  | 1667
  | 1664
  | 1661
  | 1658
  | 1655
  | 1652
  | 1649
  | 1646
  | 1643
  | 1640
  | 1637
  | 1635
  | 1633
  | 1632
  | 1629
  | 1627
  | 1625
  | 1618
  | 1615
  | 1614
  | 1610
  | 1608
  | 1607
  | 1606
  | 1605
  | 1602
  | 1599
  | 1596
  | 1591
  | 1589
  | 1588
  | 1587
  | 1586
  | 1585
  | 1582
  | 1580
  | 1577
  | 1574
  | 1571
  | 1568
  | 1564
  | 1562
  | 1559
  | 1556
  | 1553
  | 1550
  | 1547
  | 1544
  | 1541
  | 1538
  | 1535
  | 1532
  | 1529
  | 1526
  | 1523
  | 1520
  | 1518
  | 1515
  | 1513
  | 1511
  | 1510
  | 1509
  | 1506
  | 1503
  | 1502
  | 1500
  | 1499
  | 1497
  | 1496
  | 1491
  | 1490
  | 1486
  | 1485
  | 1484
  | 1482
  | 1481
  | 1479
  | 1478
  | 1477
  | 1476
  | 1475
  | 1472
  | 1471
  | 1470
  | 1468
  | 1464
  | 1462
  | 1459
  | 1455
  | 1453
  | 1444
  | 1442
  | 1441
  | 1440
  | 1439
  | 1430
  | 1423
  | 1422
  | 1419
  | 1417
  | 1416
  | 1415
  | 1412
  | 1410
  | 1409
  | 1407
  | 1404
  | 1402
  | 1400
  | 1398
  | 1395
  | 1393
  | 1392
  | 1391
  | 1385
  | 1382
  | 1381
  | 1380
  | 1377
  | 1376
  | 1375
  | 1365
  | 1361
  | 1357
  | 1354
  | 1352
  | 1348
  | 1340
  | 1335
  | 1333
  | 1312
  | 1304
  | 1299
  | 1296
  | 1289
  | 1288
  | 1284
  | 1280
  | 1274
  | 1272
  | 1266
  | 1262
  | 1259
  | 1250
  | 1245
  | 1242
  | 1235
  | 1229
  | 1225
  | 1220
  | 1219
  | 1216
  | 1215
  | 1211
  | 1208
  | 1207
  | 1206
  | 1204
  | 1201
  | 1200
  | 1196
  | 1195
  | 1192
  | 1191
  | 1190
  | 1179
  | 1178
  | 1177
  | 1176
  | 1175
  | 1174
  | 1170
  | 1169
  | 1167
  | 1166
  | 1162
  | 1158
  | 1156
  | 1155
  | 1154
  | 1143
  | 1142
  | 1141
  | 1140
  | 1139
  | 1138
  | 1137
  | 1131
  | 1128
  | 1125
  | 1124
  | 1122
  | 1117
  | 1116
  | 1115
  | 1114
  | 1113
  | 1112
  | 1108
  | 1107
  | 1102
  | 1101
  | 1099
  | 1098
  | 1093
  | 1089
  | 1087
  | 1085
  | 1082
  | 1081
  | 1076
  | 1068
  | 1063
  | 1051
  | 1050
  | 1044
  | 1043
  | 1042
  | 1041
  | 1039
  | 1035
  | 1034
  | 1033
  | 1030
  | 1029
  | 1023
  | 1019
  | 1018
  | 1016
  | 1014
  | 1013
  | 1011
  | 1010
  | 1009
  | 1008
  | 1007
  | 1006
  | 1005
  | 1004
  | 1003
  | 1001
  | 1000
  | 999
  | 998
  | 997
  | 996
  | 995
  | 994
  | 992
  | 991
  | 989
  | 988
  | 986
  | 985
  | 984
  | 983
  | 982
  | 981
  | 980
  | 979
  | 978
  | 977
  | 975
  | 974
  | 971
  | 969
  | 968
  | 967
  | 966
  | 965
  | 959
  | 954
  | 951
  | 946
  | 939
  | 936
  | 934
  | 932
  | 929
  | 928
  | 925
  | 924
  | 922
  | 921
  | 915
  | 913
  | 911
  | 909
  | 908
  | 906
  | 905
  | 902
  | 896
  | 887
  | 883
  | 881
  | 870
  | 869
  | 866
  | 865
  | 856
  | 855
  | 851
  | 850
  | 831
  | 825
  | 821
  | 816
  | 810
  | 804
  | 801
  | 797
  | 795
  | 790
  | 788
  | 787
  | 765
  | 763
  | 762
  | 758
  | 757
  | 755
  | 754
  | 753
  | 750
  | 746
  | 745
  | 742
  | 741
  | 739
  | 731
  | 729
  | 728
  | 727
  | 725
  | 723
  | 701
  | 697
  | 696
  | 695
  | 693
  | 692
  | 690
  | 689
  | 686
  | 674
  | 673
  | 670
  | 669
  | 660
  | 659
  | 655
  | 654
  | 639
  | 638
  | 637
  | 630
  | 625
  | 622
  | 621
  | 618
  | 599
  | 590
  | 586
  | 584
  | 580
  | 579
  | 578
  | 576
  | 559
  | 555
  | 548
  | 544
  | 539
  | 538
  | 536
  | 529
  | 521
  | 510
  | 506
  | 494
  | 481
  | 475
  | 468
  | 457
  | 456
  | 437
  | 434
  | 425
  | 421
  | 417
  | 412
  | 411
  | 404
  | 400
  | 399
  | 397
  | 393
  | 391
  | 390
  | 385
  | 382
  | 375
  | 374
  | 371
  | 370
  | 369
  | 365
  | 363
  | 362
  | 357
  | 356
  | 355
  | 354
  | 353
  | 351
  | 347
  | 345
  | 344
  | 342
  | 341
  | 340
  | 339
  | 338
  | 337
  | 336
  | 335
  | 334
  | 332
  | 331
  | 330
  | 329
  | 328
  | 327
  | 326
  | 325
  | 324
  | 323
  | 322
  | 321
  | 320
  | 319
  | 318
  | 317
  | 316
  | 308
  | 303
  | 302
  | 300
  | 299
  | 298
  | 297
  | 296
  | 295
  | 294
  | 293
  | 291
  | 288
  | 287
  | 286
  | 285
  | 284
  | 283
  | 282
  | 281
  | 280
  | 279
  | 278
  | 277
  | 274
  | 272
  | 271
  | 270
  | 269
  | 265
  | 264
  | 263
  | 262
  | 260
  | 259
  | 258
  | 255
  | 252
  | 251
  | 250
  | 249
  | 248
  | 247
  | 246
  | 244
  | 242
  | 240
  | 239
  | 237
  | 236
  | 232
  | 229
  | 218
  | 214
  | 210
  | 209
  | 208
  | 202
  | 199
  | 197
  | 195
  | 193
  | 190
  | 188
  | 187
  | 186
  | 185
  | 184
  | 183
  | 182
  | 181
  | 180
  | 179
  | 178
  | 177
  | 176
  | 175
  | 174
  | 173
  | 172
  | 171
  | 170
  | 169
  | 168
  | 167
  | 166
  | 165
  | 164
  | 163
  | 162
  | 161
  | 160
  | 159
  | 158
  | 157
  | 156
  | 155
  | 154
  | 153
  | 152
  | 151
  | 150
  | 149
  | 148
  | 147
  | 146
  | 145
  | 144
  | 143
  | 142
  | 141
  | 140
  | 139
  | 138
  | 137
  | 136
  | 135
  | 134
  | 133
  | 132
  | 131
  | 130
  | 129
  | 128
  | 127
  | 126
  | 125
  | 124
  | 123
  | 122
  | 121
  | 118
  | 117
  | 114
  | 113
  | 112
  | 111
  | 110
  | 109
  | 108
  | 107
  | 104
  | 103
  | 102
  | 101
  | 100
  | 99
  | 93
  | 92
  | 91
  | 90
  | 88
  | 87
  | 85
  | 84
  | 83
  | 82
  | 81
  | 80
  | 79
  | 78
  | 75
  | 74
  | 71
  | 70
  | 69
  | 67
  | 66
  | 65
  | 62
  | 59
  | 57
  | 56
  | 55
  | 54
  | 53
  | 52
  | 51
  | 50
  | 49
  | 48
  | 47
  | 46
  | 45
  | 44
  | 43
  | 42
  | 41
  | 40
  | 39
  | 38
  | 37
  | 36
  | 35
  | 34
  | 33
  | 32
  | 31
  | 30
  | 29
  | 28
  | 27
  | 26
  | 25
  | 24
  | 23
  | 22
  | 21
  | 20
  | 19
  | 18
  | 17
  | 16
  | 15
  | 14
  | 13
  | 12
  | 11
  | 10
  | 9
  | 8
  | 7
  | 6
  | 5
  | 4
  | 3
  | 1
  | 0
      -> true
  | _ -> false

let transitions_on_semi = function
  | 4308
  | 4305
  | 4299
  | 4298
  | 4296
  | 4295
  | 4294
  | 4292
  | 4291
  | 4289
  | 4288
  | 4286
  | 4284
  | 4283
  | 4282
  | 4280
  | 4274
  | 4271
  | 4270
  | 4266
  | 4259
  | 4256
  | 4255
  | 4253
  | 4252
  | 4251
  | 4250
  | 4249
  | 4248
  | 4247
  | 4243
  | 4240
  | 4238
  | 4236
  | 4234
  | 4233
  | 4231
  | 4227
  | 4225
  | 4221
  | 4219
  | 4216
  | 4215
  | 4214
  | 4212
  | 4211
  | 4208
  | 4206
  | 4205
  | 4204
  | 4202
  | 4201
  | 4199
  | 4198
  | 4196
  | 4195
  | 4193
  | 4192
  | 4191
  | 4189
  | 4187
  | 4186
  | 4184
  | 4183
  | 4181
  | 4180
  | 4178
  | 4177
  | 4175
  | 4174
  | 4172
  | 4171
  | 4169
  | 4168
  | 4166
  | 4165
  | 4163
  | 4162
  | 4160
  | 4159
  | 4157
  | 4156
  | 4154
  | 4153
  | 4151
  | 4150
  | 4148
  | 4147
  | 4145
  | 4144
  | 4142
  | 4138
  | 4137
  | 4135
  | 4134
  | 4132
  | 4131
  | 4129
  | 4127
  | 4126
  | 4125
  | 4124
  | 4121
  | 4119
  | 4118
  | 4117
  | 4113
  | 4112
  | 4108
  | 4104
  | 4101
  | 4095
  | 4091
  | 4088
  | 4087
  | 4086
  | 4084
  | 4082
  | 4074
  | 4070
  | 4066
  | 4060
  | 4050
  | 4049
  | 4048
  | 4045
  | 4043
  | 4039
  | 4037
  | 4034
  | 4032
  | 4031
  | 4023
  | 4022
  | 4018
  | 4017
  | 4016
  | 4015
  | 4014
  | 4013
  | 4012
  | 4011
  | 4009
  | 4002
  | 3998
  | 3993
  | 3986
  | 3985
  | 3984
  | 3983
  | 3982
  | 3981
  | 3980
  | 3979
  | 3978
  | 3974
  | 3971
  | 3970
  | 3969
  | 3968
  | 3967
  | 3966
  | 3965
  | 3964
  | 3960
  | 3959
  | 3954
  | 3953
  | 3951
  | 3950
  | 3923
  | 3915
  | 3913
  | 3912
  | 3910
  | 3909
  | 3907
  | 3906
  | 3904
  | 3903
  | 3901
  | 3899
  | 3897
  | 3895
  | 3894
  | 3890
  | 3883
  | 3871
  | 3870
  | 3869
  | 3867
  | 3866
  | 3865
  | 3863
  | 3861
  | 3859
  | 3857
  | 3855
  | 3852
  | 3850
  | 3849
  | 3847
  | 3845
  | 3843
  | 3836
  | 3834
  | 3832
  | 3830
  | 3828
  | 3821
  | 3818
  | 3817
  | 3816
  | 3815
  | 3814
  | 3813
  | 3811
  | 3810
  | 3809
  | 3808
  | 3806
  | 3802
  | 3801
  | 3799
  | 3798
  | 3797
  | 3796
  | 3795
  | 3794
  | 3793
  | 3792
  | 3791
  | 3790
  | 3788
  | 3787
  | 3786
  | 3785
  | 3784
  | 3780
  | 3778
  | 3777
  | 3776
  | 3775
  | 3774
  | 3773
  | 3772
  | 3771
  | 3769
  | 3768
  | 3766
  | 3765
  | 3764
  | 3763
  | 3759
  | 3757
  | 3756
  | 3755
  | 3754
  | 3753
  | 3752
  | 3750
  | 3749
  | 3746
  | 3745
  | 3744
  | 3742
  | 3739
  | 3737
  | 3733
  | 3730
  | 3728
  | 3726
  | 3724
  | 3720
  | 3717
  | 3714
  | 3710
  | 3704
  | 3699
  | 3698
  | 3695
  | 3693
  | 3692
  | 3651
  | 3638
  | 3632
  | 3630
  | 3629
  | 3627
  | 3626
  | 3622
  | 3621
  | 3618
  | 3610
  | 3606
  | 3599
  | 3580
  | 3577
  | 3576
  | 3574
  | 3560
  | 3559
  | 3557
  | 3556
  | 3554
  | 3552
  | 3551
  | 3547
  | 3545
  | 3543
  | 3542
  | 3539
  | 3536
  | 3535
  | 3533
  | 3531
  | 3528
  | 3526
  | 3524
  | 3522
  | 3517
  | 3516
  | 3508
  | 3507
  | 3505
  | 3504
  | 3503
  | 3501
  | 3496
  | 3495
  | 3494
  | 3491
  | 3481
  | 3479
  | 3477
  | 3476
  | 3474
  | 3473
  | 3472
  | 3471
  | 3469
  | 3468
  | 3466
  | 3465
  | 3463
  | 3462
  | 3460
  | 3459
  | 3458
  | 3455
  | 3450
  | 3448
  | 3447
  | 3445
  | 3444
  | 3440
  | 3439
  | 3436
  | 3432
  | 3425
  | 3421
  | 3414
  | 3413
  | 3410
  | 3408
  | 3406
  | 3405
  | 3404
  | 3403
  | 3401
  | 3400
  | 3398
  | 3397
  | 3395
  | 3393
  | 3391
  | 3389
  | 3387
  | 3386
  | 3383
  | 3380
  | 3378
  | 3377
  | 3374
  | 3373
  | 3371
  | 3366
  | 3365
  | 3364
  | 3363
  | 3362
  | 3357
  | 3352
  | 3347
  | 3343
  | 3342
  | 3341
  | 3336
  | 3331
  | 3327
  | 3326
  | 3325
  | 3324
  | 3320
  | 3318
  | 3316
  | 3315
  | 3314
  | 3310
  | 3309
  | 3305
  | 3304
  | 3301
  | 3299
  | 3298
  | 3296
  | 3294
  | 3292
  | 3291
  | 3290
  | 3288
  | 3287
  | 3286
  | 3285
  | 3280
  | 3275
  | 3271
  | 3270
  | 3269
  | 3268
  | 3263
  | 3262
  | 3260
  | 3259
  | 3257
  | 3253
  | 3251
  | 3250
  | 3246
  | 3244
  | 3243
  | 3241
  | 3237
  | 3236
  | 3235
  | 3234
  | 3233
  | 3232
  | 3231
  | 3229
  | 3228
  | 3226
  | 3224
  | 3223
  | 3219
  | 3217
  | 3215
  | 3214
  | 3211
  | 3208
  | 3207
  | 3205
  | 3199
  | 3188
  | 3186
  | 3184
  | 3183
  | 3181
  | 3180
  | 3179
  | 3178
  | 3177
  | 3176
  | 3174
  | 3173
  | 3170
  | 3169
  | 3167
  | 3165
  | 3159
  | 3157
  | 3153
  | 3152
  | 3149
  | 3142
  | 3139
  | 3138
  | 3136
  | 3135
  | 3134
  | 3133
  | 3132
  | 3131
  | 3130
  | 3126
  | 3123
  | 3121
  | 3120
  | 3119
  | 3116
  | 3115
  | 3112
  | 3111
  | 3109
  | 3107
  | 3106
  | 3105
  | 3104
  | 3103
  | 3102
  | 3099
  | 3097
  | 3096
  | 3090
  | 3088
  | 3082
  | 3080
  | 3078
  | 3072
  | 3070
  | 3068
  | 3067
  | 3066
  | 3065
  | 3064
  | 3063
  | 3061
  | 3060
  | 3057
  | 3056
  | 3055
  | 3054
  | 3051
  | 3049
  | 3043
  | 3041
  | 3037
  | 3036
  | 3035
  | 3033
  | 3030
  | 3027
  | 3020
  | 3019
  | 3016
  | 3015
  | 3013
  | 3012
  | 3011
  | 3010
  | 3009
  | 3008
  | 3007
  | 3003
  | 3000
  | 2998
  | 2997
  | 2996
  | 2993
  | 2992
  | 2989
  | 2988
  | 2986
  | 2984
  | 2983
  | 2982
  | 2981
  | 2980
  | 2979
  | 2976
  | 2974
  | 2973
  | 2968
  | 2967
  | 2966
  | 2965
  | 2962
  | 2960
  | 2959
  | 2958
  | 2957
  | 2950
  | 2948
  | 2947
  | 2946
  | 2945
  | 2939
  | 2936
  | 2935
  | 2933
  | 2930
  | 2928
  | 2924
  | 2923
  | 2921
  | 2920
  | 2919
  | 2917
  | 2916
  | 2915
  | 2914
  | 2911
  | 2909
  | 2908
  | 2907
  | 2905
  | 2904
  | 2902
  | 2900
  | 2899
  | 2898
  | 2897
  | 2896
  | 2893
  | 2891
  | 2885
  | 2883
  | 2879
  | 2878
  | 2877
  | 2873
  | 2870
  | 2863
  | 2862
  | 2861
  | 2860
  | 2859
  | 2858
  | 2857
  | 2856
  | 2855
  | 2854
  | 2850
  | 2847
  | 2846
  | 2845
  | 2844
  | 2843
  | 2842
  | 2841
  | 2840
  | 2836
  | 2835
  | 2830
  | 2829
  | 2827
  | 2826
  | 2825
  | 2818
  | 2817
  | 2816
  | 2815
  | 2811
  | 2808
  | 2805
  | 2804
  | 2803
  | 2800
  | 2798
  | 2792
  | 2786
  | 2780
  | 2779
  | 2776
  | 2775
  | 2772
  | 2768
  | 2767
  | 2764
  | 2762
  | 2760
  | 2759
  | 2757
  | 2753
  | 2751
  | 2747
  | 2745
  | 2742
  | 2741
  | 2740
  | 2737
  | 2736
  | 2734
  | 2733
  | 2732
  | 2730
  | 2729
  | 2727
  | 2726
  | 2724
  | 2723
  | 2721
  | 2720
  | 2719
  | 2717
  | 2715
  | 2714
  | 2712
  | 2711
  | 2709
  | 2708
  | 2706
  | 2705
  | 2703
  | 2702
  | 2700
  | 2699
  | 2697
  | 2696
  | 2694
  | 2693
  | 2691
  | 2690
  | 2688
  | 2687
  | 2685
  | 2684
  | 2682
  | 2681
  | 2679
  | 2678
  | 2676
  | 2675
  | 2673
  | 2672
  | 2670
  | 2666
  | 2665
  | 2663
  | 2662
  | 2660
  | 2659
  | 2657
  | 2655
  | 2654
  | 2653
  | 2652
  | 2649
  | 2647
  | 2646
  | 2645
  | 2641
  | 2640
  | 2636
  | 2632
  | 2629
  | 2623
  | 2619
  | 2614
  | 2613
  | 2612
  | 2610
  | 2608
  | 2605
  | 2604
  | 2603
  | 2601
  | 2600
  | 2599
  | 2595
  | 2594
  | 2592
  | 2591
  | 2590
  | 2589
  | 2588
  | 2587
  | 2586
  | 2584
  | 2577
  | 2571
  | 2570
  | 2568
  | 2567
  | 2564
  | 2562
  | 2560
  | 2556
  | 2554
  | 2553
  | 2551
  | 2550
  | 2545
  | 2540
  | 2536
  | 2534
  | 2533
  | 2532
  | 2531
  | 2526
  | 2525
  | 2524
  | 2523
  | 2519
  | 2518
  | 2517
  | 2515
  | 2514
  | 2512
  | 2511
  | 2510
  | 2507
  | 2506
  | 2504
  | 2501
  | 2500
  | 2498
  | 2496
  | 2495
  | 2493
  | 2492
  | 2490
  | 2487
  | 2486
  | 2485
  | 2484
  | 2481
  | 2479
  | 2478
  | 2477
  | 2476
  | 2474
  | 2473
  | 2472
  | 2468
  | 2467
  | 2465
  | 2464
  | 2463
  | 2462
  | 2461
  | 2460
  | 2459
  | 2456
  | 2449
  | 2443
  | 2442
  | 2440
  | 2439
  | 2436
  | 2434
  | 2430
  | 2428
  | 2424
  | 2422
  | 2421
  | 2419
  | 2418
  | 2413
  | 2408
  | 2404
  | 2402
  | 2401
  | 2400
  | 2399
  | 2394
  | 2393
  | 2392
  | 2391
  | 2387
  | 2385
  | 2384
  | 2381
  | 2380
  | 2377
  | 2372
  | 2365
  | 2360
  | 2355
  | 2351
  | 2350
  | 2349
  | 2343
  | 2335
  | 2330
  | 2327
  | 2323
  | 2322
  | 2316
  | 2315
  | 2314
  | 2308
  | 2306
  | 2302
  | 2296
  | 2295
  | 2294
  | 2293
  | 2290
  | 2288
  | 2287
  | 2286
  | 2285
  | 2283
  | 2282
  | 2280
  | 2278
  | 2276
  | 2275
  | 2274
  | 2273
  | 2270
  | 2268
  | 2267
  | 2266
  | 2265
  | 2264
  | 2263
  | 2262
  | 2261
  | 2259
  | 2257
  | 2252
  | 2247
  | 2245
  | 2243
  | 2241
  | 2240
  | 2235
  | 2234
  | 2233
  | 2230
  | 2228
  | 2227
  | 2226
  | 2225
  | 2224
  | 2223
  | 2221
  | 2219
  | 2218
  | 2217
  | 2216
  | 2213
  | 2212
  | 2211
  | 2207
  | 2202
  | 2197
  | 2195
  | 2193
  | 2191
  | 2190
  | 2186
  | 2185
  | 2184
  | 2182
  | 2177
  | 2172
  | 2171
  | 2167
  | 2165
  | 2164
  | 2162
  | 2161
  | 2160
  | 2159
  | 2154
  | 2153
  | 2152
  | 2149
  | 2147
  | 2142
  | 2141
  | 2138
  | 2137
  | 2131
  | 2127
  | 2121
  | 2101
  | 2100
  | 2096
  | 2092
  | 2091
  | 2090
  | 2089
  | 2087
  | 2086
  | 2084
  | 2083
  | 2081
  | 2079
  | 2077
  | 2075
  | 2073
  | 2072
  | 2069
  | 2067
  | 2066
  | 2065
  | 2064
  | 2058
  | 2046
  | 2045
  | 2044
  | 2043
  | 2042
  | 2031
  | 2029
  | 2024
  | 2018
  | 2014
  | 2012
  | 2007
  | 2006
  | 2002
  | 1998
  | 1995
  | 1990
  | 1989
  | 1986
  | 1985
  | 1982
  | 1977
  | 1968
  | 1963
  | 1958
  | 1954
  | 1953
  | 1952
  | 1946
  | 1937
  | 1935
  | 1934
  | 1933
  | 1931
  | 1927
  | 1926
  | 1924
  | 1923
  | 1921
  | 1919
  | 1918
  | 1914
  | 1912
  | 1910
  | 1909
  | 1906
  | 1903
  | 1902
  | 1900
  | 1899
  | 1898
  | 1897
  | 1896
  | 1894
  | 1893
  | 1891
  | 1887
  | 1885
  | 1884
  | 1880
  | 1878
  | 1877
  | 1875
  | 1871
  | 1868
  | 1867
  | 1865
  | 1861
  | 1857
  | 1854
  | 1853
  | 1851
  | 1847
  | 1846
  | 1844
  | 1843
  | 1833
  | 1831
  | 1829
  | 1825
  | 1824
  | 1822
  | 1801
  | 1799
  | 1791
  | 1790
  | 1786
  | 1784
  | 1782
  | 1781
  | 1778
  | 1775
  | 1774
  | 1770
  | 1765
  | 1763
  | 1762
  | 1759
  | 1758
  | 1757
  | 1754
  | 1752
  | 1751
  | 1750
  | 1747
  | 1744
  | 1743
  | 1740
  | 1738
  | 1737
  | 1734
  | 1730
  | 1728
  | 1727
  | 1719
  | 1718
  | 1716
  | 1711
  | 1709
  | 1707
  | 1701
  | 1700
  | 1696
  | 1695
  | 1693
  | 1692
  | 1690
  | 1689
  | 1687
  | 1686
  | 1684
  | 1683
  | 1682
  | 1680
  | 1678
  | 1677
  | 1675
  | 1674
  | 1672
  | 1671
  | 1669
  | 1668
  | 1666
  | 1665
  | 1663
  | 1662
  | 1660
  | 1659
  | 1657
  | 1656
  | 1654
  | 1653
  | 1651
  | 1650
  | 1648
  | 1647
  | 1645
  | 1644
  | 1642
  | 1641
  | 1639
  | 1638
  | 1636
  | 1632
  | 1631
  | 1630
  | 1628
  | 1626
  | 1624
  | 1623
  | 1622
  | 1621
  | 1620
  | 1619
  | 1617
  | 1616
  | 1614
  | 1612
  | 1611
  | 1609
  | 1608
  | 1606
  | 1605
  | 1601
  | 1598
  | 1594
  | 1592
  | 1586
  | 1584
  | 1582
  | 1581
  | 1579
  | 1578
  | 1576
  | 1575
  | 1573
  | 1572
  | 1570
  | 1569
  | 1567
  | 1566
  | 1565
  | 1563
  | 1561
  | 1560
  | 1558
  | 1557
  | 1555
  | 1554
  | 1552
  | 1551
  | 1549
  | 1548
  | 1546
  | 1545
  | 1543
  | 1542
  | 1540
  | 1539
  | 1537
  | 1536
  | 1534
  | 1533
  | 1531
  | 1530
  | 1528
  | 1527
  | 1525
  | 1524
  | 1522
  | 1521
  | 1517
  | 1516
  | 1514
  | 1512
  | 1510
  | 1509
  | 1508
  | 1507
  | 1505
  | 1504
  | 1502
  | 1500
  | 1499
  | 1494
  | 1492
  | 1489
  | 1487
  | 1484
  | 1482
  | 1476
  | 1469
  | 1463
  | 1461
  | 1451
  | 1450
  | 1449
  | 1448
  | 1447
  | 1445
  | 1439
  | 1438
  | 1437
  | 1436
  | 1435
  | 1434
  | 1433
  | 1432
  | 1431
  | 1428
  | 1425
  | 1421
  | 1420
  | 1418
  | 1411
  | 1394
  | 1390
  | 1389
  | 1388
  | 1387
  | 1386
  | 1380
  | 1378
  | 1344
  | 1342
  | 1340
  | 1339
  | 1338
  | 1337
  | 1330
  | 1328
  | 1326
  | 1325
  | 1324
  | 1319
  | 1318
  | 1315
  | 1313
  | 1311
  | 1309
  | 1308
  | 1307
  | 1306
  | 1303
  | 1302
  | 1300
  | 1298
  | 1295
  | 1293
  | 1292
  | 1289
  | 1287
  | 1285
  | 1283
  | 1281
  | 1280
  | 1277
  | 1275
  | 1273
  | 1272
  | 1271
  | 1270
  | 1269
  | 1268
  | 1265
  | 1264
  | 1261
  | 1258
  | 1255
  | 1254
  | 1253
  | 1252
  | 1249
  | 1248
  | 1246
  | 1244
  | 1241
  | 1239
  | 1238
  | 1236
  | 1235
  | 1234
  | 1233
  | 1232
  | 1231
  | 1228
  | 1227
  | 1224
  | 1214
  | 1209
  | 1207
  | 1200
  | 1199
  | 1198
  | 1197
  | 1195
  | 1194
  | 1193
  | 1190
  | 1189
  | 1188
  | 1186
  | 1185
  | 1184
  | 1183
  | 1182
  | 1181
  | 1180
  | 1178
  | 1174
  | 1173
  | 1172
  | 1171
  | 1169
  | 1168
  | 1165
  | 1164
  | 1161
  | 1160
  | 1157
  | 1154
  | 1153
  | 1152
  | 1150
  | 1149
  | 1148
  | 1147
  | 1146
  | 1145
  | 1144
  | 1142
  | 1129
  | 1126
  | 1120
  | 1119
  | 1114
  | 1113
  | 1110
  | 1106
  | 1105
  | 1090
  | 1088
  | 1086
  | 1085
  | 1084
  | 1083
  | 1078
  | 1077
  | 1071
  | 1070
  | 1069
  | 1063
  | 1061
  | 1060
  | 1055
  | 1053
  | 1051
  | 1049
  | 1046
  | 1042
  | 1040
  | 1033
  | 1030
  | 1025
  | 1024
  | 1022
  | 1021
  | 1020
  | 1017
  | 1010
  | 1007
  | 1005
  | 1004
  | 1000
  | 999
  | 998
  | 997
  | 996
  | 995
  | 994
  | 991
  | 989
  | 987
  | 986
  | 985
  | 984
  | 983
  | 982
  | 981
  | 980
  | 977
  | 974
  | 971
  | 967
  | 964
  | 962
  | 955
  | 953
  | 952
  | 949
  | 948
  | 947
  | 944
  | 942
  | 941
  | 940
  | 937
  | 933
  | 931
  | 930
  | 925
  | 922
  | 918
  | 917
  | 916
  | 912
  | 910
  | 907
  | 900
  | 899
  | 898
  | 897
  | 894
  | 893
  | 892
  | 891
  | 890
  | 889
  | 888
  | 886
  | 885
  | 884
  | 880
  | 879
  | 878
  | 877
  | 876
  | 875
  | 874
  | 873
  | 872
  | 871
  | 867
  | 864
  | 863
  | 862
  | 861
  | 860
  | 859
  | 858
  | 857
  | 853
  | 852
  | 849
  | 848
  | 847
  | 846
  | 845
  | 844
  | 842
  | 841
  | 839
  | 838
  | 837
  | 836
  | 835
  | 834
  | 833
  | 832
  | 829
  | 828
  | 827
  | 826
  | 824
  | 823
  | 822
  | 819
  | 818
  | 817
  | 815
  | 814
  | 813
  | 812
  | 811
  | 806
  | 803
  | 800
  | 796
  | 794
  | 793
  | 789
  | 786
  | 785
  | 784
  | 781
  | 779
  | 776
  | 774
  | 771
  | 769
  | 767
  | 764
  | 761
  | 759
  | 757
  | 752
  | 749
  | 748
  | 746
  | 743
  | 742
  | 740
  | 738
  | 737
  | 735
  | 734
  | 732
  | 730
  | 726
  | 723
  | 698
  | 694
  | 691
  | 684
  | 683
  | 682
  | 681
  | 680
  | 679
  | 678
  | 677
  | 676
  | 675
  | 671
  | 668
  | 667
  | 666
  | 665
  | 664
  | 663
  | 662
  | 661
  | 657
  | 656
  | 653
  | 652
  | 651
  | 650
  | 649
  | 648
  | 646
  | 645
  | 643
  | 642
  | 641
  | 640
  | 636
  | 635
  | 634
  | 633
  | 632
  | 631
  | 629
  | 628
  | 627
  | 626
  | 624
  | 620
  | 619
  | 617
  | 616
  | 615
  | 614
  | 613
  | 612
  | 611
  | 610
  | 609
  | 608
  | 606
  | 605
  | 604
  | 603
  | 602
  | 601
  | 600
  | 597
  | 596
  | 595
  | 594
  | 593
  | 591
  | 589
  | 588
  | 587
  | 583
  | 582
  | 581
  | 577
  | 575
  | 574
  | 573
  | 572
  | 571
  | 570
  | 569
  | 568
  | 566
  | 565
  | 563
  | 562
  | 561
  | 560
  | 556
  | 554
  | 553
  | 552
  | 551
  | 550
  | 549
  | 547
  | 541
  | 540
  | 537
  | 535
  | 534
  | 533
  | 532
  | 531
  | 530
  | 528
  | 527
  | 526
  | 518
  | 516
  | 499
  | 491
  | 478
  | 475
  | 455
  | 453
  | 450
  | 428
  | 423
  | 422
  | 418
  | 405
  | 402
  | 401
  | 400
  | 399
  | 398
  | 396
  | 395
  | 394
  | 391
  | 388
  | 387
  | 386
  | 384
  | 379
  | 378
  | 377
  | 376
  | 375
  | 364
  | 359
  | 354
  | 352
  | 350
  | 349
  | 346
  | 344
  | 342
  | 341
  | 340
  | 335
  | 333
  | 325
  | 324
  | 323
  | 320
  | 319
  | 313
  | 309
  | 307
  | 297
  | 295
  | 291
  | 287
  | 286
  | 285
  | 284
  | 278
  | 274
  | 243
  | 241
  | 238
  | 233
  | 231
  | 230
  | 228
  | 221
  | 210
  | 209
  | 207
  | 205
  | 201
  | 198
  | 196
  | 192
  | 189
  | 187
  | 186
  | 129
  | 113
  | 109
  | 107
  | 103
  | 93
  | 88
  | 85
  | 82
  | 81
  | 77
  | 76
  | 75
  | 72
  | 71
  | 68
  | 67
  | 66
  | 62
  | 1
      -> true
  | _ -> false


end
module Reason_parser_message
= struct
#1 "reason_parser_message.ml"

(* This file was auto-generated based on "reason_parser.messages". *)

(* Please note that the function [message] can raise [Not_found]. *)

let message =
  fun s ->
    match s with
    | 0 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 58 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3922 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3923 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1621 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2661 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2663 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2664 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2666 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1391 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3235 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1440 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1441 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3206 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1442 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1443 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1444 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1446 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3209 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3210 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3212 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3213 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3216 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3218 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3220 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3225 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3230 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1392 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3293 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3295 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3296 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3297 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3300 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3302 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3303 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3306 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3307 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3308 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3311 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3292 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1393 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1395 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3289 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1423 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1426 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1427 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1424 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1429 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1430 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1431 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1419 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1420 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1488 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2925 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2742 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3927 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2667 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2668 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2669 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2670 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2671 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2673 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2674 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2676 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2677 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2679 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2680 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2682 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2683 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2685 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1422 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2686 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2688 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2689 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2691 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1089 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3367 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3368 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2692 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2694 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2695 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2697 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2743 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2744 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2745 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2746 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2747 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2698 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2700 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2701 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2703 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2704 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2706 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2707 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2709 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2710 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2712 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2713 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2715 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2716 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2721 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2718 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2720 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1587 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1588 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1773 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1589 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1590 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1591 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1593 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1776 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1777 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1779 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1780 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1783 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1785 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1787 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1792 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1793 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1848 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1845 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1800 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1801 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1802 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1814 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2722 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2724 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2725 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2727 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2728 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2730 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2731 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2733 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 188 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 189 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 190 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 223 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 228 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 224 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 208 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 212 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 214 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 216 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 218 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 229 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3802 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3803 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3804 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3807 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3805 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3812 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 231 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 232 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 519 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3789 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3787 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3786 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3791 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3745 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3747 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3779 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3748 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3749 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3751 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3752 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3754 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 880 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3800 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3780 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3765 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3781 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3768 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3782 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3771 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3773 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3775 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3783 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3756 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3758 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3759 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3760 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3761 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3762 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3763 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3767 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3770 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3823 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3822 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3824 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3826 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3827 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3825 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 895 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 896 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 881 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 882 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 883 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 894 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 885 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 887 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 888 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 890 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 891 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3817 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3819 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2851 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2852 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2856 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2853 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2854 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2847 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2848 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2859 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2849 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2850 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3820 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2837 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2838 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2842 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2839 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2840 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2833 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2844 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2834 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2835 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 760 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3818 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 249 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3732 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3731 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 293 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3582 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3583 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3584 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3587 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3589 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3590 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3734 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3594 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3595 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3597 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3624 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3604 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3606 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3607 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3605 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3609 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3610 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3611 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3598 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3600 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3599 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3613 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3616 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3618 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3619 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3617 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3614 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3736 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3652 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3653 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3660 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3654 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3655 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3656 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3658 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3663 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3664 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3666 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3667 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3670 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3672 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3674 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3679 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3684 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3640 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3641 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3642 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3645 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 83 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3887 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 250 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 84 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 90 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3884 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 265 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 268 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3706 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 266 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 288 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2748 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2760 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2761 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2762 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2749 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2750 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2751 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2752 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2753 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2754 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1708 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2757 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2758 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2759 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1704 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1705 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 282 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 292 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3593 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3637 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 283 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1490 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1495 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1496 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1497 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1013 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1028 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1014 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1015 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1031 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3485 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1034 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1035 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1491 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1493 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 69 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1996 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1997 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1999 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2000 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2001 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2003 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3870 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 78 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2922 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 63 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 64 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 65 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3895 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1585 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1876 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1878 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1879 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1880 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1487 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 79 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3889 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3888 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3891 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3893 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 80 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1881 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1894 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1895 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1896 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1882 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1883 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1885 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1886 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1887 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1888 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1891 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1892 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1893 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 91 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3879 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3880 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3882 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 92 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1627 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1486 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 128 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3837 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3838 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3839 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3840 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3841 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3842 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 279 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3693 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1082 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3373 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1383 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1384 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1385 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3317 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3318 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1390 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1396 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1397 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1405 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1406 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1407 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1408 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1409 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3265 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3266 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3267 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3268 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3264 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1413 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1414 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1415 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3237 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3238 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3239 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3240 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3241 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1625 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1416 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1417 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1418 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 54 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2918 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 55 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 330 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 333 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 332 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 70 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 73 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 74 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 336 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2763 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1453 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1454 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2765 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1455 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3191 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2766 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2768 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2801 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2802 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 337 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 343 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3525 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 911 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3504 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 339 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2821 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2807 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2808 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2812 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2813 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2814 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2809 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2810 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2817 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2735 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1472 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1615 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1617 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1629 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1631 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1595 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1633 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1634 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1635 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1636 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1637 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1639 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1646 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1648 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1649 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1651 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1640 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1642 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1652 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1654 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1655 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1657 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1658 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1660 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1661 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1663 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1670 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1672 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1618 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1620 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1643 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1645 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1664 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1666 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1667 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1669 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1673 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1675 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1676 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1678 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1679 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1681 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1683 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1684 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1596 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1712 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 824 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 825 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 830 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 831 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 820 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 821 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 788 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 789 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 795 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 790 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 791 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 829 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 813 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 797 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 801 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 802 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 804 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 805 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 807 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 808 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 809 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 810 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 816 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1694 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1696 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1714 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1766 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1767 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1715 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1720 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1932 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1685 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1687 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1688 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1690 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1691 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1693 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1279 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 108 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 117 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 118 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 130 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3831 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3833 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3835 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 299 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 300 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 302 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 715 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1473 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1474 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1475 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1928 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1929 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1930 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1485 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1936 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1937 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1938 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1942 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1988 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1943 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1944 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1945 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1987 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1941 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1939 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2819 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1947 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1948 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1966 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1967 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1964 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1949 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1950 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1955 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1961 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1962 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1959 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1956 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1957 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1983 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1984 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1969 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1970 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1971 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1974 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1975 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1976 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 363 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 364 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 365 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 366 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1979 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1980 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1981 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2909 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2912 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2913 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2914 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2910 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2911 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 94 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 95 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 96 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 97 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 99 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3874 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 100 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3872 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1597 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1602 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1603 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1599 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1600 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 110 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 997 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 322 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1003 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1004 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1604 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1607 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3868 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3561 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1613 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 326 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 327 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3534 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 328 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3529 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3530 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3532 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3537 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3538 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3540 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3541 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3544 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3546 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3548 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3553 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3558 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1697 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1698 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1699 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1702 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 321 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 111 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1610 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3867 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 112 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 114 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3864 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 259 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3718 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3719 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3716 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 273 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 294 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 295 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 252 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 253 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 195 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 182 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3079 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 729 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3518 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3519 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3520 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3072 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3075 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3076 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 183 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2937 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3070 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1470 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3691 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 280 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 303 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 304 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 306 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 308 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 312 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 314 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3565 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3566 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 317 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3563 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 256 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 258 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3721 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1044 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1047 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 269 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1048 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 270 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1016 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1018 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1022 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1023 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1019 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 262 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1045 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3077 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1992 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1050 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 310 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1052 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1054 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 276 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1057 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 277 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3694 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3470 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1064 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1065 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1066 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1067 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1068 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1069 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1073 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1074 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1075 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1076 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1077 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1080 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1081 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3374 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3375 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3376 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3377 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1072 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3461 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3475 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3378 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1840 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1815 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1837 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1816 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1817 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1795 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1796 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1797 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2466 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2446 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2447 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2448 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2136 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2137 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2140 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2450 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1951 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1952 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2451 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2458 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2452 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2454 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2455 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2445 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3442 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3429 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3419 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3421 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3422 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3420 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3428 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3424 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3425 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3426 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1849 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1851 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3467 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1827 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1829 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1830 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1831 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1828 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1852 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1853 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1850 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1860 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1861 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1863 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1865 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1866 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1867 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1864 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3381 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2386 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2387 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2388 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2334 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2494 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2497 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2502 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2503 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2499 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2399 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2419 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2420 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2491 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2336 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2477 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2428 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2431 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2395 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2396 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2416 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2417 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2414 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2397 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2398 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2405 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2411 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2412 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2409 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2406 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2407 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2403 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2390 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2391 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2389 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3415 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3414 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3407 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3408 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3409 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1804 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1808 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1810 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1811 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1812 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1809 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1805 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1806 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1803 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3411 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1822 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1823 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1824 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1821 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3473 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2429 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2464 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2444 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3434 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3436 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3437 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3435 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3430 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2435 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2436 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2437 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2439 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2438 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2441 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2423 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2238 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2239 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2471 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2472 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1994 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1995 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2008 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2780 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2769 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 966 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3497 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3498 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3499 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2781 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2771 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2782 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2783 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2773 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2774 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2778 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2009 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2010 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2011 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2013 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2934 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2015 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2017 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2020 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2021 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2022 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2019 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2929 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2931 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2932 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2025 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2927 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2787 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2788 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2797 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2798 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2789 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2796 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2790 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2793 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2799 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2800 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2026 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2027 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 59 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3918 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3916 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2028 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2029 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2030 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2031 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2034 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2035 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1398 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3283 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3284 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3281 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1399 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1404 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3269 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1400 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1403 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3272 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3278 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3279 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3276 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3273 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3274 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2036 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2037 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2038 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2039 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2041 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2042 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2044 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2047 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2048 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2049 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2050 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2051 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2055 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2056 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2057 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2058 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2052 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2059 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2060 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2061 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2062 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2063 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2064 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2068 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2069 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 765 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 520 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 521 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 770 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 786 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 508 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 509 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 513 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 510 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 782 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 772 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 777 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 503 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 504 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 505 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 506 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2070 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2071 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 787 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2073 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2074 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2076 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2077 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2078 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2080 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2081 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2082 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2084 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2085 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2087 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2088 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2093 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2094 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2095 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2096 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2097 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2098 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2099 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2100 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1402 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1357 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1370 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1365 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1094 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1096 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1097 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1348 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3337 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1347 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1098 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1359 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1360 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1361 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1364 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2737 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2828 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2865 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2864 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2866 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2868 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2869 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2867 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2829 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2831 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2832 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2830 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2906 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2871 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2873 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2872 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2874 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2901 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2875 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2876 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2903 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2904 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2880 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2882 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2881 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2884 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2886 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2887 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2888 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2889 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2890 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2892 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2894 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2895 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2896 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2898 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2102 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2297 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2104 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2105 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2106 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2120 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2281 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2288 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2291 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2292 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2289 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2295 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2279 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2284 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2150 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2151 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2154 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2155 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2163 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2298 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2299 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2644 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2642 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2300 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2111 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2624 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2626 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2627 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2639 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2637 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2628 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2630 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2635 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2633 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2631 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2116 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2615 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2616 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2617 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2622 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2620 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2618 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2609 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2309 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2310 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2311 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2312 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2313 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2314 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2318 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2319 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2320 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2321 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2322 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2325 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2326 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2327 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2328 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2329 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2330 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2317 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2647 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2650 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2651 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2648 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2654 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2593 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2574 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2575 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2576 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2578 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2579 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2585 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2580 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2582 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2583 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2573 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2333 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2505 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2508 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2509 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2531 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2604 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2513 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2516 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2517 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2520 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2551 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2552 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2521 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2527 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2528 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2548 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2549 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2546 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2529 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2530 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2537 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2543 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2544 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2541 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2538 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2539 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2560 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2561 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2591 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2572 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2563 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2564 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2565 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2567 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2566 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2569 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2555 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2188 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2189 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2522 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2523 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2598 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2599 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2611 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2301 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2209 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2210 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2304 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2305 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2213 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2307 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2214 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2156 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2272 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2122 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2123 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2128 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2125 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2129 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2130 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2132 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2133 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2134 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2135 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2143 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2144 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2145 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2146 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2148 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2232 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2166 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2168 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2169 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2170 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2173 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2174 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2175 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2176 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2178 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2179 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2180 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2181 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2183 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2195 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2196 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2198 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2199 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2200 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2201 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2203 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2204 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2205 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2206 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2208 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2222 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2187 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2192 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2234 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2245 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2246 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2248 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2249 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2250 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2251 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2253 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2254 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2255 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2256 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2258 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2260 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2237 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2242 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2275 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2220 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2656 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1087 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1088 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2658 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2659 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3930 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 345 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 346 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 347 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 350 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 351 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 620 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 621 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 622 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 625 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 623 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 630 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 352 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 353 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 607 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 605 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 583 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 609 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 535 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 538 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 576 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 539 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 540 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 548 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 549 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 551 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 596 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 618 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 577 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 562 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 578 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 565 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 579 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 568 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 570 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 572 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 580 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 553 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 555 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 556 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 557 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 558 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 559 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 560 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 564 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 567 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 686 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 685 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 687 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 689 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 690 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 688 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 598 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 599 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 584 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 585 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 586 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 597 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 588 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 590 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 591 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 594 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 595 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 635 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 637 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 672 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 673 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 677 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 674 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 675 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 668 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 669 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 680 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 670 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 671 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 639 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 658 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 659 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 663 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 660 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 661 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 654 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 665 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 655 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 656 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 592 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 636 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 692 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 694 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 693 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 696 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2990 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2994 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 699 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3523 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2991 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2992 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2995 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2996 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 697 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 698 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3034 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3035 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2999 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3000 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3004 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3005 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3006 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3001 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3002 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3009 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 700 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 702 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 724 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 725 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3521 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 727 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3738 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 247 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2938 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 920 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 921 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 926 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 927 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 928 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 930 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 929 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 932 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 942 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 943 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 934 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 935 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 939 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 940 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 938 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 936 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 937 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 243 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2939 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 945 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 946 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 947 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 244 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 245 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 246 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3740 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1721 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1722 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1723 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1724 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1725 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1727 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1726 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1729 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1752 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1753 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1731 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1732 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1749 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1748 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1733 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1734 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1735 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1744 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1745 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1739 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1740 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1741 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 914 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3199 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1755 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1756 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1757 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3189 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3194 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 915 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 919 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 950 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 951 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 952 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1457 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1458 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1459 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1460 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1464 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3188 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1456 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1761 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1762 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 957 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 958 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 959 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 963 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3185 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2791 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1465 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1764 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 912 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 913 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1760 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 756 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 758 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3107 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 902 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 901 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 903 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 905 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 906 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 904 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 759 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 762 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 868 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 869 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 873 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 870 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 871 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 864 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 865 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 876 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 866 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 867 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 763 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 854 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 855 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 859 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 856 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 857 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 850 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 861 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 851 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 852 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 761 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 908 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3113 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3117 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3114 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3115 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3118 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3119 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 909 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 910 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3122 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3123 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3127 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3128 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3129 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3124 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3125 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3132 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1466 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1467 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1468 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3081 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3082 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3083 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3084 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3085 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3086 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3087 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3089 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 764 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 838 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 840 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 841 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 843 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 844 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 846 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 848 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3135 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3137 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3144 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3143 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3145 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3147 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3148 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3146 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3138 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3140 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3141 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3139 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3108 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3150 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3171 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3172 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3173 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3151 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3152 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3175 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3176 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3154 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3155 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3156 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3158 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3159 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3160 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3161 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3162 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3163 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3164 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3166 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3168 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3169 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3091 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3092 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3093 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3094 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3095 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3097 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3100 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3101 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3098 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3104 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 954 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2940 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2941 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2942 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2943 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2944 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2945 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2949 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 640 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 536 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 500 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 528 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 512 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 529 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 642 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 644 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 645 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 647 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 648 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 650 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 652 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2984 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3012 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3014 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3022 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3021 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3023 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3025 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3026 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3024 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3015 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3017 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3018 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3016 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2985 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3931 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3028 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3030 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3029 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3031 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3058 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3059 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3060 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3032 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3033 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3062 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3063 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3038 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3039 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3040 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3042 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3043 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3044 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3045 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3046 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3047 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3048 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3050 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3052 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3053 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3054 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3056 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2951 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2969 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2952 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2953 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2954 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2955 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2960 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2963 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2964 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2961 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2967 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2956 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2970 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2107 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2115 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2971 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2110 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2972 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2974 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2977 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2978 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2975 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2981 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3934 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3936 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 396 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 397 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 403 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 404 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 389 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 192 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 193 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 194 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 198 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 199 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 202 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 203 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 390 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 196 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 197 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 234 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 235 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 236 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3743 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 381 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 392 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 393 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 237 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 86 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 87 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 238 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 240 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 239 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 543 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 544 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 242 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1021 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 402 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 378 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3829 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 131 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 355 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 479 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 493 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 494 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 495 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 480 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 484 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 486 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 481 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 468 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 469 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 470 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 456 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 487 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 467 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 457 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 458 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 462 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 463 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 460 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 356 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 490 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 357 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 477 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 358 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 360 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 361 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 362 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 421 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 439 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 440 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 442 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 424 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 445 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 447 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 425 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 444 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 432 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 433 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 434 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 436 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 437 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 451 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 368 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 369 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 410 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 411 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 412 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 372 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 373 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 374 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 380 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 408 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 416 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 417 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 371 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 385 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3938 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 60 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 61 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3914 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3915 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1411 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1509 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3940 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1503 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1505 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1515 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1517 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 988 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1041 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1042 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1379 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1518 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1519 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1580 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1581 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1520 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1522 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1529 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1531 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1532 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1534 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1523 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1525 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1535 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1537 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1006 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1538 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1540 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1541 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1543 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 296 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3578 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1544 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1546 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1553 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1555 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1412 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3242 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3244 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3245 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3246 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1506 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1508 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1526 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1528 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1547 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1549 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1550 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1552 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1556 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1558 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1559 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1561 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1562 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1564 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1566 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1567 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1477 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1478 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1901 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1479 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1480 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1481 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1483 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1904 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1905 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1907 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1908 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1911 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1913 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1915 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1920 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1925 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1577 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1579 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1568 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1570 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1571 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1573 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1574 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1576 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 263 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3709 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3708 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3711 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3713 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 264 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3247 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 923 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 924 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3260 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3261 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3262 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3248 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3249 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3251 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3252 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3253 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3254 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3257 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3258 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3259 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 271 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3700 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3701 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3703 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 272 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1008 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3492 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1009 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3490 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 101 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1043 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3478 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1381 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1382 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3319 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3321 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3871 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 104 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1513 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 102 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1410 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 298 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3575 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 722 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 121 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3858 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3860 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3862 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3568 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3569 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3570 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3571 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3572 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3573 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 968 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3496 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 990 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1001 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1002 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 992 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 993 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 251 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3729 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 255 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3723 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3725 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3727 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 969 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 972 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 973 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 970 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 975 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 976 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 275 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3911 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3902 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3908 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3896 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3897 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3898 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 978 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 987 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1037 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1038 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1039 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1040 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3480 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3481 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1091 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1092 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1093 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3355 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3356 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3353 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3338 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3340 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3341 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3339 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3344 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3350 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3351 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3348 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3345 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3346 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3358 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3359 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3361 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3362 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1350 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1351 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1352 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1353 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1354 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3333 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3334 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3335 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3336 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3332 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1355 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1374 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1375 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3327 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3328 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3329 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3330 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3331 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1511 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1376 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 979 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 980 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1377 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1378 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3942 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3943 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1196 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1198 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1206 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1237 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1200 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1201 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1203 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1210 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1204 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1099 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1100 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1215 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1217 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1219 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1221 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1220 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1216 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1225 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1229 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1230 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1191 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1186 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1187 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 731 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 733 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 736 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 739 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1282 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1211 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1290 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1170 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1172 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1284 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1286 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1288 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1276 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1278 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1174 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1175 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1256 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1259 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1262 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1266 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1267 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1155 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1150 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1151 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 741 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 744 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 745 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 747 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 750 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 751 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 753 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 755 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1111 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1107 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1310 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1316 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1312 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1314 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1108 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1109 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1331 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1332 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1333 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1334 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1335 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1336 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1112 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1327 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1117 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1124 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1323 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1138 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1139 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1143 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1140 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1274 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3510 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3511 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3512 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3513 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3514 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3515 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1141 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1142 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1101 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1339 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1341 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1115 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1326 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1116 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1103 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1104 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1102 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1158 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1121 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1122 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1162 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1127 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1128 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1136 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1131 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1132 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1163 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1137 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1320 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1321 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1130 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1125 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1166 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1167 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1179 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1176 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1208 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1177 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1178 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3946 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3947 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3948 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3949 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3950 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4216 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4133 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4135 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4136 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4138 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4139 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4140 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4141 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4142 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4143 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4145 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4146 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4148 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4149 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4151 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4152 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4154 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4155 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4157 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4158 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4160 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4161 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4163 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4164 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4166 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4167 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4169 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4217 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4218 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4219 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4220 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4221 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4170 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4172 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4173 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4175 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4176 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4178 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4179 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4181 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4182 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4184 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4185 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4187 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4188 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4193 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4190 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4192 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4212 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4194 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4196 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4197 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4199 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4200 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4202 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4203 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4205 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3952 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3988 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3987 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3989 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3991 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3992 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3990 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3953 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3955 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3975 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3976 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3980 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3977 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3978 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3971 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3972 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3983 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3973 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3974 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3956 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3961 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3962 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3966 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3963 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3964 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3957 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3968 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3958 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3959 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3954 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3994 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3997 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3996 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3999 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4001 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3995 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4222 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4234 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4235 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4236 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4223 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4224 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4225 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4226 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4227 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4228 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4231 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4232 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4233 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4003 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4005 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4006 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4008 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4004 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4010 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4011 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4017 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1029 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4208 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4297 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4293 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4019 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4237 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3453 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3454 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3455 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3456 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3457 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4020 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4021 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4239 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4240 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4244 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4245 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4246 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4241 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4242 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4249 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4210 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4024 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4025 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4026 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4027 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4028 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4029 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4030 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4033 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4034 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4035 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2339 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2383 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2340 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2341 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2342 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2382 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2338 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2337 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2344 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2345 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2363 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2364 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2361 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2346 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2348 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2349 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2347 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2352 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2358 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2359 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2356 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2353 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2354 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2378 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2379 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2366 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2367 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2369 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2370 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2371 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2374 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2375 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2376 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2479 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2482 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2483 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2484 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2480 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2481 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4036 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4037 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4038 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1450 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 965 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3500 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3502 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 122 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 123 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3844 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3846 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3856 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3848 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3851 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3853 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3854 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 329 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3527 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1452 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3202 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3204 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3205 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3203 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1462 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 1463 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4040 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4041 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4042 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4043 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4044 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4045 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4046 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4047 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4049 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4051 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4052 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4053 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4054 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4055 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4057 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4058 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4059 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4060 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4056 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4061 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4062 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4063 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4064 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4065 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3382 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3383 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3384 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3385 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3387 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3388 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3390 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3391 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3392 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3394 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3395 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3396 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3398 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3399 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3401 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3402 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4067 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4068 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4069 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4070 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4071 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4072 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4073 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4074 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4254 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4261 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4260 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4262 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4264 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4265 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4263 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4255 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4257 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4258 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4256 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4290 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4267 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4285 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4268 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4269 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4287 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4288 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4272 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2433 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2432 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4273 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4275 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4276 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4277 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4278 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4279 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 3431 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4281 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4282 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4076 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4077 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4078 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4079 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4116 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4114 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4080 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4096 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4098 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4099 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4111 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4109 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4100 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4102 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4107 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4105 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4103 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4089 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4094 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4092 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4090 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4083 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4119 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4122 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4123 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4120 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4126 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4085 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 2535 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4081 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4128 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4130 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4131 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4301 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4309 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4305 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4306 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | 4308 ->
        "<YOUR SYNTAX ERROR MESSAGE HERE>\n"
    | _ ->
        raise Not_found

end
module Reason_parser_explain
= struct
#1 "reason_parser_explain.ml"
(* See the comments in menhir_error_processor.ml *)

open Reason_string

module Parser = Reason_parser
module Interp = Parser.MenhirInterpreter
module Raw = Reason_parser_explain_raw

let identlike_keywords =
  let reverse_table = lazy (
    let table = Hashtbl.create 7 in
    Hashtbl.iter (fun k v -> Hashtbl.add table v k) Reason_lexer.keyword_table;
    table
  ) in
  function
  | Parser.SIG    -> Some "sig"
  | Parser.MODULE -> Some "module"
  | Parser.BEGIN  -> Some "begin"
  | Parser.END    -> Some "end"
  | Parser.OBJECT -> Some "object"
  | Parser.SWITCH -> Some "switch"
  | Parser.TO     -> Some "to"
  | Parser.THEN   -> Some "then"
  | Parser.TYPE   -> Some "type"
  | token ->
    match Hashtbl.find (Lazy.force reverse_table) token with
    | name -> Some name
    | exception Not_found -> None

let keyword_confused_with_ident state token =
  match identlike_keywords token with
  | Some name when Raw.transitions_on_lident state
                || Raw.transitions_on_uident state ->
    (name ^ " is a reserved keyword, it cannot be used as an identifier. Try `" ^ name ^ "_` or `_" ^ name ^ "` instead")
  | _ -> raise Not_found

let uppercased_instead_of_lowercased state token =
  match token with
  | Parser.UIDENT name when Raw.transitions_on_lident state ->
    let name = String.uncapitalize_ascii name in
    if Hashtbl.mem Reason_lexer.keyword_table name then
      "variables and labels should be lowercased"
    else
      Printf.sprintf "variables and labels should be lowercased. Try `%s'" name
  | _ -> raise Not_found

let semicolon_might_be_missing state _token =
  (*let state = Interp.current_state_number env in*)
  if Raw.transitions_on_semi state then
    "syntax error, consider adding a `;' before"
  else
    raise Not_found

let token_specific_message = function
  | Parser.UNDERSCORE ->
    "underscore is not a valid identifier. Use _ only in pattern matching and partial function application"
  | _ ->
    raise Not_found

let message env (token, _, _) =
  let state = Interp.current_state_number env in
  (* Identify a keyword used as an identifier *)
  try keyword_confused_with_ident state token
  with Not_found ->
  (* Identify an uppercased identifier in a lowercase place *)
  try uppercased_instead_of_lowercased state token
  with Not_found ->
  try semicolon_might_be_missing state token
  with Not_found ->
  try token_specific_message token
  with Not_found ->
  (* Is there a message for this specific state ? *)
  try
    let m = Reason_parser_message.message state in
    if m = "<YOUR SYNTAX ERROR MESSAGE HERE>\n" then
      (* Milder unknown syntax error message *)
      Reason_syntax_util.default_error_message
    else m
  with Not_found ->
    (* TODO: we don't know what to say *)
    Reason_syntax_util.default_error_message

end
module Reason_heuristics
= struct
#1 "reason_heuristics.ml"
let is_punned_labelled_expression e lbl =
  let open Ast_404.Parsetree in
  match e.pexp_desc with
  | Pexp_ident { txt }
  | Pexp_constraint ({pexp_desc = Pexp_ident { txt }}, _)
  | Pexp_coerce ({pexp_desc = Pexp_ident { txt }}, _, _)
    -> txt = Longident.parse lbl
  | _ -> false

(* We manually check the length of `Thing.map(foo, bar, baz`,
 * in `Thing.map(foo, bar, baz, (a) => doStuff(a))`
 * because Easyformat doesn't have a hook to change printing when a list breaks
 *
 * we check if all arguments aside from the final one are either strings or identifiers,
 * where the sum of the string contents and identifier names are less than the print width
 *)
let funAppCallbackExceedsWidth ~printWidth ~args ~funExpr () =
  let open Ast_404.Parsetree in
  let open Ast_404.Asttypes in
  let funLen = begin match funExpr.pexp_desc with
    | Pexp_ident ident ->
       let identList = Longident.flatten ident.txt in
       let lengthOfDots = List.length identList - 1 in
       let len = List.fold_left (fun acc curr ->
         acc + (String.length curr)) lengthOfDots identList in
       len
    | _ -> -1
  end in
  (* eats an argument & substract its length from the printWidth
   * as soon as the print width reaches a sub-zero value,
   * we know the print width is exceeded & returns *)
  let rec aux len = function
    | _ when len < 0 -> true
    | [] -> false
    | arg::args ->
      begin match arg with
      | (label, ({ pexp_desc = Pexp_ident ident } as e)) ->
        let identLen = List.fold_left (fun acc curr ->
          acc + (String.length curr)
        ) len (Longident.flatten ident.txt) in
        begin match label with
        | Nolabel -> aux (len - identLen) args
        | Labelled s when is_punned_labelled_expression e s ->
            aux (len - (identLen + 1)) args
        | Labelled s ->
            aux (len - (identLen + 2 + String.length s)) args
        | Optional s ->
            aux (len - (identLen + 3 + String.length s)) args
        end
      | (label, {pexp_desc = Pexp_constant (Pconst_string (str, _))}) ->
        let strLen = String.length str in
        begin match label with
        | Nolabel -> aux (len - strLen) args
        | Labelled s ->
            aux (len - (strLen + 2 + String.length s)) args
        | Optional s ->
            aux (len - (strLen + 3 + String.length s)) args
        end
      | _ ->
        (* if we encounter a non-string or non-identifier argument exit *)
          true
    end
  in
  aux (printWidth - funLen) args

(*
 * Whether or not an identiier is small enough to justify omitting the
 * trailing comma for single identifier patterns. For single identifier
 * patterns, usually the identifier is not "far right" in the document, and
 * is one of the last things to require breaking. We can omit the trailing comma
 * in these cases because it likely will never render anyways and therefore the
 * space taken up by the trailing comma doesn't disrupt wrapping length calculations.
 *
 * For example, the `X` hardly ever benefits from a trailing comma.
 * | X(y) =>
 *)
let singleTokenPatternOmmitTrail txt = String.length txt < 4

(* Indicates whether an expression can be printed with the uncurried
 * dot notation. At the moment uncurried function application & definition
 * only makes sense in the context of a Pexp_apply or Pexp_fun
 *
 * Examples:
 * [@bs] add(2, 3); -> add(. 2, 3);   (* Pexp_apply *)
 * setTimeout([@bs] () => Js.log("hola"), 1000);  (* Pexp_fun *)
 *  -> setTimeout((.) => Js.log("hola"), 1000);
 *)
let bsExprCanBeUncurried expr =
  match Ast_404.Parsetree.(expr.pexp_desc) with
  | Pexp_fun _
  | Pexp_apply _ -> true
  | _ -> false

let isUnderscoreIdent expr =
  match Ast_404.Parsetree.(expr.pexp_desc) with
  | Pexp_ident ({txt = Lident "_"}) -> true
  | _ -> false

let isPipeFirst e = match Ast_404.Parsetree.(e.pexp_desc) with
  | Pexp_ident({txt = Longident.Lident("|.")}) -> true
  | Pexp_apply(
    {pexp_desc = Pexp_ident({txt = Longident.Lident("|.")})},
      _
    ) -> true
  | _ -> false

let isUnderscoreApplication expr =
  let open Ast_404.Parsetree in
  match expr with
  | {pexp_attributes = []; pexp_desc = Pexp_fun(
        Nolabel,
        None,
        {
          ppat_desc = Ppat_var({txt = "__x"});
          ppat_attributes = []
        },
        _
      )
    } -> true
  | _ -> false

(* <div> {items->Belt.Array.map(ReasonReact.string)->ReasonReact.array} </div>;
 * An application with pipe first inside jsx children requires special treatment.
 * Jsx children don't allow expression application, hence we need the braces
 * preserved in this case. *)
let isPipeFirstWithNonSimpleJSXChild e = match Ast_404.Parsetree.(e.pexp_desc) with
  | Pexp_apply(
    {pexp_desc = Pexp_ident({txt = Longident.Lident("|.")})},
      [Nolabel, {pexp_desc = Pexp_apply(_)}; _]
    ) -> true

  (* Handle <div> {url->a(b, _)} </div>;
   * underscore sugar needs protection *)
  | Pexp_apply(
    {pexp_desc = Pexp_ident({txt = Longident.Lident("|.")})},
      [_; Nolabel, fe]
    ) when isUnderscoreApplication fe -> true
  | _ -> false

end
module Reason_location
= struct
#1 "reason_location.ml"
module Comment = Reason_comment

module Range = struct
  (** [t] represents an interval, including endpoints,
   * delimited by two linenumbers. *)
  type t = {
    lnum_start: int;
    lnum_end: int
  }

  (**
   * make a range delimited by [loc1] and [loc2]
   * 1| let a = 1;
   * 2|
   * 3|
   * 4|
   * 5| let b = 2;
   * If loc1 represents `let a = 1` and loc2 represents `let b = 2`,
   * we get the range: {lnum_start: 2; lnum_end 4}
   *)
  let makeRangeBetween loc1 loc2 = Location.{
    lnum_start = loc1.loc_end.pos_lnum + 1;
    lnum_end = loc2.loc_start.pos_lnum - 1;
  }

  (** check whether [range] contains the [loc] *)
  let containsLoc range loc =
    let open Location in
    range.lnum_start <= loc.loc_start.pos_lnum
    && range.lnum_end >= loc.loc_end.pos_lnum

  (**
   * checks if [range] contains whitespace.
   * When comments are passed, the computation
   * takes the height of the comments into account.
   *
   * Example:
   * 1| let a = 1;
   * 2|
   * 3| /* a multi-
   * 4|   line comment */
   * 5| let b = 1;
   * The range (line 2 - line 4) has whitespace.
   *
   * 1| let a = 1;
   * 2| /* a multi-
   * 3|   line comment */
   * 4| let b = 1;
   * The range (line 2 - line 3) does not have whitespace.
   *)
  let containsWhitespace ?comments ~range () =
    (* compute the amount of lines the comments occupy in the given range *)
    let h = match comments with
    | Some(comments) ->
      List.fold_left (fun acc (curr : Comment.t) ->
        let cl = Comment.location curr in
        let open Location in
        let startLnum = cl.loc_start.pos_lnum in
        let endLnum = cl.loc_end.pos_lnum in
        if containsLoc range cl then
          acc + (endLnum - startLnum + 1)
        else acc
        ) 0 comments
    | None -> 0
    in
    range.lnum_end - range.lnum_start - h >= 0
end

(** compute if there's space (one or more line) between [loc1] and [loc2] *)
let hasSpaceBetween loc1 loc2 =
  Location.(loc1.loc_start.pos_lnum - loc2.loc_end.pos_lnum) > 1


end
module Vendored_easy_format : sig 
#1 "vendored_easy_format.mli"
(**
   Easy_format: indentation made easy.
*)

(**
  This module provides a functional, simplified layer over
  the Format module of the standard library.

  Input data must be first modelled as a tree using 3 kinds of nodes:
  - atoms
  - lists
  - labelled nodes

  Atoms represent any text that is guaranteed to be printed as-is.
  Lists can model any sequence of items such as arrays of data
  or lists of definitions that are labelled with something
  like "int main", "let x =" or "x:".
*)

type wrap =
    [ `Wrap_atoms
    | `Always_wrap
    | `Never_wrap
    | `Force_breaks
    | `Force_breaks_rec
    | `No_breaks ]
(** List wrapping conditions:
    - [`Wrap_atoms]: wrap if the list contains only atoms
    - [`Always_wrap]: always wrap when needed
    - [`Never_wrap]: never wrap,
      i.e. the list is either horizontal or vertical
    - [`Force_breaks]: align vertically,
      i.e. always break line between list items and
      align the left edge of each item.
    - [`Force_breaks_rec]: same as [`Force_breaks] but turns
      any wrappable ancestor node's wrap property ([`Wrap_atoms]
      or [`Always_wrap]) into [`Force_breaks].
    - [`No_breaks]: align horizontally,
      i.e. never break line between list items
*)

type label_break = [
  | `Auto
  | `Always
  | `Always_rec
  | `Never
]
(** When to break the line after a [Label]:
    - [Auto]: break after the label if there's not enough room
    - [Always]: always break after the label
    - [Always_rec]: always break after the label and force breaks in all parent
      lists and labels, similarly to [`Force_breaks_rec] for lists.
    - [Never]: never break after the label
*)

type style_name = string

type style = {
  tag_open : string;
  tag_close : string
}
    (** Pair of opening and closing tags that are inserted around
	text after pretty-printing. *)

type atom_param = {
  atom_style : style_name option; (** Default: [None] *)
}

val atom : atom_param


(** List-formatting parameters.
    Always derive a new set of parameters from an existing record.
    See {!Easy_format.list}.
*)
type list_param = {
  space_after_opening : bool; (** Whether there must be some whitespace
				  after the opening string.
				  Default: [true] *)
  space_after_separator : bool; (** Whether there must be some whitespace
				    after the item separators.
				    Default: [true] *)
  space_before_separator : bool; (** Whether there must be some whitespace
				     before the item separators.
				     Default: [false] *)
  separators_stick_left : bool; (** Whether the separators must
				    stick to the item on the left.
				    Default: [true] *)
  space_before_closing : bool; (** Whether there must be some whitespace
				   before the closing string.
				   Default: [true] *)
  stick_to_label : bool; (** Whether the opening string should be fused
			     with the preceding label.
			     Default: [true] *)
  align_closing : bool; (** Whether the beginning of the
			    closing string must be aligned
			    with the beginning of the opening string
			    (stick_to_label = false) or
			    with the beginning of the label if any
			    (stick_to_label = true).
			    Default: [true] *)
  wrap_body : wrap; (** Defines under which conditions the list body
			may be wrapped, i.e. allow several lines
			and several list items per line.
			Default: [`Wrap_atoms] *)
  indent_body : int; (** Extra indentation of the list body.
			 Default: [2] *)

  list_style : style_name option; (** Default: [None] *)
  opening_style : style_name option; (** Default: [None] *)
  body_style : style_name option; (** Default: [None] *)
  separator_style : style_name option; (** Default: [None] *)
  closing_style : style_name option; (** Default: [None] *)
}

val list : list_param
  (** Default list-formatting parameters, using the default values
      described in the type definition above.

      In order to make code compatible with future versions of the library,
      the record inheritance syntax should be used, e.g.
      [ { list with align_closing = false } ].
      If new record fields are added, the program would still compile
      and work as before.
  *)

(** Label-formatting parameters.
    Always derive a new set of parameters from an existing record.
    See {!Easy_format.label}.
*)
type label_param = {
  label_break: label_break;
    (** Whether to break the line after the label.
        Introduced in version 1.2.0.
        Default: [`Auto] *)

  space_after_label : bool;
    (** Whether there must be some whitespace after the label.
	Default: [true] *)

  indent_after_label : int;
    (** Extra indentation before the item that comes after a label.
	Default: [2]
    *)

  label_style : style_name option;
    (** Default: [None] *)
}

val label : label_param
  (** Default label-formatting parameters, using the default values
      described in the type definition above.

      In order to make code compatible with future versions of the library,
      the record inheritance syntax should be used, e.g.
      [ { label with indent_after_label = 0 } ].
      If new record fields are added, the program would still compile
      and work as before.
 *)



type t =
    Atom of string * atom_param (** Plain string normally
				    without line breaks. *)

  | List of
      (
	string    (* opening *)
	* string  (* separator *)
	* string  (* closing *)
	* list_param
      )
      * t list
	(** [List ((opening, separator, closing, param), nodes)] *)

  | Label of (t * label_param) * t
      (** [Label ((label, param), node)]: labelled node. *)

  | Custom of (Format.formatter -> unit)
      (** User-defined printing function that allows to use the
	  Format module directly if necessary. It is responsible
	  for leaving the formatter in a clean state. *)
(** The type of the tree to be pretty-printed. Each node contains
    its own formatting parameters.

    Detail of a list node
    [List ((opening, separator, closing, param), nodes)]:

    - [opening]: opening string such as ["\{"] ["\["] ["("] ["begin"] [""] etc.
    - [separator]: node separator such as [";"] [","] [""] ["+"] ["|"] etc.
    - [closing]: closing string such as ["\}"] ["\]"] [")"] ["end"] [""] etc.
    - [nodes]: elements of the list.

*)

type escape =
    [ `None
    | `Escape of
	((string -> int -> int -> unit) -> string -> int -> int -> unit)
    | `Escape_string of (string -> string) ]

type styles = (style_name * style) list

(** The regular pretty-printing functions *)
module Pretty :
sig
  val define_styles : Format.formatter -> escape -> styles -> unit
  val to_formatter : Format.formatter -> t -> unit

  val to_buffer : ?escape:escape -> ?styles:styles -> Buffer.t -> t -> unit
  val to_string : ?escape:escape -> ?styles:styles -> t -> string
  val to_channel : ?escape:escape -> ?styles:styles -> out_channel -> t -> unit
  val to_stdout : ?escape:escape -> ?styles:styles -> t -> unit
  val to_stderr : ?escape:escape -> ?styles:styles -> t -> unit
end

(** No spacing or newlines other than those in the input data
    or those produced by [Custom] printing. *)
module Compact :
sig
  val to_buffer : Buffer.t -> t -> unit
  val to_string : t -> string
  val to_channel : out_channel -> t -> unit
  val to_stdout : t -> unit
  val to_stderr : t -> unit
  val to_formatter : Format.formatter -> t -> unit
 end


(**/**)

(** Deprecated. Predefined sets of parameters *)
module Param :
sig
  val list_true : list_param
    (** Deprecated. All boolean fields set to true. indent_body = 2. *)

  val label_true : label_param
    (** Deprecated. All boolean fields set to true. indent_after_label = 2. *)

  val list_false : list_param
    (** Deprecated. All boolean fields set to false. indent_body = 2. *)

  val label_false : label_param
    (** Deprecated. All boolean fields set to false. indent_after_label = 2. *)
end


end = struct
#1 "vendored_easy_format.ml"
open Format

(** Shadow map and split with tailrecursive variants. *)
module List = struct
  include List
  (** Tail recursive of map *)
  let map f l = List.rev_map f l |> List.rev

  (** Tail recursive version of split *)
  let rev_split l =
    let rec inner xs ys = function
      | (x, y) :: xys ->
          inner (x::xs) (y::ys) xys
      | [] -> (xs, ys)
    in
    inner [] [] l

  let split l = rev_split (List.rev l)

end

type wrap = [
  | `Wrap_atoms
  | `Always_wrap
  | `Never_wrap
  | `Force_breaks
  | `Force_breaks_rec
  | `No_breaks
]

type label_break = [
  | `Auto
  | `Always
  | `Always_rec
  | `Never
]

type style_name = string
type style = {
  tag_open : string;
  tag_close : string
}

type atom_param = {
  atom_style : style_name option;
}

let atom = {
  atom_style = None
}

type list_param = {
  space_after_opening : bool;
  space_after_separator : bool;
  space_before_separator : bool;
  separators_stick_left : bool;
  space_before_closing : bool;
  stick_to_label : bool;
  align_closing : bool;
  wrap_body : wrap;
  indent_body : int;
  list_style : style_name option;
  opening_style : style_name option;
  body_style : style_name option;
  separator_style : style_name option;
  closing_style : style_name option;
}

let list = {
  space_after_opening = true;
  space_after_separator = true;
  space_before_separator = false;
  separators_stick_left = true;
  space_before_closing = true;
  stick_to_label = true;
  align_closing = true;
  wrap_body = `Wrap_atoms;
  indent_body = 2;
  list_style = None;
  opening_style = None;
  body_style = None;
  separator_style = None;
  closing_style = None;
}

type label_param = {
  label_break: label_break;
  space_after_label : bool;
  indent_after_label : int;
  label_style : style_name option;
}

let label = {
  label_break = `Auto;
  space_after_label = true;
  indent_after_label = 2;
  label_style = None;
}

type t =
    Atom of string * atom_param
  | List of (string * string * string * list_param) * t list
  | Label of (t * label_param) * t
  | Custom of (formatter -> unit)

type escape =
    [ `None
    | `Escape of
        ((string -> int -> int -> unit) -> string -> int -> int -> unit)
    | `Escape_string of (string -> string) ]

type styles = (style_name * style) list

(*
   Transform a tree starting from the leaves, propagating and merging
   accumulators until reaching the root.
*)
let propagate_from_leaf_to_root
  ~init_acc  (* create initial accumulator for a leaf *)
  ~merge_acc (* merge two accumulators coming from child nodes *)
  ~map_node  (* (node, acc) -> (node, acc) *)
  x =

  let rec aux x =
    match x with
    | Atom _ ->
        let acc = init_acc x in
        map_node x acc
    | List (param, children) ->
        let new_children, accs = List.rev_split (List.rev_map aux children) in
        let acc = List.fold_left merge_acc (init_acc x) accs in
        map_node (List (param, new_children)) acc
    | Label ((x1, param), x2) ->
        let acc0 = init_acc x in
        let new_x1, acc1 = aux x1 in
        let new_x2, acc2 = aux x2 in
        let acc = merge_acc (merge_acc acc0 acc1) acc2 in
        map_node (Label ((new_x1, param), new_x2)) acc
    | Custom _ ->
        let acc = init_acc x in
        map_node x acc
  in
  aux x

(*
   Convert wrappable lists into vertical lists if any of their descendants
   has the attribute wrap_body = `Force_breaks_rec.
*)
let propagate_forced_breaks x =
  (* acc = whether to force breaks in wrappable lists or labels *)
  let init_acc = function
    | List ((_, _, _, { wrap_body = `Force_breaks_rec }), _)
    | Label ((_, { label_break = `Always_rec }), _) -> true
    | Atom _
    | Label _
    | Custom _
    | List _ -> false
  in
  let merge_acc force_breaks1 force_breaks2 =
    force_breaks1 || force_breaks2
  in
  let map_node x force_breaks =
    match x with
    | List ((_, _, _, { wrap_body = `Force_breaks_rec }), _) -> x, true
    | List ((_, _, _, { wrap_body = `Force_breaks }), _) -> x, force_breaks

    | List ((op, sep, cl, ({ wrap_body = (`Wrap_atoms
                                         | `Never_wrap
                                         | `Always_wrap) } as p)),
            children) ->
        if force_breaks then
          let p = { p with wrap_body = `Force_breaks } in
          List ((op, sep, cl, p), children), true
        else
          x, false

    | Label ((a, ({ label_break = `Auto } as lp)), b) ->
        if force_breaks then
          let lp = { lp with label_break = `Always } in
          Label ((a, lp), b), true
        else
          x, false

    | List ((_, _, _, { wrap_body = `No_breaks }), _)
    | Label ((_, { label_break = (`Always | `Always_rec | `Never) }), _)
    | Atom _
    | Custom _ -> x, force_breaks
  in
  let new_x, forced_breaks =
    propagate_from_leaf_to_root
      ~init_acc
      ~merge_acc
      ~map_node
      x
  in
  new_x

module Pretty =
struct
  (*
     Rewrite the tree to be printed.
     Currently, this is used only to handle `Force_breaks_rec.
  *)
  let rewrite x = propagate_forced_breaks x

  (*
    Relies on the fact that mark_open_tag and mark_close_tag
    are called exactly once before calling pp_output_string once.
    It's a reasonable assumption although not guaranteed by the
    documentation of the Format module.
  *)
  let set_escape fmt escape =
    let print0, flush0 = pp_get_formatter_output_functions fmt () in
    let tagf0 = pp_get_formatter_tag_functions fmt () in

    let is_tag = ref false in

    let mot tag =
      is_tag := true;
      tagf0.mark_open_tag tag
    in

    let mct tag =
      is_tag := true;
      tagf0.mark_close_tag tag
    in

    let print s p n =
      if !is_tag then
        (print0 s p n;
         is_tag := false)
      else
        escape print0 s p n
    in

    let tagf = {
      tagf0 with
        mark_open_tag = mot;
        mark_close_tag = mct
    }
    in
    pp_set_formatter_output_functions fmt print flush0;
    pp_set_formatter_tag_functions fmt tagf


  let set_escape_string fmt esc =
    let escape print s p n =
      let s0 = String.sub s p n in
      let s1 = esc s0 in
      print s1 0 (String.length s1)
    in
    set_escape fmt escape


  let define_styles fmt escape l =
    if l <> [] then (
      pp_set_tags fmt true;
      let tbl1 = Hashtbl.create (2 * List.length l) in
      let tbl2 = Hashtbl.create (2 * List.length l) in
      List.iter (
        fun (style_name, style) ->
          Hashtbl.add tbl1 style_name style.tag_open;
          Hashtbl.add tbl2 style_name style.tag_close
      ) l;
      let mark_open_tag style_name =
        try Hashtbl.find tbl1 style_name
        with Not_found -> ""
      in
      let mark_close_tag style_name =
        try Hashtbl.find tbl2 style_name
        with Not_found -> ""
      in

      let tagf = {
        (pp_get_formatter_tag_functions fmt ()) with
          mark_open_tag = mark_open_tag;
          mark_close_tag = mark_close_tag
      }
      in
      pp_set_formatter_tag_functions fmt tagf
    );

    (match escape with
         `None -> ()
       | `Escape esc -> set_escape fmt esc
       | `Escape_string esc -> set_escape_string fmt esc)


  let pp_open_xbox fmt p indent =
    match p.wrap_body with
	`Always_wrap
      | `Never_wrap
      | `Wrap_atoms -> pp_open_hvbox fmt indent
      | `Force_breaks
      | `Force_breaks_rec -> pp_open_vbox fmt indent
      | `No_breaks -> pp_open_hbox fmt ()

  let extra_box p l =
    let wrap =
      match p.wrap_body with
          `Always_wrap -> true
        | `Never_wrap
        | `Force_breaks
        | `Force_breaks_rec
        | `No_breaks -> false
        | `Wrap_atoms ->
            List.for_all (function Atom _ -> true | _ -> false) l
    in
    if wrap then
      ((fun fmt -> pp_open_hovbox fmt 0),
       (fun fmt -> pp_close_box fmt ()))
    else
      ((fun fmt -> ()),
       (fun fmt -> ()))


  let pp_open_nonaligned_box fmt p indent l =
    match p.wrap_body with
        `Always_wrap -> pp_open_hovbox fmt indent
      | `Never_wrap -> pp_open_hvbox fmt indent
      | `Wrap_atoms ->
          if List.for_all (function Atom _ -> true | _ -> false) l then
            pp_open_hovbox fmt indent
          else
            pp_open_hvbox fmt indent
      | `Force_breaks
      | `Force_breaks_rec -> pp_open_vbox fmt indent
      | `No_breaks -> pp_open_hbox fmt ()


  let open_tag fmt = function
      None -> ()
    | Some s -> pp_open_tag fmt s

  let close_tag fmt = function
      None -> ()
    | Some _ -> pp_close_tag fmt ()

  let tag_string fmt o s =
    match o with
        None -> pp_print_string fmt s
      | Some tag ->
          pp_open_tag fmt tag;
          pp_print_string fmt s;
          pp_close_tag fmt ()

  let rec fprint_t fmt = function
      Atom (s, p) ->
        tag_string fmt p.atom_style s;

    | List ((_, _, _, p) as param, l) ->
        open_tag fmt p.list_style;
        if p.align_closing then
          fprint_list fmt None param l
        else
          fprint_list2 fmt param l;
        close_tag fmt p.list_style

    | Label (label, x) -> fprint_pair fmt label x
    | Custom f -> f fmt

  and fprint_list_body_stick_left fmt p sep hd tl =
    open_tag fmt p.body_style;
    fprint_t fmt hd;
    List.iter (
      fun x ->
        if p.space_before_separator then
          pp_print_string fmt " ";
        tag_string fmt p.separator_style sep;
        if p.space_after_separator then
          pp_print_space fmt ()
        else
          pp_print_cut fmt ();
        fprint_t fmt x
    ) tl;
    close_tag fmt p.body_style

  and fprint_list_body_stick_right fmt p sep hd tl =
    open_tag fmt p.body_style;
    fprint_t fmt hd;
    List.iter (
      fun x ->
        if p.space_before_separator then
          pp_print_space fmt ()
        else
          pp_print_cut fmt ();
        tag_string fmt p.separator_style sep;
        if p.space_after_separator then
          pp_print_string fmt " ";
        fprint_t fmt x
    ) tl;
    close_tag fmt p.body_style

  and fprint_opt_label fmt = function
      None -> ()
    | Some (lab, lp) ->
        open_tag fmt lp.label_style;
        fprint_t fmt lab;
        close_tag fmt lp.label_style;
        if lp.space_after_label then
          pp_print_string fmt " "

  (* Either horizontal or vertical list *)
  and fprint_list fmt label ((op, sep, cl, p) as param) = function
      [] ->
        fprint_opt_label fmt label;
        tag_string fmt p.opening_style op;
        if p.space_after_opening || p.space_before_closing then
          pp_print_string fmt " ";
        tag_string fmt p.closing_style cl

    | hd :: tl as l ->

        if tl = [] || p.separators_stick_left then
          fprint_list_stick_left fmt label param hd tl l
        else
          fprint_list_stick_right fmt label param hd tl l


  and fprint_list_stick_left fmt label (op, sep, cl, p) hd tl l =
    let indent = p.indent_body in
    pp_open_xbox fmt p indent;
    fprint_opt_label fmt label;

    tag_string fmt p.opening_style op;

    if p.space_after_opening then
      pp_print_space fmt ()
    else
      pp_print_cut fmt ();

    let open_extra, close_extra = extra_box p l in
    open_extra fmt;
    fprint_list_body_stick_left fmt p sep hd tl;
    close_extra fmt;

    if p.space_before_closing then
      pp_print_break fmt 1 (-indent)
    else
      pp_print_break fmt 0 (-indent);
    tag_string fmt p.closing_style cl;
    pp_close_box fmt ()

  and fprint_list_stick_right fmt label (op, sep, cl, p) hd tl l =
    let base_indent = p.indent_body in
    let sep_indent =
      String.length sep + (if p.space_after_separator then 1 else 0)
    in
    let indent = base_indent + sep_indent in

    pp_open_xbox fmt p indent;
    fprint_opt_label fmt label;

    tag_string fmt p.opening_style op;

    if p.space_after_opening then
      pp_print_space fmt ()
    else
      pp_print_cut fmt ();

    let open_extra, close_extra = extra_box p l in
    open_extra fmt;

    fprint_t fmt hd;
    List.iter (
      fun x ->
        if p.space_before_separator then
          pp_print_break fmt 1 (-sep_indent)
        else
          pp_print_break fmt 0 (-sep_indent);
        tag_string fmt p.separator_style sep;
        if p.space_after_separator then
          pp_print_string fmt " ";
        fprint_t fmt x
    ) tl;

    close_extra fmt;

    if p.space_before_closing then
      pp_print_break fmt 1 (-indent)
    else
      pp_print_break fmt 0 (-indent);
    tag_string fmt p.closing_style cl;
    pp_close_box fmt ()



  (* align_closing = false *)
  and fprint_list2 fmt (op, sep, cl, p) = function
      [] ->
        tag_string fmt p.opening_style op;
        if p.space_after_opening || p.space_before_closing then
          pp_print_string fmt " ";
        tag_string fmt p.closing_style cl

    | hd :: tl as l ->
        tag_string fmt p.opening_style op;
        if p.space_after_opening then
          pp_print_string fmt " ";

        pp_open_nonaligned_box fmt p 0 l ;
        if p.separators_stick_left then
          fprint_list_body_stick_left fmt p sep hd tl
        else
          fprint_list_body_stick_right fmt p sep hd tl;
        pp_close_box fmt ();

        if p.space_before_closing then
          pp_print_string fmt " ";
        tag_string fmt p.closing_style cl


  (* Printing a label:value pair.

     The opening bracket stays on the same line as the key, no matter what,
     and the closing bracket is either on the same line
     or vertically aligned with the beginning of the key.
  *)
  and fprint_pair fmt ((lab, lp) as label) x =
    match x with
        List ((op, sep, cl, p), l) when p.stick_to_label && p.align_closing ->
          fprint_list fmt (Some label) (op, sep, cl, p) l

      | _ ->
          let indent = lp.indent_after_label in
          pp_open_hvbox fmt 0;

          open_tag fmt lp.label_style;
          fprint_t fmt lab;
          close_tag fmt lp.label_style;

          (match lp.label_break with
           | `Auto ->
               if lp.space_after_label then
                 pp_print_break fmt 1 indent
               else
                 pp_print_break fmt 0 indent
           | `Always
           | `Always_rec ->
               pp_force_newline fmt ();
               pp_print_string fmt (String.make indent ' ')
           | `Never ->
               if lp.space_after_label then
                 pp_print_char fmt ' '
               else
                 ()
          );
          fprint_t fmt x;
          pp_close_box fmt ()

  let to_formatter fmt x =
    let x = rewrite x in
    fprint_t fmt x;
    pp_print_flush fmt ()

  let to_buffer ?(escape = `None) ?(styles = []) buf x =
    let fmt = Format.formatter_of_buffer buf in
    define_styles fmt escape styles;
    to_formatter fmt x

  let to_string ?escape ?styles x =
    let buf = Buffer.create 500 in
    to_buffer ?escape ?styles buf x;
    Buffer.contents buf

  let to_channel ?(escape = `None) ?(styles = []) oc x =
    let fmt = formatter_of_out_channel oc in
    define_styles fmt escape styles;
    to_formatter fmt x

  let to_stdout ?escape ?styles x = to_channel ?escape ?styles stdout x
  let to_stderr ?escape ?styles x = to_channel ?escape ?styles stderr x

end




module Compact =
struct
  open Printf

  let rec fprint_t buf = function
      Atom (s, _) -> Buffer.add_string buf s
    | List (param, l) -> fprint_list buf param l
    | Label (label, x) -> fprint_pair buf label x
    | Custom f ->
        (* Will most likely not be compact *)
        let fmt = formatter_of_buffer buf in
        f fmt;
        pp_print_flush fmt ()

  and fprint_list buf (op, sep, cl, _) = function
      [] -> bprintf buf "%s%s" op cl
    | x :: tl ->
        Buffer.add_string buf op;
        fprint_t buf x;
        List.iter (
          fun x ->
            Buffer.add_string buf sep;
            fprint_t buf x
        ) tl;
        Buffer.add_string buf cl

  and fprint_pair buf (label, _) x =
    fprint_t buf label;
    fprint_t buf x


  let to_buffer buf x = fprint_t buf x

  let to_string x =
    let buf = Buffer.create 500 in
    to_buffer buf x;
    Buffer.contents buf

  let to_formatter fmt x =
    let s = to_string x in
    Format.fprintf fmt "%s" s;
    pp_print_flush fmt ()

  let to_channel oc x =
    let buf = Buffer.create 500 in
    to_buffer buf x;
    Buffer.output_buffer oc buf

  let to_stdout x = to_channel stdout x
  let to_stderr x = to_channel stderr x
end




(* Obsolete *)
module Param =
struct
  let list_true = {
    space_after_opening = true;
    space_after_separator = true;
    space_before_separator = true;
    separators_stick_left = true;
    space_before_closing = true;
    stick_to_label = true;
    align_closing = true;
    wrap_body = `Wrap_atoms;
    indent_body = 2;
    list_style = None;
    opening_style = None;
    body_style = None;
    separator_style = None;
    closing_style = None;
  }

  let list_false = {
    space_after_opening = false;
    space_after_separator = false;
    space_before_separator = false;
    separators_stick_left = false;
    space_before_closing = false;
    stick_to_label = false;
    align_closing = false;
    wrap_body = `Wrap_atoms;
    indent_body = 2;
    list_style = None;
    opening_style = None;
    body_style = None;
    separator_style = None;
    closing_style = None;
  }

  let label_true = {
    label_break = `Auto;
    space_after_label = true;
    indent_after_label = 2;
    label_style = None;
  }

  let label_false = {
    label_break = `Auto;
    space_after_label = false;
    indent_after_label = 2;
    label_style = None;
  }
end

end
module Reason_layout
= struct
#1 "reason_layout.ml"
module Easy_format = Vendored_easy_format
module Comment = Reason_comment
module Range = Reason_location.Range

type break_criterion =
  | Never
  | IfNeed
  | Always
  (* Always_rec not only will break, it will break recursively up to the root *)
  | Always_rec

(*
 Modeling separators:
  Special ability to render the final separator distinctly. This is so we can
  replace them when they do/don't occur next to newlines.

    If sepLeft:true
    {
      final item1
      sep   item2
      sep   item3
    }

    If sepLeft:false
    {
      item1 sep
      item2 sep
      item3 final
    }
*)
(* You can't determine the final separator unless you specify a separator *)
type separator =
  | NoSep
  | Sep of string
  | SepFinal of string * string

(**
 * Module concerning info to correctly interleave whitespace above a layout node.
 *)
module WhitespaceRegion = struct
  type t = {
    (* range of the region *)
    range: Range.t;
    (* inserted comments into the whitespace region *)
    comments: Comment.t list;
    (* amount of newlines to be interleaved *)
    newlines: int;
  }

  let make ~range ~newlines () = {
    range;
    comments = [];
    newlines;
  }

  let newlines t = t.newlines
  let range t = t.range
  let comments t = t.comments

  let addComment t comment = { t with
    comments = comment::t.comments
  }

  let modifyNewlines t newNewlines = { t with
    newlines = newNewlines
  }
end

(**
 * These represent "intent to format" the AST, with some parts being annotated
 * with original source location. The benefit of tracking this in an
 * intermediate structure, is that we can then interleave comments throughout
 * the tree before generating the final representation. That prevents the
 * formatting code from having to thread comments everywhere.
 *
 * The final representation is rendered using Easy_format.
 *)
type t =
  | SourceMap of Location.t * t (* a layout with location info *)
  | Sequence of config * (t list)
  | Label of (Easy_format.t -> Easy_format.t -> Easy_format.t) * t * t
  | Easy of Easy_format.t
  (* Extra variant representing "intent to interleave whitespace" above a
   * layout node. Why the extra representation?
   * Since comments get interleaved after formatting the ast,
   * the inserting of actual newlines has to happen after the comments
   * have been formatted/inserted. *)
  | Whitespace of WhitespaceRegion.t * t

and config = {
  break: break_criterion;
  (* Break setting that becomes activated if a comment becomes interleaved into
   * this list. Typically, if not specified, the behavior from [break] will be
   * used.
   *)
  wrap: string * string;
  inline: bool * bool;
  sep: separator;
  indent: int;
  sepLeft: bool;
  preSpace: bool;
  (* Really means space_after_separator *)
  postSpace: bool;
  pad: bool * bool;
  (* A function, because the system might rearrange your previous settings, and
   * a function allows you to not be locked into some configuration that is made
   * out of date by the formatting system (suppose it removes the separator
   * token etc.) Having a function allows you to instruct our formatter how to
   * extend the "freshest" notion of the list config when comments are
   * interleaved. *)
  listConfigIfCommentsInterleaved: (config -> config) option;

  (* Formatting to use if an item in a list had an end-of-line comment appended *)
  listConfigIfEolCommentsInterleaved: (config -> config) option;
}

let string_of_easy = function
  | Easy_format.Atom (s,_) -> s
  | Easy_format.List (_,_) -> "list"
  | Easy_format.Label (_,_) -> "label"
  | Easy_format.Custom _ -> "custom"

let indent_more indent = "  " ^ indent

let dump_easy ppf easy =
  let printf fmt = Format.fprintf ppf fmt in
  let rec traverse indent = function
    | Easy_format.Atom (s,_) ->
      printf "%s Atom:'%s'\n" indent s
    | Easy_format.List ((opening, sep, closing, config), items) ->
      let break = (match config.wrap_body with
          | `No_breaks -> "No_breaks"
          | `Wrap_atoms -> "Wrap_atoms"
          | `Never_wrap -> "Never_wrap"
          | `Force_breaks -> "Force_breaks"
          | `Force_breaks_rec -> "Force_breaks_rec"
          | `Always_wrap -> "Always_wrap") in
      printf "%s List: open %s close %s sep %s break %s \n"
        indent opening closing sep break;
      let _ = List.map (traverse (indent_more indent)) items in
      ()
    | Easy_format.Label ((left, config), right) ->
      let break = match config.label_break with
        | `Never -> "Never"
        | `Always_rec -> "Always_rec"
        | `Auto -> "Auto"
        | `Always -> "Always" in
      printf "%s Label (break = %s): \n" indent break;
      printf "  %s left \n" indent;
      let indent' = indent_more indent in
      traverse indent' left;
      printf "  %s right \n" indent;
      traverse indent' right;
    | Easy_format.Custom _ ->
      printf "custom \n"
  in
  traverse "" easy

let dump ppf layout =
  let printf fmt = Format.fprintf ppf fmt in
  let rec traverse indent = function
    | SourceMap (loc, layout) ->
      printf "%s SourceMap [(%d:%d)-(%d:%d)]\n" indent
        loc.loc_start.Lexing.pos_lnum
        (loc.loc_start.Lexing.pos_cnum - loc.loc_start.Lexing.pos_bol)
        loc.loc_end.Lexing.pos_lnum
        (loc.loc_end.Lexing.pos_cnum - loc.loc_end.Lexing.pos_bol);
      traverse (indent_more indent) layout
    | Sequence (config, layout_list) ->
      let break = match config.break with
        | Never  -> "Never"
        | IfNeed  -> "if need"
        | Always  -> "Always"
        | Always_rec  -> "Always_rec" in
      let sep = match config.sep with
        | NoSep -> "NoSep"
        | Sep s -> "Sep '" ^ s ^ "'"
        | SepFinal (s, finalSep) -> "SepFinal ('" ^ s ^ "', '" ^ finalSep ^ "')" in
      printf "%s Sequence of %d, sep: %s, stick_to_left: %s break: %s\n"
        indent (List.length layout_list) sep (string_of_bool config.sepLeft) break;
      List.iter (traverse (indent_more indent)) layout_list
    | Label (_, left, right) ->
      printf "%s Label: \n" indent;
      printf "  %s left \n" indent;
      let indent' = indent_more (indent_more indent) in
      traverse indent' left;
      printf "  %s right \n" indent;
      traverse indent' right;
    | Easy e ->
      printf "%s Easy: '%s' \n" indent (string_of_easy e)
    | Whitespace (region, sublayout) ->
      let open WhitespaceRegion in
      printf" %s Whitespace (%d) [%d %d]:\n" indent region.newlines region.range.lnum_start region.range.lnum_end;
      (traverse (indent_more indent) sublayout)
  in
  traverse "" layout

let source_map ?(loc=Location.none) layout =
  if loc = Location.none then layout
  else SourceMap (loc, layout)

let default_list_settings = {
  Easy_format.space_after_opening = false;
  space_after_separator = false;
  space_before_separator = false;
  separators_stick_left = true;
  space_before_closing = false;
  stick_to_label = true;
  align_closing = true;
  wrap_body = `No_breaks;
  indent_body = 0;
  list_style = Some "list";
  opening_style = None;
  body_style = None;
  separator_style = None;
  closing_style = None;
}

let easy_settings_from_config
    { break; wrap; inline; indent; preSpace; postSpace; pad; sep } =
  (* TODO: Stop handling separators in Easy_format since we handle most of
      them before Easy_format anyways. There's just some that we still rely on
      Easy_format for. Easy_format's sep wasn't powerful enough.
  *)
  let (opn, cls) = wrap in
  let (padOpn, padCls) = pad in
  let (inlineStart, inlineEnd) = inline in
  let sepStr = match sep with NoSep -> "" | Sep s | SepFinal(s, _) -> s in
  (opn, sepStr, cls,
   { default_list_settings with
     Easy_format.
     wrap_body = (match break with
         | Never -> `No_breaks
         (* Yes, `Never_wrap is a horrible name - really means "if needed". *)
         | IfNeed -> `Never_wrap
         | Always -> `Force_breaks
         | Always_rec -> `Force_breaks_rec
       );
     indent_body = indent;
     space_after_separator = postSpace;
     space_before_separator = preSpace;
     space_after_opening = padOpn;
     space_before_closing = padCls;
     stick_to_label = inlineStart;
     align_closing = not inlineEnd;
   })

let to_easy_format layout =
  let rec traverse = function
    | Sequence (config, sublayouts) ->
      let items = List.map traverse sublayouts in
      Easy_format.List (easy_settings_from_config config, items)
    | Label (labelFormatter, left, right) ->
      labelFormatter (traverse left) (traverse right)
    | SourceMap (_, subLayout) ->
      traverse subLayout
    | Easy e -> e
    | Whitespace (_, subLayout) ->
      traverse subLayout
  in
  traverse layout

(** [getLocFromLayout] recursively takes the unioned location of its children,
 *  and returns the max one *)
let get_location layout =
  let union loc1 loc2 =
    match (loc1, loc2) with
    | None, _ -> loc2
    | _, None -> loc1
    | Some loc1, Some loc2  ->
      Some {loc1 with Location.loc_end = loc2.Location.loc_end}
  in
  let rec traverse = function
    | Sequence (_, subLayouts) ->
      let locs = List.map traverse subLayouts in
      List.fold_left union None locs
    | Label (_, left, right) ->
      union (traverse left) (traverse right)
    | SourceMap (loc, _) -> Some loc
    | Whitespace(_, sub) -> traverse sub
    | _ -> None
  in
  traverse layout

let is_before ~location layout =
  match get_location layout with
  | None -> true
  | Some loc -> Reason_syntax_util.location_is_before loc location

let contains_location layout ~location =
  match get_location layout with
  | None -> false
  | Some layout_loc -> Reason_syntax_util.location_contains layout_loc location

end
module Reason_pprint_ast : sig 
#1 "reason_pprint_ast.mli"
open Ast_404.Parsetree

val configure :
  width:int ->
  assumeExplicitArity:bool -> constructorLists:string list -> unit

val createFormatter : unit ->
  <
    case_list : Format.formatter -> case list -> unit;
    core_type : Format.formatter -> core_type -> unit;
    expression : Format.formatter -> expression -> unit;
    pattern : Format.formatter -> pattern -> unit;
    signature : Reason_comment.t list -> Format.formatter -> signature -> unit;
    structure : Reason_comment.t list -> Format.formatter -> structure -> unit;
    toplevel_phrase : Format.formatter -> toplevel_phrase -> unit;
  >

end = struct
#1 "reason_pprint_ast.ml"
(*
 * Copyright (c) 2015-present, Facebook, Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *  Forked from OCaml, which is provided under the license below:
 *
 *  Xavier Leroy, projet Cristal, INRIA Rocquencourt
 *
 *  Copyright © 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Inria
 *
 *  Permission is hereby granted, free of charge, to the Licensee obtaining a
 *  copy of this software and associated documentation files (the "Software"),
 *  to deal in the Software without restriction, including without limitation
 *  the rights to use, copy, modify, merge, publish, distribute, sublicense
 *  under any license of the Licensee's choice, and/or sell copies of the
 *  Software, subject to the following conditions:
 *
 *  1.	Redistributions of source code must retain the above copyright notice
 *  and the following disclaimer.
 *  2.	Redistributions in binary form must reproduce the above copyright
 *  notice, the following disclaimer in the documentation and/or other
 *  materials provided with the distribution.
 *  3.	All advertising materials mentioning features or use of the Software
 *  must display the following acknowledgement: This product includes all or
 *  parts of the Caml system developed by Inria and its contributors.
 *  4.	Other than specified in clause 3, neither the name of Inria nor the
 *  names of its contributors may be used to endorse or promote products
 *  derived from the Software without specific prior written permission.
 *
 *  Disclaimer
 *
 *  This software is provided by Inria and contributors “as is” and any express
 *  or implied warranties, including, but not limited to, the implied
 *  warranties of merchantability and fitness for a particular purpose are
 *  disclaimed. in no event shall Inria or its contributors be liable for any
 *  direct, indirect, incidental, special, exemplary, or consequential damages
 *  (including, but not limited to, procurement of substitute goods or
 *  services; loss of use, data, or profits; or business interruption) however
 *  caused and on any theory of liability, whether in contract, strict
 *  liability, or tort (including negligence or otherwise) arising in any way
 *  out of the use of this software, even if advised of the possibility of such
 *  damage.
 *
 *)

(* TODO more fine-grained precedence pretty-printing *)

module Easy_format = Vendored_easy_format

open Ast_404
open Asttypes
open Location
open Longident
open Parsetree
open Easy_format
open Reason_syntax_util
open Reason_attributes

module Comment = Reason_comment
module Layout = Reason_layout
module WhitespaceRegion = Layout.WhitespaceRegion
module Range = Reason_location.Range

let source_map = Layout.source_map

exception NotPossible of string

let commaTrail = Layout.SepFinal (",", Reason_syntax_util.TrailingCommaMarker.string)
let commaSep = Layout.Sep (",")

type ruleInfoData = {
  reducePrecedence: precedence;
  shiftPrecedence: precedence;
}

and ruleCategory =
  (* Printing will be parsed with very high precedence, so not much need to
     worry about ensuring it will reduce correctly. In short, you can put
     `FunctionApplication` content anywhere around an infix identifier without
     wrapping in parens. For example `myFunc x y z` or `if x {y} else {z}`
     The layout is kept in list form only to allow for elegant wrapping rules
     to take into consideration the *number* of high precedence parsed items. *)
  | FunctionApplication of Layout.t list
  (* Care should be taken to ensure the rule that caused it to be parsed will
     reduce again on the printed output - context should carefully consider
     wrapping in parens according to the ruleInfoData. *)
  | SpecificInfixPrecedence of ruleInfoData * resolvedRule
  (* Not safe to include anywhere between infix operators without wrapping in
     parens. This describes expressions like `fun x => x` which doesn't fit into
     our simplistic algorithm for printing function applications separated by infix.

     It might be possible to include these in between infix, but there are
     tricky rules to determining when these must be guarded by parens (it
     depends highly on context that is hard to reason about). It's so nuanced
     that it's easier just to always wrap them in parens.  *)
  | PotentiallyLowPrecedence of Layout.t
  (* Simple means it is clearly one token (such as (anything) or [anything] or identifier *)
  | Simple of Layout.t

(* Represents a ruleCategory where the precedence has been resolved.
 * The precedence of a ruleCategory gets resolved in `ensureExpression` or
 * `ensureContainingRule`. The result is either a plain Layout.t (where
 * parens probably have been applied) or an InfixTree containing the operator and
 * a left & right resolvedRule. The latter indicates that the precedence has been resolved,
 * but the actual formatting is deferred to a later stadium.
 * Think `let x = foo |> f |> z |>`, which requires a certain formatting style when
 * things break over multiple lines. *)
and resolvedRule =
  | LayoutNode of Layout.t
  | InfixTree of string * resolvedRule * resolvedRule

and associativity =
  | Right
  | Nonassoc
  | Left

and precedenceEntryType =
  | TokenPrecedence
  | CustomPrecedence

and precedence =
  | Token of string
  | Custom of string

(* Describes the "fixity" of a token, and stores its *printed* representation
   should it be rendered as infix/prefix (This rendering may be different than
   how it is stored in the AST). *)
and tokenFixity =
  (* Such as !simple_expr and ~!simple_expr. These function applications are
     considered *almost* "simple" because they may be allowed anywhere a simple
     expression is accepted, except for when on the left hand side of a
     dot/send. *)
  | AlmostSimplePrefix of string
  | UnaryPlusPrefix of string
  | UnaryMinusPrefix of string
  | UnaryNotPrefix of string
  | UnaryPostfix of string
  | Infix of string
  | Normal

(* Type which represents a resolvedRule's InfixTree flattened *)
type infixChain =
  | InfixToken of string
  | Layout of Layout.t

(* Helpers for dealing with extension nodes (%expr) *)

let expression_extension_sugar x =
  if x.pexp_attributes != [] then None
  else match x.pexp_desc with
    | Pexp_extension (name, PStr [{pstr_desc = Pstr_eval(expr, [])}])
      when name.txt <> "bs.obj" ->
      Some (name, expr)
    | _ -> None

let expression_immediate_extension_sugar x =
  match expression_extension_sugar x with
  | None -> (None, x)
  | Some (name, expr) ->
    match expr.pexp_desc with
    | Pexp_for _ | Pexp_while _ | Pexp_ifthenelse _
    | Pexp_function _ | Pexp_newtype _
    | Pexp_try _ | Pexp_match _ ->
      (Some name, expr)
    | _ -> (None, x)

let expression_not_immediate_extension_sugar x =
  match expression_immediate_extension_sugar x with
  | (Some _, _) -> None
  | (None, _) -> expression_extension_sugar x

let add_extension_sugar keyword = function
  | None -> keyword
  | Some str -> keyword ^ "%" ^ str.txt

let string_equal : string -> string -> bool = (=)

let longident_same l1 l2 =
  let rec equal l1 l2 =
    match l1, l2 with
    | Lident l1, Lident l2 -> string_equal l1 l2
    | Ldot (path1, l1), Ldot (path2, l2) ->
      equal path1 path2 && string_equal l1 l2
    | Lapply (l11, l12), Lapply (l21, l22) ->
      equal l11 l21 && equal l12 l22
    | _ -> false
  in
  equal l1.txt l2.txt

(* A variant of List.for_all2 that returns false instead of failing on lists
   of different size *)
let for_all2' pred l1 l2 =
  List.length l1 = List.length l2 &&
  List.for_all2 pred l1 l2

(*
   Checks to see if two types are the same modulo the process of varification
   which turns abstract types into type variables of the same name.
   For example, [same_ast_modulo_varification] would consider (a => b) and ('a
   => 'b) to have the same ast. This is useful in recovering syntactic sugar
   for explicit polymorphic types with locally abstract types.

   Does not compare attributes, or extensions intentionally.

   TODO: This has one more issue: We need to compare only accepting t1's type
   variables, to be considered compatible with t2's type constructors - not the
   other way around.
 *)
let same_ast_modulo_varification_and_extensions t1 t2 =
  let rec loop t1 t2 = match (t1.ptyp_desc, t2.ptyp_desc) with
    (* Importantly, cover the case where type constructors (of the form [a])
       are converted to type vars of the form ['a].
     *)
    | (Ptyp_constr({txt=Lident s1}, []), Ptyp_var s2) -> string_equal s1 s2
    (* Now cover the case where type variables (of the form ['a]) are
       converted to type constructors of the form [a].
     *)
    | (Ptyp_var s1, Ptyp_constr({txt=Lident s2}, [])) -> string_equal s1 s2
    (* Now cover the typical case *)
    | (Ptyp_constr(longident1, lst1), Ptyp_constr(longident2, lst2))  ->
      longident_same longident1 longident2 &&
      for_all2' loop lst1 lst2
    | (Ptyp_any, Ptyp_any) -> true
    | (Ptyp_var x1, Ptyp_var x2) -> string_equal x1 x2
    | (Ptyp_arrow (label1, core_type1, core_type1'), Ptyp_arrow (label2, core_type2, core_type2')) ->
      begin
         match label1, label2 with
         | Nolabel, Nolabel -> true
         | Labelled s1, Labelled s2 -> string_equal s1 s2
         | Optional s1, Optional s2 -> string_equal s1 s2
         | _ -> false
      end &&
      loop core_type1 core_type2 &&
      loop core_type1' core_type2'
    | (Ptyp_tuple lst1, Ptyp_tuple lst2) -> for_all2' loop lst1 lst2
    | (Ptyp_object (lst1, o1), Ptyp_object (lst2, o2)) ->
      let tester = fun (s1, _, t1) (s2, _, t2) ->
        string_equal s1 s2 &&
        loop t1 t2
      in
      for_all2' tester lst1 lst2 && o1 = o2
    | (Ptyp_class (longident1, lst1), Ptyp_class (longident2, lst2)) ->
      longident_same longident1 longident2 &&
      for_all2' loop lst1 lst2
    | (Ptyp_alias(core_type1, string1), Ptyp_alias(core_type2, string2)) ->
      loop core_type1 core_type2 &&
      string_equal string1 string2
    | (Ptyp_variant(row_field_list1, flag1, lbl_lst_option1), Ptyp_variant(row_field_list2, flag2, lbl_lst_option2)) ->
      for_all2' rowFieldEqual row_field_list1 row_field_list2 &&
      flag1 = flag2 &&
      lbl_lst_option1 = lbl_lst_option2
    | (Ptyp_poly (string_lst1, core_type1), Ptyp_poly (string_lst2, core_type2))->
      for_all2' string_equal string_lst1 string_lst2 &&
      loop core_type1 core_type2
    | (Ptyp_package(longident1, lst1), Ptyp_package (longident2, lst2)) ->
      longident_same longident1 longident2 &&
      for_all2' testPackageType lst1 lst2
    | (Ptyp_extension (s1, _), Ptyp_extension (s2, _)) ->
      string_equal s1.txt s2.txt
    | _ -> false
  and testPackageType (lblLongIdent1, ct1) (lblLongIdent2, ct2) =
    longident_same lblLongIdent1 lblLongIdent2 &&
    loop ct1 ct2
  and rowFieldEqual f1 f2 = match (f1, f2) with
    | ((Rtag(label1, _, flag1, lst1)), (Rtag (label2, _, flag2, lst2))) ->
      string_equal label1 label2 &&
      flag1 = flag2 &&
      for_all2' loop lst1 lst2
    | (Rinherit t1, Rinherit t2) -> loop t1 t2
    | _ -> false
  in
  loop t1 t2

let expandLocation pos ~expand:(startPos, endPos) =
  { pos with
    loc_start = {
      pos.loc_start with
        Lexing.pos_cnum = pos.loc_start.Lexing.pos_cnum + startPos
    };
    loc_end = {
      pos.loc_end with
        Lexing.pos_cnum = pos.loc_end.Lexing.pos_cnum + endPos
    }
  }

(* Computes the location of the attribute with the lowest line number
 * that isn't ghost. Useful to determine the start location of an item
 * in the parsetree that has attributes.
 * If there are no valid attributes, defaults to the passed location.
 * 1| [@attr]           --> notice how the "start" is determined
 * 2| let f = ...           by the attr on line 1, not the lnum of the `let`
 *)
let rec firstAttrLoc loc = function
  | ((attrLoc, _) : Ast_404.Parsetree.attribute) ::attrs ->
      if attrLoc.loc.loc_start.pos_lnum < loc.loc_start.pos_lnum
         && not attrLoc.loc.loc_ghost
      then
        firstAttrLoc attrLoc.loc attrs
      else
        firstAttrLoc loc attrs
  | [] -> loc

let extractLocationFromValBindList expr vbs =
  let rec extract loc = function
    | x::xs ->
        let {pvb_expr} = x in
        let loc = {loc with loc_end = pvb_expr.pexp_loc.loc_end} in
        extract loc xs
    | [] -> loc
  in
  let loc = match vbs with
    | x::xs ->
        let {pvb_pat; pvb_expr} = x in
        let loc = {pvb_pat.ppat_loc with loc_end = pvb_expr.pexp_loc.loc_end} in
        extract loc xs
    | [] -> expr.pexp_loc
  in
  { loc with loc_start = expr.pexp_loc.loc_start }

let extractLocValBinding {pvb_pat; pvb_expr; pvb_attributes;} =
  let estimatedLoc = firstAttrLoc pvb_pat.ppat_loc pvb_attributes in
  {estimatedLoc with loc_end = pvb_expr.pexp_loc.loc_end}

let extractLocModuleBinding {pmb_expr; pmb_attributes} =
  let estimatedLoc = firstAttrLoc pmb_expr.pmod_loc pmb_attributes in
  {estimatedLoc with loc_end = pmb_expr.pmod_loc.loc_end}

let extractLocModDecl {pmd_type; pmd_attributes} =
  let estimatedLoc = firstAttrLoc pmd_type.pmty_loc pmd_attributes in
  {estimatedLoc with loc_end = pmd_type.pmty_loc.loc_end}

let rec sequentialIfBlocks x =
  match x with
    | Some ({pexp_desc=Pexp_ifthenelse (e1, e2, els)}) -> (
       let (nestedIfs, finalExpression) = (sequentialIfBlocks els) in
       ((e1, e2)::nestedIfs, finalExpression)
      )
    | Some e -> ([], Some e)
    | None -> ([], None)

(*
  TODO: IDE integration beginning with Vim:

  - Create recovering version of parser that creates regions of "unknown"
    content in between let sequence bindings (anything between semicolons,
    really).
  - Use Easy_format's "style" features to tag each known node.
  - Turn those style annotations into editor highlight commands.
  - Editors have a set of keys that retrigger the parsing/rehighlighting
    process (typically newline/semi/close-brace).
  - On every parsing/rehighlighting, this pretty printer can be used to
    determine the highlighting of recovered regions, and the editor plugin can
    relegate highlighting of malformed regions to the editor which mostly does
    so based on token patterns.

*)

(*
     @avoidSingleTokenWrapping

  +-----------------------------+
  |+------+                     |     Another label
  || let ( \                    |
  ||    a  | Label              |
  ||    o  |                    |     The thing to the right of any label must be a
  ||    p _+ label RHS          |     list in order for it to wrap correctly. Lists
  ||  ): /   v                  |     will wrap if they need to/can. NON-lists will
  |+--+ sixteenTuple = echoTuple|(    wrap (indented) even though they're no lists!
  +---/ 0,\---------------------+     To prevent a single item from wrapping, make
        0,                            an unbreakable list via ensureSingleTokenSticksToLabel.
        0
      );                              In general, the best approach for indenting
                                      let bindings is to keep building up labels from
                                      the "let", always ensuring things that you want
                                      to wrap will either be lists or guarded in
                                      [ensureSingleTokenSticksToLabel].
                                      If you must join several lists together (via =)
                                      (or colon), ensure that joining is done via
                                      [makeList] (which won't break), and that new
                                      list is always appended to the left
                                      hand side of the label. (So that the right hand
                                      side may always be the untouched list that you want
                                      to wrap with aligned closing).
                                      Always make sure rhs of the label are the

                                      Creating nested labels will preserve the original
                                      indent location ("let" in this
                                      case) as long as that nesting is
                                      done on the left hand side of the labels.

*)

(*
    Table 2.1. Precedence and associativity.
    Precedence from highest to lowest: From RWOC, modified to include !=
    ---------------------------------------

    Operator prefix	Associativity
    !..., ?..., ~...	                              Prefix
    ., .(, .[	-
    function application, constructor, assert, lazy	Left associative
    -, -.                                           Prefix
    **..., lsl, lsr, asr                            Right associative
    *..., /..., %..., mod, land, lor, lxor          Left associative
    +..., -...                                      Left associative
    ::                                              Right associative
    @..., ^...                                      Right associative
---
    !=                                              Left associative (INFIXOP0 listed first in lexer)
    =..., <..., >..., |..., &..., $...              Left associative (INFIXOP0)
    =, <, >                                         Left associative (IN SAME row as INFIXOP0 listed after)
---
    &, &&                                           Right associative
    or, ||                                          Right associative
    ,                                               -
    :=, =                                         	Right associative
    if                                              -
    ;                                               Right associative


   Note: It would be much better if &... and |... were in separate precedence
   groups just as & and | are. This way, we could encourage custom infix
   operators to use one of the two precedences and no one would be confused as
   to precedence (leading &, | are intuitive). Two precedence classes for the
   majority of infix operators is totally sufficient.

   TODO: Free up the (&) operator from pervasives so it can be reused for
   something very common such as string concatenation or list appending.

   let x = tail & head;
 *)

(* "Almost Simple Prefix" function applications parse with the rule:

   `PREFIXOP simple_expr %prec below_DOT_AND_SHARP`, which in turn is almost
   considered a "simple expression" (it's acceptable anywhere a simple
   expression is except in a couple of edge cases.

   "Unary Prefix" function applications parse with the rule:

   `MINUS epxr %prec prec_unary_minus`, which in turn is considered an
   "expression" (not simple). All unary operators are mapped into an identifier
   beginning with "~".

   TODO: Migrate all "almost simple prefix" to "unsary prefix". When `!`
   becomes "not", then it will make more sense that !myFunc (arg) is parsed as
   !(myFunc arg) instead of (!myFunc) arg.

 *)
let almost_simple_prefix_symbols  = [ '!'; '?'; '~'] ;;
(* Subset of prefix symbols that have special "unary precedence" *)
let unary_minus_prefix_symbols  = [ "~-"; "~-."] ;;
let unary_plus_prefix_symbols  = ["~+"; "~+." ] ;;
let infix_symbols = [ '='; '<'; '>'; '@'; '^'; '|'; '&'; '+'; '-'; '*'; '/';
                      '$'; '%'; '\\'; '#' ]

let special_infix_strings =
  ["asr"; "land"; "lor"; "lsl"; "lsr"; "lxor"; "mod"; "or"; ":="; "!="; "!=="]

let updateToken = "="
let sharpOpEqualToken = "#="
let pipeFirstToken = "->"
let requireIndentFor = [updateToken; ":="]

let namedArgSym = "~"

let requireNoSpaceFor tok =
  tok = pipeFirstToken || (tok.[0] = '#' && tok <> "#=")

let funToken = "fun"

let getPrintableUnaryIdent s =
  if List.mem s unary_minus_prefix_symbols ||
     List.mem s unary_plus_prefix_symbols
  then String.sub s 1 (String.length s -1)
  else s

(* determines if the string is an infix string.
   checks backwards, first allowing a renaming postfix ("_102") which
   may have resulted from Pexp -> Texp -> Pexp translation, then checking
   if all the characters in the beginning of the string are valid infix
   characters. *)
let printedStringAndFixity = function
  | s when List.mem s special_infix_strings -> Infix s
  | "^" -> UnaryPostfix "^"
  | s when List.mem s.[0] infix_symbols -> Infix s
  (* Correctness under assumption that unary operators are stored in AST with
     leading "~" *)
  | s when List.mem s.[0] almost_simple_prefix_symbols &&
           not (List.mem s special_infix_strings) &&
           not (s = "?") -> (
      (* What *kind* of prefix fixity? *)
      if List.mem s unary_plus_prefix_symbols then
        UnaryPlusPrefix (getPrintableUnaryIdent s)
      else if List.mem s unary_minus_prefix_symbols then
        UnaryMinusPrefix (getPrintableUnaryIdent s)
      else if s = "!" then
        UnaryNotPrefix s
      else
        AlmostSimplePrefix s
  )
  | _ -> Normal


(* Also, this doesn't account for != and !== being infixop!!! *)
let isSimplePrefixToken s = match printedStringAndFixity s with
  | AlmostSimplePrefix _ | UnaryPostfix "^" -> true
  | _ -> false


(* Convenient bank of information that represents the parser's precedence
   rankings.  Each instance describes a precedence table entry. The function
   tests either a token string encountered by the parser, or (in the case of
   `CustomPrecedence`) the string name of a custom rule precedence declared
   using %prec *)
let rules = [
  [
    (TokenPrecedence, (fun s -> (Left, s = pipeFirstToken)));
    (TokenPrecedence, (fun s -> (Left, s.[0] = '#' &&
                                       s <> sharpOpEqualToken &&
                                       s <> "#")));
    (TokenPrecedence, (fun s -> (Left, s = ".")));
    (CustomPrecedence, (fun s -> (Left, s = "prec_lbracket")));
  ];
  [
    (CustomPrecedence, (fun s -> (Nonassoc, s = "prec_functionAppl")));
  ];
  [
    (TokenPrecedence, (fun s -> (Right, isSimplePrefixToken s)));
  ];
  [
    (TokenPrecedence, (fun s -> (Left, s = sharpOpEqualToken)));
  ];
  [
    (CustomPrecedence, (fun s -> (Nonassoc, s = "prec_unary")));
  ];
  (* Note the special case for "*\*", BARBAR, and LESSMINUS, AMPERSAND(s) *)
  [
    (TokenPrecedence, (fun s -> (Right, s = "**")));
    (TokenPrecedence, (fun s -> (Right, String.length s > 1 && s.[0] == '*' && s.[1] == '\\' && s.[2] == '*')));
    (TokenPrecedence, (fun s -> (Right, s = "lsl")));
    (TokenPrecedence, (fun s -> (Right, s = "lsr")));
    (TokenPrecedence, (fun s -> (Right, s = "asr")));
  ];
  [
    (TokenPrecedence, (fun s -> (Left, s.[0] == '*' && (String.length s == 1 || s != "*\\*"))));
    (TokenPrecedence, (fun s -> (Left, s.[0] == '/')));
    (TokenPrecedence, (fun s -> (Left, s.[0] == '%' )));
    (TokenPrecedence, (fun s -> (Left, s = "mod" )));
    (TokenPrecedence, (fun s -> (Left, s = "land" )));
    (TokenPrecedence, (fun s -> (Left, s = "lor" )));
    (TokenPrecedence, (fun s -> (Left, s = "lxor" )));
  ];
  [
    (* Even though these use the same *tokens* as unary plus/minus at parse
       time, when unparsing infix -/+, the CustomPrecedence rule would be
       incorrect to use, and instead we need a rule that models what infix
       parsing would use - just the regular token precedence without a custom
       precedence. *)
    (TokenPrecedence,
    (fun s -> (
      Left,
      if String.length s > 1 && s.[0] == '+' && s.[1] == '+' then
        (*
          Explicitly call this out as false because the other ++ case below
          should have higher *lexing* priority. ++operator_chars* is considered an
          entirely different token than +(non_plus_operator_chars)*
        *)
        false
      else
        s.[0] == '+'
    )));
    (TokenPrecedence, (fun s -> (Left, s.[0] == '-' && s <> pipeFirstToken)));
    (TokenPrecedence, (fun s -> (Left, s = "!" )));
  ];
  [
    (TokenPrecedence, (fun s -> (Right, s = "::")));
  ];
  [
    (TokenPrecedence, (fun s -> (Right, s.[0] == '@')));
    (TokenPrecedence, (fun s -> (Right, s.[0] == '^')));
    (TokenPrecedence, (fun s -> (Right, String.length s > 1 && s.[0] == '+' && s.[1] == '+')));
  ];
  [
    (TokenPrecedence, (fun s -> (Left, s.[0] == '=' && not (s = "=") && not (s = "=>"))));
    (TokenPrecedence, (fun s -> (Left, s.[0] == '<' && not (s = "<"))));
    (TokenPrecedence, (fun s -> (Left, s.[0] == '>' && not (s = ">"))));
    (TokenPrecedence, (fun s -> (Left, s = "!=")));  (* Not preset in the RWO table! *)
    (TokenPrecedence, (fun s -> (Left, s = "!==")));  (* Not preset in the RWO table! *)
    (TokenPrecedence, (fun s -> (Left, s = "==")));
    (TokenPrecedence, (fun s -> (Left, s = "===")));
    (TokenPrecedence, (fun s -> (Left, s = "<")));
    (TokenPrecedence, (fun s -> (Left, s = ">")));
    (TokenPrecedence, (fun s -> (Left, s.[0] == '|' && not (s = "||"))));
    (TokenPrecedence, (fun s -> (Left, s.[0] == '&' && not (s = "&") && not (s = "&&"))));
    (TokenPrecedence, (fun s -> (Left, s.[0] == '$')));
  ];
  [
    (CustomPrecedence, (fun s -> (Left, s = funToken)));
  ];
  [
    (TokenPrecedence, (fun s -> (Right, s = "&")));
    (TokenPrecedence, (fun s -> (Right, s = "&&")));
  ];
  [
    (TokenPrecedence, (fun s -> (Right, s = "or")));
    (TokenPrecedence, (fun s -> (Right, s = "||")));
  ];
  [
    (* The Left shouldn't ever matter in practice. Should never get in a
       situation with two consecutive infix ? - the colon saves us. *)
    (TokenPrecedence, (fun s -> (Left, s = "?")));
  ];
  [
    (TokenPrecedence, (fun s -> (Right, s = ":=")));
  ];
  [
    (TokenPrecedence, (fun s -> (Right, s = updateToken)));
  ];
  (* It's important to account for ternary ":" being lower precedence than "?" *)
  [
    (TokenPrecedence, (fun s -> (Right, s = ":")))
  ];
  [
    (TokenPrecedence, (fun s -> (Nonassoc, s = "=>")));
  ];
]

(* remove all prefixing backslashes, e.g. \=== becomes === *)
let without_prefixed_backslashes str =
  if str = "" then str
  else if String.get str 0 = '\\' then String.sub str 1 (String.length str - 1)
  else str

let indexOfFirstMatch ~prec lst =
  let rec aux n = function
    | [] -> None
    | [] :: tl -> aux (n + 1) tl
    | ((kind, tester) :: hdTl) :: tl ->
      match prec, kind with
      | Token str, TokenPrecedence | Custom str, CustomPrecedence ->
        let associativity, foundMatch = tester str in
        if foundMatch
        then Some (associativity, n)
        else aux n (hdTl::tl)
      | _ -> aux n (hdTl::tl)
  in
  aux 0 lst

(* Assuming it's an infix function application. *)
let precedenceInfo ~prec =
  (* Removes prefixed backslashes in order to do proper conversion *)
  let prec = match prec with
    | Token str -> Token (without_prefixed_backslashes str)
    | Custom _ -> prec
  in
  indexOfFirstMatch ~prec rules

let isLeftAssociative ~prec = match precedenceInfo ~prec with
  | None -> false
  | Some (Left, _) -> true
  | Some (Right, _) -> false
  | Some (Nonassoc, _) -> false

let isRightAssociative ~prec = match precedenceInfo ~prec with
  | None -> false
  | Some (Right, _) -> true
  | Some (Left, _) -> false
  | Some (Nonassoc, _) -> false

let higherPrecedenceThan c1 c2 =
  match ((precedenceInfo ~prec:c1), (precedenceInfo ~prec:c2)) with
  | (_, None)
  | (None, _) ->
    let (str1, str2) = match (c1, c2) with
      | (Token s1, Token s2) -> ("Token " ^ s1, "Token " ^ s2)
      | (Token s1, Custom s2) -> ("Token " ^ s1, "Custom " ^ s2)
      | (Custom s1, Token s2) -> ("Custom " ^ s1, "Token " ^ s2)
      | (Custom s1, Custom s2) -> ("Custom " ^ s1, "Custom " ^ s2)
    in
    raise (NotPossible ("Cannot determine precedence of two checks " ^ str1 ^ " vs. " ^ str2))
  | (Some (_, p1), Some (_, p2)) -> p1 < p2

let printedStringAndFixityExpr = function
  | {pexp_desc = Pexp_ident {txt=Lident l}} -> printedStringAndFixity l
  | _ -> Normal

(* which identifiers are in fact operators needing parentheses *)
let needs_parens txt =
  match printedStringAndFixity txt with
  | Infix _ -> true
  | UnaryPostfix _ -> true
  | UnaryPlusPrefix _ -> true
  | UnaryMinusPrefix _ -> true
  | UnaryNotPrefix _ -> true
  | AlmostSimplePrefix _ -> true
  | Normal -> false

(* some infixes need spaces around parens to avoid clashes with comment
   syntax. This isn't needed for comment syntax /* */ *)
let needs_spaces txt =
  txt.[0]='*' || txt.[String.length txt - 1] = '*'

let rec orList = function (* only consider ((A|B)|C)*)
  | {ppat_desc = Ppat_or (p1, p2)} -> (orList p1) @ (orList p2)
  | x -> [x]

let override = function
  | Override -> "!"
  | Fresh -> ""

(* variance encoding: need to sync up with the [parser.mly] *)
let type_variance = function
  | Invariant -> ""
  | Covariant -> "+"
  | Contravariant -> "-"

type construct =
  [ `cons of expression list
  | `list of expression list
  | `nil
  | `normal
  | `simple of Longident.t
  | `tuple ]

let view_expr x =
  match x.pexp_desc with
  | Pexp_construct ( {txt= Lident "()"},_) -> `tuple
  | Pexp_construct ( {txt= Lident "[]"},_) -> `nil
  | Pexp_construct ( {txt= Lident"::"},Some _) ->
    let rec loop exp acc = match exp with
      | {pexp_desc=Pexp_construct ({txt=Lident "[]"},_)} ->
        (List.rev acc,true)
      | {pexp_desc=
          Pexp_construct ({txt=Lident "::"},
                           Some ({pexp_desc= Pexp_tuple([e1;e2])}))} ->
        loop e2 (e1::acc)
      | e -> (List.rev (e::acc),false) in
    let (ls,b) = loop x []  in
    if b
    then `list ls
    else `cons ls
  | Pexp_construct (x,None) -> `simple x.txt
  | _ -> `normal

let is_simple_list_expr x =
  match view_expr x with
  | `list _ | `cons _ -> true
  | _ -> false

let is_simple_construct : construct -> bool = function
  | `nil | `tuple | `list _ | `simple _ | `cons _  -> true
  | `normal -> false

let uncurriedTable = Hashtbl.create 42

(* Determines if a list of expressions contains a single unit construct
 * e.g. used to check: MyConstructor() -> exprList == [()]
 * useful to determine if MyConstructor(()) should be printed as MyConstructor()
 * *)
let is_single_unit_construct exprList =
  match exprList with
  | x::[] ->
    let view = view_expr x in
    (match view with
    | `tuple -> true
    | _ -> false)
  | _ -> false

let detectTernary l = match l with
  | [{
      pc_lhs={ppat_desc=Ppat_construct ({txt=Lident "true"}, _)};
      pc_guard=None;
      pc_rhs=ifTrue
    };
    {
      pc_lhs={ppat_desc=Ppat_construct ({txt=Lident "false"}, _)};
      pc_guard=None;
      pc_rhs=ifFalse
    }] -> Some (ifTrue, ifFalse)
  | _ -> None
type funcApplicationLabelStyle =
  (* No attaching to the label, but if the entire application fits on one line,
     the entire application will appear next to the label as you 'd expect. *)
  | NeverWrapFinalItem
  (* Attach the first term if there are exactly two terms involved in the
     application.

     let x = firstTerm (secondTerm_1 secondTerm_2) thirdTerm;

     Ideally, we'd be able to attach all but the last argument into the label any
     time all but the last term will fit - and *not* when (attaching all but
     the last term isn't enough to prevent a wrap) - But there's no way to tell
     ahead of time if it would prevent a wrap.

     However, the number two is somewhat convenient. This models the
     indentation that you'd prefer in non-curried syntax languages like
     JavaScript, where application only ever has two terms.
  *)
  | WrapFinalListyItemIfFewerThan of int

type formatSettings = {
  (* Whether or not to expect that the original parser that generated the AST
     would have annotated constructor argument tuples with explicit arity to
     indicate that they are multiple arguments. (True if parsed in original
     OCaml AST, false if using Reason parser).
  *)
  constructorTupleImplicitArity: bool;
  space: int;

  (* For curried arguments in function *definitions* only: Number of [space]s
     to offset beyond the [let] keyword. Default 1.
  *)
  listsRecordsIndent: int;

  indentWrappedPatternArgs: int;

  indentMatchCases: int;

  (* Amount to indent in label-like constructs such as wrapped function
     applications, etc - or even record fields. This is not the same concept as an
     indented curried argument list. *)
  indentAfterLabels: int;

  (* Amount to indent after the opening brace of switch/try.
     Here's an example of what it would look like w/ [trySwitchIndent = 2]:
     Sticks the expression to the last item in a sequence in several [X | Y | Z
     => expr], and forces X, Y, Z to be split onto several lines. (Otherwise,
     sticking to Z would result in hanging expressions).  TODO: In the first case,
     it's clear that we want patterns to have an "extra" indentation with matching
     in a "match". Create extra config param to pass to [self#pattern] for extra
     indentation in this one case.

      switch x {
      | TwoCombos
          (HeresTwoConstructorArguments x y)
          (HeresTwoConstructorArguments a b) =>
          ((a + b) + x) + y;
      | Short
      | AlsoHasARecord a b {x, y} => (
          retOne,
          retTwo
        )
      | AlsoHasARecord a b {x, y} =>
        callMyFunction
          withArg
          withArg
          withArg
          withArg;
      }
  *)
  trySwitchIndent: int;


  (* In the case of two term function application (when flattened), the first
     term should become part of the label, and the second term should be able to wrap
     This doesn't effect n != 2.

       [true]
       let x = reallyShort allFitsOnOneLine;
       let x = someFunction {
         reallyLongObject: true,
         thatWouldntFitOnThe: true,
         firstLine: true
       };

       [false]
       let x = reallyShort allFitsOnOneLine;
       let x =
        someFunction
          {
            reallyLongObject: true,
            thatWouldntFitOnThe: true,
            firstLine: true
          };
  *)
  funcApplicationLabelStyle: funcApplicationLabelStyle;

  funcCurriedPatternStyle: funcApplicationLabelStyle;

  width: int;

  assumeExplicitArity: bool;

  constructorLists: string list;
}

let defaultSettings = {
  constructorTupleImplicitArity = false;
  space = 1;
  listsRecordsIndent = 2;
  indentWrappedPatternArgs = 2;
  indentMatchCases = 2;
  indentAfterLabels = 2;
  trySwitchIndent = 0;
  funcApplicationLabelStyle = WrapFinalListyItemIfFewerThan 3;
  (* WrapFinalListyItemIfFewerThan is currently a bad idea for curried
     arguments: It looks great in some cases:

        let myFun (a:int) :(
          int,
          string
        ) => (a, "this is a");

     But horrible in others:

        let myFun
            {
              myField,
              yourField
            } :someReturnType => myField + yourField;

        let myFun
            {            // Curried arg wraps
              myField,
              yourField
            } : (       // But the last is "listy" so it docks
          int,          // To the [let].
          int,
          int
        ) => myField + yourField;

     We probably want some special listy label docking/wrapping mode for
     curried function bindings.

  *)
  funcCurriedPatternStyle = NeverWrapFinalItem;
  width = 80;
  assumeExplicitArity = false;
  constructorLists = [];
}
let configuredSettings = ref defaultSettings

let configure ~width ~assumeExplicitArity ~constructorLists = (
  configuredSettings := {defaultSettings with width; assumeExplicitArity; constructorLists}
)

let createFormatter () =
let module Formatter = struct

let settings = !configuredSettings


(* How do we make
   this a label?

   /---------------------\
   let myVal = (oneThing, {
   field: [],
   anotherField: blah
   });

   But in this case, this wider region a label?
   /------------------------------------------------------\
   let myVal = callSomeFunc (oneThing, {field: [], anotherField: blah}, {
   boo: 'hi'
   });

   This is difficult. You must form a label from the preorder traversal of every
   node - except the last encountered in the traversal. An easier heuristic is:

   - The last argument to a functor application is expanded.

   React.CreateClass SomeThing {
   let render {props} => {
   };
   }

   - The last argument to a function application is expanded on the same line.
   - Only if it's not curried with another invocation.
   -- Optionally: "only if everything else is an atom"
   -- Optionally: "only if there are no other args"

   React.createClass someThing {
   render: fn x => y,
   }

   !!! NOT THIS
   React.createClass someThing {
   render: fn x => y,
   }
   somethingElse
*)

let isArityClear attrs =
  (!configuredSettings).assumeExplicitArity ||
  List.exists
    (function
      | ({txt="explicit_arity"}, _) -> true
      | _ -> false
    )
    attrs

let default_indent_body =
  settings.listsRecordsIndent * settings.space

let makeList
    ?listConfigIfCommentsInterleaved
    ?listConfigIfEolCommentsInterleaved
    ?(break=Layout.Never)
    ?(wrap=("", ""))
    ?(inline=(true, false))
    ?(sep=Layout.NoSep)
    ?(indent=default_indent_body)
    ?(sepLeft=true)
    ?(preSpace=false)
    ?(postSpace=false)
    ?(pad=(false,false))
    lst =
  let config =
    { Layout.
      listConfigIfCommentsInterleaved; listConfigIfEolCommentsInterleaved;
      break; wrap; inline; sep; indent; sepLeft; preSpace; postSpace; pad;
    }
  in
  Layout.Sequence (config, lst)

let makeAppList = function
  | [hd] -> hd
  | l -> makeList ~inline:(true, true) ~postSpace:true ~break:IfNeed l

let makeTup ?(wrap=("", ""))?(trailComma=true) ?(uncurried = false) l =
  let (lwrap, rwrap) = wrap in
  let lparen = lwrap ^ (if uncurried then "(. " else "(") in
  makeList
    ~wrap:(lparen, ")" ^ rwrap)
    ~sep:(if trailComma then commaTrail else commaSep)
    ~postSpace:true
    ~break:IfNeed l

let ensureSingleTokenSticksToLabel x =
  let listConfigIfCommentsInterleaved cfg =
    let inline = (true, true) and postSpace = true and indent = 0 in
    {cfg with Layout.break=Always_rec; postSpace; indent; inline}
  in
  makeList ~listConfigIfCommentsInterleaved [x]

let unbreakLabelFormatter formatter =
  let newFormatter labelTerm term =
    match formatter labelTerm term with
    | Easy_format.Label ((labelTerm, settings), term) ->
       Easy_format.Label ((labelTerm,
                           {settings with label_break = `Never}),
                          term)
    | _ -> failwith "not a label"
  in newFormatter

let inlineLabel labelTerm term =
  let settings = {
    label_break = `Never;
    space_after_label = true;
    indent_after_label = 0;
    label_style = Some "inlineLabel";
  } in
  Easy_format.Label ((labelTerm, settings), term)


(* Just for debugging: Set debugWithHtml = true *)
let debugWithHtml = ref false

let html_escape_string s =
  let buf = Buffer.create (2 * String.length s) in
  for i = 0 to String.length s - 1 do
    match s.[i] with
        '&' -> Buffer.add_string buf "&amp;"
      | '<' -> Buffer.add_string buf "&lt;"
      | '>' -> Buffer.add_string buf "&gt;"
      | c -> Buffer.add_char buf c
  done;
  Buffer.contents buf

let html_escape = `Escape_string html_escape_string

let html_style = [
  "atom", { Easy_format.tag_open = "<a>"; tag_close = "</a>" };
  "body", { tag_open = "<lb>"; tag_close = "</lb>" };
  "list", { tag_open = "<l>"; tag_close = "</l>" };
  "op", { tag_open = "<op>"; tag_close = "</op>" };
  "cl", { tag_open = "<cl>"; tag_close = "</cl>" };
  "sep", { tag_open = "<sep>"; tag_close = "</sep>" };
  "label", { tag_open = "<la>"; tag_close = "</la>" };
]

let easyLabel
    ?(break=`Auto) ?(space=false) ?(indent=settings.indentAfterLabels)
    labelTerm term =
  let settings = {
    label_break = break;
    space_after_label = space;
    indent_after_label = indent;
    label_style = Some "label";
  } in
  Easy_format.Label ((labelTerm, settings), term)

let label ?break ?space ?indent (labelTerm:Layout.t) (term:Layout.t) =
  Layout.Label (easyLabel ?break ?indent ?space, labelTerm, term)

let atom ?loc str =
  let style = { Easy_format.atom_style = Some "atomClss" } in
  source_map ?loc (Layout.Easy (Easy_format.Atom(str, style)))

(** Take x,y,z and n and generate [x, y, z, ...n] *)
let makeES6List ?wrap:((lwrap,rwrap)=("", "")) lst last =
  makeList
    ~wrap:(lwrap ^ "[", "]" ^ rwrap)
    ~break:IfNeed ~postSpace:true ~sep:commaTrail
    (lst @ [makeList [atom "..."; last]])

let makeNonIndentedBreakingList lst =
    (* No align closing: So that semis stick to the ends of every break *)
  makeList ~break:Always_rec ~indent:0 ~inline:(true, true) lst

(* Like a <span> could place with other breakableInline lists without upsetting final semicolons *)
let makeSpacedBreakableInlineList lst =
  makeList ~break:IfNeed ~inline:(true, true) ~postSpace:true lst

let makeCommaBreakableListSurround opn cls lst =
  makeList ~break:IfNeed ~postSpace:true ~sep:(Sep ",") ~wrap:(opn, cls) lst

(* TODO: Allow configuration of spacing around colon symbol *)

let formatPrecedence ?(inline=false) ?(wrap=("(", ")")) ?loc formattedTerm =
  source_map ?loc (makeList ~inline:(true, inline) ~wrap ~break:IfNeed [formattedTerm])

let wrap fn term =
  ignore (Format.flush_str_formatter ());
  fn Format.str_formatter term;
  atom (Format.flush_str_formatter ())

(* Don't use `trim` since it kills line return too? *)
let rec beginsWithStar_ line length idx =
  if idx = length then false else
    match String.get line idx with
    | '*' -> true
    | '\t' | ' ' -> beginsWithStar_ line length (idx + 1)
    | _ -> false

let beginsWithStar line = beginsWithStar_ line (String.length line) 0

let rec numLeadingSpace_ line length idx accum =
  if idx = length then accum else
    match String.get line idx with
    | '\t' | ' ' -> numLeadingSpace_ line length (idx + 1) (accum + 1)
    | _ -> accum

let numLeadingSpace line = numLeadingSpace_ line (String.length line) 0 0

(* Computes the smallest leading spaces for non-empty lines *)
let smallestLeadingSpaces strs =
  let rec smallestLeadingSpaces curMin strs = match strs with
    | [] -> curMin
    | ""::tl -> smallestLeadingSpaces curMin tl
    | hd::tl ->
      let leadingSpace = numLeadingSpace hd in
      let nextMin = min curMin leadingSpace in
      smallestLeadingSpaces nextMin tl
  in
  smallestLeadingSpaces 99999 strs

let rec isSequencey = function
  | Layout.SourceMap (_, sub) -> isSequencey sub
  | Layout.Sequence _ -> true
  | Layout.Label (_, _, _) -> false
  | Layout.Easy (Easy_format.List _) -> true
  | Layout.Easy _ -> false
  | Layout.Whitespace (_, sub) -> isSequencey sub

let inline ?(preSpace=false) ?(postSpace=false) labelTerm term =
  makeList [labelTerm; term]
    ~inline:(true, true) ~postSpace ~preSpace ~indent:0 ~break:Layout.Never

let breakline labelTerm term =
  makeList [labelTerm; term]
    ~inline:(true, true) ~indent:0 ~break:Always_rec

let insertBlankLines n term =
  if n = 0
  then term
  else makeList ~inline:(true, true) ~indent:0 ~break:Always_rec
      (Array.to_list (Array.make n (atom "")) @ [term])

let string_after s n = String.sub s n (String.length s - n)

(* This is a special-purpose functions only used by `formatComment_`. Notice we
skip a char below during usage because we know the comment starts with `/*` *)
let rec lineZeroMeaningfulContent_ line length idx accum =
  if idx = length then None
  else
    let ch = String.get line idx in
    if ch = '\t' || ch = ' ' || ch = '*' then
      lineZeroMeaningfulContent_ line length (idx + 1) (accum + 1)
    else Some accum

let lineZeroMeaningfulContent line =
  lineZeroMeaningfulContent_ line (String.length line) 1 0

let formatComment_ txt =
  let commLines =
    Reason_syntax_util.split_by ~keep_empty:true (fun x -> x = '\n')
      (Comment.wrap txt)
  in
  match commLines with
  | [] -> atom ""
  | [hd] ->
    atom hd
  | zero::one::tl ->
    let attemptRemoveCount = (smallestLeadingSpaces (one::tl)) in
    let leftPad =
      if beginsWithStar one then 1
      else match lineZeroMeaningfulContent zero with
        | None -> 1
        | Some num -> num + 1
    in
    let padNonOpeningLine s =
      let numLeadingSpaceForThisLine = numLeadingSpace s in
      if String.length s == 0 then ""
      else (String.make leftPad ' ') ^
           (string_after s (min attemptRemoveCount numLeadingSpaceForThisLine)) in
    let lines = zero :: List.map padNonOpeningLine (one::tl) in
    makeList ~inline:(true, true) ~indent:0 ~break:Always_rec (List.map atom lines)

let formatComment comment =
  source_map ~loc:(Comment.location comment) (formatComment_ comment)

let rec append ?(space=false) txt = function
  | Layout.SourceMap (loc, sub) ->
    Layout.SourceMap (loc, append ~space txt sub)
  | Sequence (config, l) when snd config.wrap <> "" ->
    let sep = if space then " " else "" in
    Sequence ({config with wrap=(fst config.wrap, snd config.wrap ^ sep ^ txt)}, l)
  | Sequence (config, []) ->
    Sequence (config, [atom txt])
  | Sequence ({sep=NoSep} as config, l)
  | Sequence ({sep=Sep("")} as config, l) ->
    let len = List.length l in
    let sub = List.mapi (fun i layout ->
        (* append to the end of the list *)
        if i + 1 = len then
          append ~space txt layout
        else
          layout
      ) l in
    Sequence (config, sub)
  | Label (formatter, left, right) ->
    Label (formatter, left, append ~space txt right)
  | Whitespace(info, sub) ->
      Whitespace(info, append ~space txt sub)
  | layout ->
    inline ~postSpace:space layout (atom txt)

let appendSep spaceBeforeSep sep layout =
  append (if spaceBeforeSep then " " ^ sep else sep) layout

let rec flattenCommentAndSep ?spaceBeforeSep:(spaceBeforeSep=false) ?sepStr = function
  | Layout.SourceMap (loc, sub) ->
     Layout.SourceMap (loc, flattenCommentAndSep ~spaceBeforeSep ?sepStr sub)
  | Layout.Whitespace(info, sub) ->
     Layout.Whitespace(info, flattenCommentAndSep ~spaceBeforeSep ?sepStr sub)
  | layout ->
     begin
       match sepStr with
       | None -> layout
       | Some sep -> appendSep spaceBeforeSep sep layout
     end

let rec preOrderWalk f layout =
  match f layout with
  | Layout.Sequence (listConfig, sublayouts) ->
    let newSublayouts = List.map (preOrderWalk f) sublayouts in
    Layout.Sequence (listConfig, newSublayouts)
  | Layout.Label (formatter, left, right) ->
    let newLeftLayout = preOrderWalk f left in
    let newRightLayout = preOrderWalk f right in
    Layout.Label (formatter, newLeftLayout, newRightLayout)
  | Layout.SourceMap (loc, sub) ->
    Layout.SourceMap (loc, preOrderWalk f sub)
  | Layout.Easy _ as layout -> layout
  | Layout.Whitespace (info, sub) ->
      Layout.Whitespace(info, preOrderWalk f sub)

(** Recursively unbreaks a layout to make sure they stay within the same line *)
let unbreaklayout = preOrderWalk (function
  | Layout.Sequence (listConfig, sublayouts) ->
    Layout.Sequence ({listConfig with break=Layout.Never}, sublayouts)
  | Layout.Label (formatter, left, right) ->
    Layout.Label (unbreakLabelFormatter formatter, left, right)
  | layout -> layout
)

(** [consolidateSeparator layout] walks the [layout], extract separators out of each
 *  list and insert them into PrintTree as separated items
 *)
let consolidateSeparator l = preOrderWalk (function
  | Sequence (listConfig, sublayouts) when listConfig.sep != NoSep && listConfig.sepLeft ->
     (* TODO: Support !sepLeft, and this should apply to the *first* separator if !sepLeft.  *)
     let sublayoutsLen = List.length sublayouts in
     let mapSublayout i layout =
        match (listConfig.sep, (i + 1 = sublayoutsLen)) with
        | (NoSep, _) -> raise (NotPossible "We already covered this case. This shouldn't happen.")
        | (Sep _, true) -> layout
        | (SepFinal (sepStr, _), false)
        | (Sep sepStr, false) ->
          flattenCommentAndSep ~spaceBeforeSep:listConfig.preSpace ~sepStr:sepStr layout
        | (SepFinal (_, finalSepStr), true) ->
          flattenCommentAndSep ~spaceBeforeSep:listConfig.preSpace ~sepStr:finalSepStr layout
     in
     let layoutsWithSepAndComment = List.mapi mapSublayout sublayouts in
     let sep = Layout.NoSep in
     let preSpace = false in
     Sequence ({listConfig with sep; preSpace}, layoutsWithSepAndComment)
  | layout -> layout
) l


(** [insertLinesAboveItems layout] walks the [layout] and insert empty lines *)
let insertLinesAboveItems items = preOrderWalk (function
  | Whitespace(region, sub) ->
      insertBlankLines (WhitespaceRegion.newlines region) sub
  | layout -> layout
) items

let insertCommentIntoWhitespaceRegion comment region subLayout =
  let cl = Comment.location comment in
  let range = WhitespaceRegion.range region in
  (* append the comment to the list of inserted comments in the whitespace region *)
  let nextRegion = WhitespaceRegion.addComment region comment in
  let formattedComment = formatComment comment in
  match WhitespaceRegion.comments region with
  (* the comment inserted into the whitespace region is the first in the region *)
  | [] ->
      (*
       * 1| let a = 1;
       * 2|
       * 3| /* comment at end of whitespace region */
       * 4| let b = 2;
       *)
      if range.lnum_end = cl.loc_end.pos_lnum then
        let subLayout = breakline formattedComment subLayout in
        Layout.Whitespace(nextRegion, subLayout)

      (*
       * 1| let a = 1;
       * 2| /* comment at start of whitespace region */
       * 3|
       * 4| let b = 2;
       *)
      else if range.lnum_start = cl.loc_start.pos_lnum then
        let subLayout = breakline formattedComment (insertBlankLines 1 subLayout) in
        let nextRegion = WhitespaceRegion.modifyNewlines nextRegion 0 in
        Whitespace(nextRegion, subLayout)

      (*
       * 1| let a = 1;
       * 2|
       * 3| /* comment floats in whitespace region */
       * 4|
       * 5| let b = 2;
       *)
      else
        let subLayout = breakline formattedComment (insertBlankLines 1 subLayout) in
        Whitespace(nextRegion, subLayout)

  (* The whitespace region contains already inserted comments *)
  | prevComment::_cs ->
      let pcl = Comment.location prevComment in
      (* check if the comment is attached to the start of the region *)
      let attachedToStartRegion = cl.loc_start.pos_lnum = range.lnum_start in
      let nextRegion =
        (*
         * 1| let a = 1;
         * 2| /* comment sits on the beginning of the region */
         * 3| /* previous comment */
         * 4|
         * 5| let b = 2;
         *)
        if attachedToStartRegion then
          (* we don't want a newline between `let a = 1` and the `comment sits
           * on the beginning of the region` comment*)
          WhitespaceRegion.modifyNewlines nextRegion 0
        (*
         * 1| let a = 1;
         * 2|
         * 3| /* comment isn't located at the beginnin of a region*/
         * 4| /* previous comment */
         * 5|
         * 6| let b = 2;
         *)
        else
          nextRegion
      in
      (*
       * 1| let a = 1;
       * 2| /* comment */
       * 3|                      --> whitespace between
       * 4| /* previous comment */
       * 5| let b = 1;
       *)
      if Reason_location.hasSpaceBetween pcl cl then
      (* pcl.loc_start.pos_lnum - cl.loc_end.pos_lnum > 1 then *)
        let subLayout = breakline formattedComment (insertBlankLines 1 subLayout) in
        let withComment = Layout.Whitespace(nextRegion, subLayout) in
        withComment

      (*
       * 1| let a = 1;
       * 2|
       * 3| /* comment */          | no whitespace between `comment`
       * 4| /* previous comment */ | and `previous comment`
       * 5| let b = 1;
       *)
      else
        let subLayout = breakline formattedComment subLayout in
        let withComment =  Layout.Whitespace(nextRegion, subLayout) in
        withComment

(**
 * prependSingleLineComment inserts a single line comment right above layout
 *)
let rec prependSingleLineComment comment layout =
  match layout with
  | Layout.SourceMap (loc, sub) ->
     Layout.SourceMap (loc, prependSingleLineComment comment sub)
  | Sequence (config, hd::tl) when config.break = Always_rec->
     Sequence(config, (prependSingleLineComment comment hd)::tl)
  | Whitespace(info, sub) ->
      insertCommentIntoWhitespaceRegion comment info sub
  | layout ->
      breakline (formatComment comment) layout

(* breakAncestors break ancestors above node, but not comment attachment itself.*)
let appendComment ~breakAncestors layout comment =
  let text = Comment.wrap comment in
  let layout = match layout with
  | Layout.Whitespace(info, sublayout) ->
    Layout.Whitespace(info, makeList ~break:Layout.Never ~postSpace:true [sublayout; atom text])
  | layout ->
      makeList ~break:Layout.Never ~postSpace:true [layout; atom text]
  in
  if breakAncestors then
    makeList ~inline:(true, true) ~postSpace:false ~preSpace:true ~indent:0
      ~break:Always_rec [layout]
  else
    layout

(**
 * [looselyAttachComment layout comment] preorderly walks the layout and
 * find a place where the comment can be loosely attached to
 *)
let rec looselyAttachComment ~breakAncestors layout comment =
  let location = Comment.location comment in
  match layout with
  | Layout.SourceMap (loc, sub) ->
     Layout.SourceMap (loc, looselyAttachComment ~breakAncestors sub comment)
  | Layout.Whitespace (info, sub) ->
     Layout.Whitespace(info, looselyAttachComment ~breakAncestors sub comment)
  | Easy _ ->
     inline ~postSpace:true layout (formatComment comment)
  | Sequence (listConfig, subLayouts)
    when List.exists (Layout.contains_location ~location) subLayouts ->
     (* If any of the subLayout strictly contains this comment, recurse into to it *)
    let recurse_sublayout layout =
      if Layout.contains_location layout ~location
      then begin
        looselyAttachComment ~breakAncestors layout comment
      end
      else layout
    in
    Sequence (listConfig, List.map recurse_sublayout subLayouts)
  | Sequence (listConfig, subLayouts) when subLayouts == [] ->
    (* If there are no subLayouts (empty body), create a Sequence of just the comment *)
    Sequence (listConfig, [formatComment comment])
  | Sequence (listConfig, subLayouts) ->
    let (beforeComment, afterComment) =
      Reason_syntax_util.pick_while (Layout.is_before ~location) subLayouts in
    let newSubLayout = match List.rev beforeComment with
      | [] ->
        Reason_syntax_util.map_first (prependSingleLineComment comment) afterComment
      | hd :: tl ->
        List.rev_append
          (appendComment ~breakAncestors hd comment :: tl) afterComment
    in
    Sequence (listConfig, newSubLayout)
  | Label (formatter, left, right) ->
    let newLeft, newRight =
      match (Layout.get_location left, Layout.get_location right) with
      | (None, None) ->
        (left, looselyAttachComment ~breakAncestors right comment)
      | (_, Some loc2) when location_contains loc2 location ->
        (left, looselyAttachComment ~breakAncestors right comment)
      | (Some loc1, _) when location_contains loc1 location ->
        (looselyAttachComment ~breakAncestors left comment, right)
      | (Some loc1, Some _) when location_is_before location loc1 ->
        (prependSingleLineComment comment left, right)
      | (Some _, Some loc2) when location_is_before location loc2 ->
        (left, prependSingleLineComment comment right)
      | _ -> (left, appendComment ~breakAncestors right comment)
    in
    Label (formatter, newLeft, newRight)

(**
 * [insertSingleLineComment layout comment] preorderly walks the layout and
 * find a place where the SingleLineComment can be fit into
 *)
let rec insertSingleLineComment layout comment =
  let location = Comment.location comment in
  match layout with
  | Layout.SourceMap (loc, sub) ->
    Layout.SourceMap (loc, insertSingleLineComment sub comment)
  | Layout.Whitespace (info, sub) ->
      let range = WhitespaceRegion.range info in
      if Range.containsLoc range location then
        insertCommentIntoWhitespaceRegion comment info sub
      else
        Layout.Whitespace(info, insertSingleLineComment sub comment)
  | Easy _ ->
    prependSingleLineComment comment layout
  | Sequence (listConfig, subLayouts) when subLayouts == [] ->
    (* If there are no subLayouts (empty body), create a Sequence of just the
     * comment. We need to be careful when the empty body contains a //-style
     * comment. Example:
     *   let make = () => {
     *     //
     *   };
     * It is clear that the sequence needs to always break here, otherwise
     * we get a parse error: let make = () => { // };
     * The closing brace and semicolon `};` would become part of the comment…
     *)
    let listConfig =
      if Reason_comment.isLineComment comment then
        {listConfig with break = Always_rec}
      else
        listConfig
    in
    Sequence (listConfig, [formatComment comment])
  | Sequence (listConfig, subLayouts) ->
    let (beforeComment, afterComment) =
      Reason_syntax_util.pick_while (Layout.is_before ~location) subLayouts in
    begin match afterComment with
      (* Nothing in the list is after comment, attach comment to the statement before the comment *)
      | [] ->
        let break sublayout = breakline sublayout (formatComment comment) in
        Sequence (listConfig, Reason_syntax_util.map_last break beforeComment)
      | hd::tl ->
        let afterComment =
          match Layout.get_location hd with
          | Some loc when location_contains loc location ->
            insertSingleLineComment hd comment :: tl
          | Some loc ->
            Layout.SourceMap (loc, (prependSingleLineComment comment hd)) :: tl
          | _ ->
            prependSingleLineComment comment hd :: tl
        in
        Sequence (listConfig, beforeComment @ afterComment)
    end
  | Label (formatter, left, right) ->
    let leftLoc = Layout.get_location left in
    let rightLoc = Layout.get_location right in
    let newLeft, newRight = match (leftLoc, rightLoc) with
      | (None, None) ->
        (left, insertSingleLineComment right comment)
      | (_, Some loc2) when location_contains loc2 location ->
        (left, insertSingleLineComment right comment)
      | (Some loc1, _) when location_contains loc1 location ->
        (insertSingleLineComment left comment, right)
      | (Some loc1, Some _) when location_is_before location loc1 ->
        (prependSingleLineComment comment left, right)
      | (Some _, Some loc2) when location_is_before location loc2 ->
        (left, prependSingleLineComment comment right)
      | _ ->
        (left, breakline right (formatComment comment))
    in
    Label (formatter, newLeft, newRight)

let rec attachCommentToNodeRight layout comment =
  match layout with
  | Layout.Sequence (config, sub) when snd config.wrap <> "" ->
    (* jwalke: This is quite the abuse of the "wrap" config *)
    let lwrap, rwrap = config.wrap in
    let rwrap = rwrap ^ " " ^ Comment.wrap comment in
    Layout.Sequence ({config with wrap=(lwrap, rwrap)}, sub)
  | Layout.SourceMap (loc, sub) ->
    Layout.SourceMap (loc, attachCommentToNodeRight sub comment)
  | layout -> inline ~postSpace:true layout (formatComment comment)

let rec attachCommentToNodeLeft comment layout =
  match layout with
  | Layout.Sequence (config, sub) when snd config.wrap <> "" ->
    let lwrap, rwrap = config.wrap in
    let lwrap = Comment.wrap comment ^ " " ^ lwrap in
    Layout.Sequence ({config with wrap = (lwrap, rwrap)}, sub)
  | Layout.SourceMap (loc, sub) ->
    Layout.SourceMap (loc, attachCommentToNodeLeft comment sub )
  | layout ->
    Layout.Label (inlineLabel, formatComment comment, layout)

(** [tryPerfectlyAttachComment layout comment] postorderly walk the [layout] and tries
 *  to perfectly attach a comment with a layout node.
 *
 *  Perfectly attach here means a comment's start location is equal to the node's end location
 *  and vice versa.
 *
 *  If the comment can be perfectly attached to any layout node, returns (newLayout, None),
 *  meaning the comment is consumed. Otherwise returns the (unchangedLayout, Some comment),
 *  meaning the comment is not consumed.
 *
 * "perfect attachment" doesn't make sense for end of line comments:
 *
 *       {
 *         x: 0,
 *         y: 0
 *       }
 *
 * One of these will be "perfectly attached" to the zero and the other won't.
 * Why should the comma have such an influence? Trailing commas and semicolons
 * may be inserted or removed, an we need end-of-line comments to never be
 * impacted by that. Therefore, never try to "perfectly" attach EOL comments.
 *)
let rec tryPerfectlyAttachComment layout = function
  | None -> (layout, None)
  | Some comment -> perfectlyAttachComment comment layout

and perfectlyAttachComment comment = function
  | Layout.Sequence (listConfig, subLayouts) ->
    let distributeCommentIntoSubLayouts (i, processed, newComment) layout =
      let (layout, newComment) =
        tryPerfectlyAttachComment layout newComment in
      (i + 1, layout::processed, newComment)
    in
    let (_, processed, consumed) =
      List.fold_left
        distributeCommentIntoSubLayouts
        (0, [], Some comment) (List.rev subLayouts)
    in
    Layout.Sequence (listConfig, processed), consumed
  | Layout.Label (labelFormatter, left, right) ->
    let (newRight, comment) = perfectlyAttachComment comment right in
    let (newLeft, comment) = tryPerfectlyAttachComment left comment in
    Layout.Label (labelFormatter, newLeft, newRight), comment
  | Layout.SourceMap (loc, subLayout) ->
    let commloc = Comment.location comment in
    if loc.loc_end.Lexing.pos_lnum = loc.loc_start.Lexing.pos_lnum &&
       commloc.loc_start.Lexing.pos_cnum = loc.loc_end.Lexing.pos_cnum
    then
      (Layout.SourceMap (loc, makeList ~inline:(true, true) ~break:Always
                    [unbreaklayout (attachCommentToNodeRight subLayout comment)]),
       None)
    else
      let (layout, comment) = perfectlyAttachComment comment subLayout in
      begin match comment with
        | None -> (Layout.SourceMap (loc, layout), None)
        | Some comment ->
          if commloc.loc_end.Lexing.pos_cnum =
             loc.loc_start.Lexing.pos_cnum  then
            (Layout.SourceMap (loc, attachCommentToNodeLeft comment layout), None)
          else if commloc.loc_start.Lexing.pos_cnum = loc.loc_end.Lexing.pos_cnum then
            (Layout.SourceMap (loc, attachCommentToNodeRight layout comment), None)
          else
            (Layout.SourceMap (loc, layout), Some comment)
      end
  | Whitespace(info, subLayout) ->
      begin match perfectlyAttachComment comment subLayout with
      | (newLayout, None) -> (Whitespace(info, newLayout), None)
      | (newLayout, Some c) -> (Whitespace(info, newLayout), Some c)
      end
  | layout -> (layout, Some comment)

let insertRegularComment layout comment =
  match perfectlyAttachComment comment layout with
  | (layout, None) -> layout
  | (layout, Some _) ->
      looselyAttachComment ~breakAncestors:false layout comment

let insertEndOfLineComment layout comment =
  looselyAttachComment ~breakAncestors:true layout comment

let rec partitionComments_ ((singleLines, endOfLines, regulars) as soFar) = function
  | [] -> soFar
  | com :: tl ->
    match Comment.category com with
    | Comment.EndOfLine ->
      partitionComments_ (singleLines, (com :: endOfLines), regulars) tl
    | Comment.SingleLine ->
      partitionComments_ ((com :: singleLines), endOfLines, regulars) tl
    | Comment.Regular ->
      partitionComments_ (singleLines, endOfLines, (com :: regulars)) tl

let partitionComments comments =
  let (singleLines, endOfLines, regulars) =
    partitionComments_ ([], [], []) comments in
  (singleLines, List.rev endOfLines, regulars)

(*
 * Partition single line comments based on a location into two lists:
 * - one contains the comments before/same height of that location
 * - the other contains the comments after the location
 *)
let partitionSingleLineComments loc singleLineComments =
  let (before, after) = List.fold_left (fun (before, after) comment ->
    let cl = Comment.location comment in
    let isAfter = loc.loc_end.pos_lnum < cl.loc_start.pos_lnum in
    if isAfter then
      (before, comment::after)
    else
      (comment::before, after)
  ) ([], []) singleLineComments
  in (List.rev before, after)

(*
 * appends all [singleLineComments] after the [layout].
 * [loc] marks the end of [layout]
 *)
let appendSingleLineCommentsToEnd loc layout singleLineComments =
  let rec aux prevLoc layout i = function
    | comment::cs ->
        let loc = Comment.location comment in
        let formattedComment = formatComment comment in
        let commentLayout = if Reason_location.hasSpaceBetween loc prevLoc then
          insertBlankLines 1 formattedComment
        else
          formattedComment
        in
        (* The initial layout breaks ugly with `breakline`,
         * an inline list (that never breaks) fixes this *)
        let newLayout = if i == 0 then
          makeList ~inline:(true, true) ~break:Never [layout; commentLayout]
        else
          breakline layout commentLayout
        in
        aux loc newLayout (i + 1) cs
    | [] -> layout
  in
  aux loc layout 0 singleLineComments

(*
 * For simplicity, the formatting of comments happens in two parts in context of a source map:
 * 1) insert the singleLineComments with the interleaving algorithm contained in
 *    `insertSingleLineComment` for all comments overlapping with the sourcemap.
 *    A `Layout.Whitespace` node signals an intent to preserve whitespace here.
 * 2) SingleLineComments after the sourcemap, e.g. at the end of .re/.rei file,
 *    get attached with `appendSingleLineCommentsToEnd`. Due to the fact there
 *    aren't any real ocaml ast nodes anymore after the sourcemap (end of a
 *    file), the printing of the comments can be done in one pass with
 *    `appendSingleLineCommentsToEnd`. This is more performant and
 *    simplifies the implementation of comment attachment.
 *)
let attachSingleLineComments singleLineComments = function
  | Layout.SourceMap(loc, subLayout) ->
      let (before, after) = partitionSingleLineComments loc singleLineComments in
      let layout = List.fold_left insertSingleLineComment subLayout before in
      appendSingleLineCommentsToEnd loc layout after
  | layout ->
    List.fold_left insertSingleLineComment layout singleLineComments

let format_layout ?comments ppf layout =
  let easy = match comments with
    | None -> Layout.to_easy_format layout
    | Some comments ->
      let (singleLines, endOfLines, regulars) = partitionComments comments in
      (* TODO: Stop generating multiple versions of the tree, and instead generate one new tree. *)
      (* Layout.dump Format.std_formatter layout; *)
      let layout = List.fold_left insertRegularComment layout regulars in
      let layout = consolidateSeparator layout in
      let layout = List.fold_left insertEndOfLineComment layout endOfLines in
      (* Layout.dump Format.std_formatter layout; *)
      let layout = attachSingleLineComments singleLines layout in
      (* Layout.dump Format.std_formatter layout; *)
      let layout = insertLinesAboveItems layout in
      let layout = Layout.to_easy_format layout in
      (* Layout.dump_easy Format.std_formatter layout; *)
      layout
  in
  let buf = Buffer.create 1000 in
  let fauxmatter = Format.formatter_of_buffer buf in
  let _ = Format.pp_set_margin fauxmatter settings.width in
  if debugWithHtml.contents then
    Easy_format.Pretty.define_styles fauxmatter html_escape html_style;
  let _ = Easy_format.Pretty.to_formatter fauxmatter easy in
  let trimmed = Reason_syntax_util.processLineEndingsAndStarts (Buffer.contents buf) in
  Format.fprintf ppf "%s\n" trimmed;
  Format.pp_print_flush ppf ()

let partitionFinalWrapping listTester wrapFinalItemSetting x =
  let rev = List.rev x in
  match (rev, wrapFinalItemSetting) with
    | ([], _) -> raise (NotPossible "shouldnt be partitioning 0 label attachments")
    | (_, NeverWrapFinalItem) -> None
    | (last::revEverythingButLast, WrapFinalListyItemIfFewerThan max) ->
        if not (listTester last) || (List.length x) >= max then
          None
        else
          Some (List.rev revEverythingButLast, last)

let semiTerminated term = makeList [term; atom ";"]

(* postSpace is so that when comments are interleaved, we still use spacing rules. *)
let makeLetSequence letItems =
  makeList
    ~break:Always_rec
    ~inline:(true, false)
    ~wrap:("{", "}")
    ~postSpace:true
    ~sep:(SepFinal (";", ";"))
    letItems

let makeLetSequenceSingleLine letItems =
  makeList
    ~break:IfNeed
    ~inline:(true, false)
    ~wrap:("{", "}")
    ~preSpace:true
    ~postSpace:true
    ~sep:(Sep ";")
    letItems

(* postSpace is so that when comments are interleaved, we still use spacing rules. *)
let makeUnguardedLetSequence ?(sep=(Layout.SepFinal (";", ";"))) letItems =
  makeList
    ~break:Always_rec
    ~inline:(true, true)
    ~wrap:("", "")
    ~indent:0
    ~postSpace:true
    ~sep
    letItems

let formatSimpleAttributed x y =
  makeList
    ~wrap:("(", ")")
    ~break:IfNeed
    ~indent:0
    ~postSpace:true
    (List.concat [y; [x]])

let formatAttributed ?(labelBreak=`Auto) x y =
  label
    ~break:labelBreak
    ~indent:0
    ~space:true
    (makeList ~inline:(true, true) ~postSpace:true y)
    x

(* For when the type constraint should be treated as a separate breakable line item itself
   not docked to some value/pattern label.
   fun x
       y
       : retType => blah;
 *)
let formatJustTheTypeConstraint typ =
  makeList ~postSpace:false ~sep:(Sep " ") [atom ":"; typ]

let formatTypeConstraint one two =
  label ~space:true (makeList ~postSpace:false [one; atom ":"]) two

let formatCoerce expr optType coerced =
  match optType with
    | None ->
      label ~space:true (makeList ~postSpace:true [expr; atom ":>"]) coerced
    | Some typ ->
      label ~space:true (makeList ~postSpace:true [formatTypeConstraint expr typ; atom ":>"]) coerced


(* Standard function application style indentation - no special wrapping
 * behavior.
 *
 * Formats like this:
 *
 *   let result =
 *     someFunc
 *       (10, 20);
 *
 *
 * Instead of this:
 *
 *   let result =
 *     someFunc (
 *       10,
 *       20
 *     );
 *
 * The outer list wrapping fixes #566: format should break the whole
 * application before breaking arguments.
 *)
let formatIndentedApplication headApplicationItem argApplicationItems =
  makeList ~inline:(true, true) ~postSpace:true ~break:IfNeed [
    label
      ~space:true
      headApplicationItem
      (makeAppList argApplicationItems)
  ]


(* The loc, is an optional location or the returned app terms *)
let formatAttachmentApplication finalWrapping (attachTo: (bool * Layout.t) option) (appTermItems, loc) =
  let partitioning = finalWrapping appTermItems in
  match partitioning with
    | None -> (
        match (appTermItems, attachTo) with
          | ([], _) -> raise (NotPossible "No app terms")
          | ([hd], None) -> source_map ?loc hd
          | ([hd], (Some (useSpace, toThis))) -> label ~space:useSpace toThis (source_map ?loc hd)
          | (hd::tl, None) ->
            source_map ?loc (formatIndentedApplication hd tl)
          | (hd::tl, (Some (useSpace, toThis))) ->
            label
              ~space:useSpace
              toThis
              (source_map ?loc (formatIndentedApplication hd tl))
      )
    | Some (attachedList, wrappedListy) -> (
        match (attachedList, attachTo) with
        | ([], Some (useSpace, toThis)) ->
          label ~space:useSpace toThis (source_map ?loc wrappedListy)
        | ([], None) ->
          (* Not Sure when this would happen *)
          source_map ?loc wrappedListy
        | (_::_, Some (useSpace, toThis)) ->
          (* TODO: Can't attach location to this - maybe rewrite anyways *)
          let attachedArgs = makeAppList attachedList in
          label ~space:useSpace toThis
            (label ~space:true attachedArgs wrappedListy)
        | (_::_, None) ->
          (* Args that are "attached to nothing" *)
          let appList = makeAppList attachedList in
          source_map ?loc (label ~space:true appList wrappedListy)
      )

(*
  Preprocesses an expression term for the sake of label attachments ([letx =
  expr]or record [field: expr]). Function application should have special
  treatment when placed next to a label. (The invoked function term should
  "stick" to the label in some cases). In others, the invoked function term
  should become a new label for the remaining items to be indented under.
 *)
let applicationFinalWrapping x =
  partitionFinalWrapping isSequencey settings.funcApplicationLabelStyle x

let curriedFunctionFinalWrapping x =
  partitionFinalWrapping isSequencey settings.funcCurriedPatternStyle x

let typeApplicationFinalWrapping typeApplicationItems =
  partitionFinalWrapping isSequencey settings.funcApplicationLabelStyle typeApplicationItems


(* add parentheses to binders when they are in fact infix or prefix operators *)
let protectIdentifier txt =
  if not (needs_parens txt) then atom txt
  else if needs_spaces txt then makeList ~wrap:("(", ")") ~pad:(true, true) [atom txt]
  else atom ("(" ^ txt ^ ")")

let protectLongIdentifier longPrefix txt =
  makeList [longPrefix; atom "."; protectIdentifier txt]

let paren b fu ppf x =
  if b
  then Format.fprintf ppf "(%a)" fu x
  else fu ppf x

let constant_string ppf s =
  Format.fprintf ppf "%S" s

let tyvar ppf str =
  Format.fprintf ppf "'%s" str

(* In some places parens shouldn't be printed for readability:
 * e.g. Some((-1)) should be printed as Some(-1)
 * In `1 + (-1)` -1 should be wrapped in parens for readability
 *)
let constant ?raw_literal ?(parens=true) ppf = function
  | Pconst_char i ->
    Format.fprintf ppf "%C"  i
  | Pconst_string (i, None) ->
    begin match raw_literal with
      | Some text ->
        Format.fprintf ppf "\"%s\"" text
      | None ->
        Format.fprintf ppf "\"%s\"" (Reason_syntax_util.escape_string i)
    end
  | Pconst_string (i, Some delim) ->
    Format.fprintf ppf "{%s|%s|%s}" delim i delim
  | Pconst_integer (i, None) ->
    paren (parens && i.[0] = '-')
      (fun ppf -> Format.fprintf ppf "%s") ppf i
  | Pconst_integer (i, Some m) ->
    paren (parens && i.[0] = '-')
      (fun ppf (i, m) -> Format.fprintf ppf "%s%c" i m) ppf (i,m)
  | Pconst_float (i, None) ->
    paren (parens && i.[0] = '-')
      (fun ppf -> Format.fprintf ppf "%s") ppf i
  | Pconst_float (i, Some m) ->
    paren (parens && i.[0] = '-')
      (fun ppf (i,m) -> Format.fprintf ppf "%s%c" i m) ppf (i,m)

let is_punned_labelled_expression e lbl = match e.pexp_desc with
  | Pexp_ident { txt }
  | Pexp_constraint ({pexp_desc = Pexp_ident { txt }}, _)
  | Pexp_coerce ({pexp_desc = Pexp_ident { txt }}, _, _)
    -> txt = Longident.parse lbl
  | _ -> false

let is_punned_labelled_pattern p lbl = match p.ppat_desc with
  | Ppat_constraint ({ ppat_desc = Ppat_var _; ppat_attributes = _::_ }, _)
    -> false
  | Ppat_constraint ({ ppat_desc = Ppat_var { txt } }, _)
  | Ppat_var { txt }
    -> txt = lbl
  | _ -> false

let isLongIdentWithDot = function
  | Ldot _ -> true
  | _ -> false

(* Js.t -> useful for bucklescript sugar `Js.t({. foo: bar})` -> `{. "foo": bar}` *)
let isJsDotTLongIdent ident = match ident with
  | Ldot (Lident "Js", "t") -> true
  | _ -> false

let recordRowIsPunned pld =
      let name = pld.pld_name.txt in
      (match pld.pld_type with
        | { ptyp_desc = (
            Ptyp_constr (
              { txt },
              (* don't pun parameterized types, e.g. {tag: tag 'props} *)
              [])
            );
            (* Don't pun types that have attributes attached, e.g. { foo: [@bar] foo } *)
            ptyp_attributes = [];
          _}
            when
            (Longident.last txt = name
              (* Don't pun types from other modules, e.g. type bar = {foo: Baz.foo}; *)
              && isLongIdentWithDot txt == false) -> true
        | _ -> false)

let isPunnedJsxArg lbl ident =
  not (isLongIdentWithDot ident.txt) && (Longident.last ident.txt) = lbl

let is_unit_pattern x = match x.ppat_desc with
  | Ppat_construct ( {txt= Lident"()"}, None) -> true
  | _ -> false

let is_ident_pattern x = match x.ppat_desc with
  | Ppat_var _ -> true
  | _ -> false

let is_any_pattern x = x.ppat_desc = Ppat_any

let is_direct_pattern x = x.ppat_attributes == [] && match x.ppat_desc with
  | Ppat_construct ( {txt= Lident"()"}, None) -> true
  | _ -> false

let isJSXComponent expr =
  match expr with
  | ({pexp_desc= Pexp_apply ({pexp_desc=Pexp_ident _}, args); pexp_attributes})
  | ({pexp_desc= Pexp_apply ({pexp_desc=Pexp_letmodule(_,_,_)}, args); pexp_attributes}) ->
    let {jsxAttrs} = partitionAttributes pexp_attributes in
    let hasLabelledChildrenLiteral = List.exists (function
      | (Labelled "children", _) -> true
      | _ -> false
    ) args in
    let rec hasSingleNonLabelledUnitAndIsAtTheEnd l = match l with
    | [] -> false
    | (Nolabel, {pexp_desc = Pexp_construct ({txt = Lident "()"}, _)}) :: [] -> true
    | (Nolabel, _) :: _ -> false
    | _ :: rest -> hasSingleNonLabelledUnitAndIsAtTheEnd rest
    in
    if jsxAttrs != []
       && hasLabelledChildrenLiteral
       && hasSingleNonLabelledUnitAndIsAtTheEnd args
    then
      true
    else
      false
  | _ -> false

(* Some cases require special formatting when there's a function application
 * with a single argument containing some kind of structure with braces/parens/brackets.
 * Example: `foo({a: 1, b: 2})` needs to be formatted as
 *  foo({
 *    a: 1,
 *    b: 2
 *  })
 *  when the line length dictates breaking. Notice how `({` and `})` 'hug'.
 *  Also applies to (poly)variants because they can be seen as a form of "function application".
 *  This function says if a list of expressions fulfills the need to be formatted like
 *  the example above. *)
let isSingleArgParenApplication = function
  | [{pexp_attributes = []; pexp_desc = Pexp_record _}]
  | [{pexp_attributes = []; pexp_desc = Pexp_tuple _}]
  | [{pexp_attributes = []; pexp_desc = Pexp_array _}]
  | [{pexp_attributes = []; pexp_desc = Pexp_object _}] -> true
  | [{pexp_attributes = []; pexp_desc = Pexp_extension (s, _)}] when s.txt = "bs.obj" -> true
  | [({pexp_attributes = []} as exp)] when (is_simple_list_expr exp) -> true
  | _ -> false

(*
 * Determines if the arguments of a constructor pattern match need
 * special printing. If there's one argument & they have some kind of wrapping,
 * they're wrapping need to 'hug' the surrounding parens.
 * Example:
 *  switch x {
 *  | Some({
 *      a,
 *      b,
 *    }) => ()
 *  }
 *
 *  Notice how ({ and }) hug.
 *  This applies for records, arrays, tuples & lists.
 *  See `singleArgParenPattern` for the acutal formatting
 *)
let isSingleArgParenPattern = function
  | [{ppat_attributes = []; ppat_desc = Ppat_record _}]
  | [{ppat_attributes = []; ppat_desc = Ppat_array _}]
  | [{ppat_attributes = []; ppat_desc = Ppat_tuple _}] -> true
  | [{ppat_attributes = []; ppat_desc = Ppat_construct (({txt=Lident "::"}), _)}] -> true
  | _ -> false

(* Flattens a resolvedRule into a list of infixChain nodes.
 * When foo |> f |> z gets parsed, we get the following tree:
 *         |>
 *        /  \
 *    foo      |>
 *            /  \
 *          f      z
 * To format this recursive tree in a way that allows nice breaking
 * & respects the print-width, we need some kind of flattened
 * version of the above tree. `computeInfixChain` transforms the tree
 * in a flattened version which allows flexible formatting.
 * E.g. we get
 *  [LayoutNode foo; InfixToken |>; LayoutNode f; InfixToken |>; LayoutNode z]
 *)
let rec computeInfixChain = function
  | LayoutNode layoutNode -> [Layout layoutNode]
  | InfixTree (op, leftResolvedRule, rightResolvedRule) ->
      (computeInfixChain leftResolvedRule) @ [InfixToken op] @ (computeInfixChain rightResolvedRule)

let equalityOperators = ["!="; "!=="; "==="; "=="; ">="; "<="; "<"; ">"]

(* Formats a flattened list of infixChain nodes into a list of layoutNodes
 * which allow smooth line-breaking
 * e.g. [LayoutNode foo; InfixToken |>; LayoutNode f; InfixToken |>; LayoutNode z]
 * becomes
 * [
 *   foo
 * ; |> f        --> label
 * ; |> z        --> label
 * ]
 * If you make a list out of this items, we get smooth line breaking
 *  foo |> f |> z
 * becomes
 *  foo
 *  |> f
 *  |> z
 *  when the print-width forces line breaks.
 *)
let formatComputedInfixChain infixChainList =
  let layout_of_group group currentToken =
    (* Represents the `foo` in
     * foo
     * |> f
     * |> z *)
    if List.length group < 2 then
      makeList ~inline:(true, true) ~sep:(Sep " ") group
    (* Basic equality operators require special formatting, we can't give it
     * 'classic' infix operator formatting, otherwise we would get
     * let example =
     *  true
     *  != false
     *  && "a"
     *  == "b"
     *  *)
    else if List.mem currentToken equalityOperators then
      let hd = List.hd group in
      let tl = makeList ~inline:(true, true) ~sep:(Sep " ") (List.tl group) in
      makeList ~inline:(true, true) ~sep:(Sep " ") ~break:IfNeed [hd; tl]
    else if currentToken.[0] = '#' then
      let isSharpEqual = currentToken = sharpOpEqualToken in
      makeList ~postSpace:isSharpEqual group
    else
      (* Represents `|> f` in foo |> f
       * We need a label here to indent possible closing parens
       * on the same height as the infix operator
       * e.g.
       * >|= (
       *   fun body =>
       *     Printf.sprintf
       *       "okokok" uri meth headers body
       * )   <-- notice how this closing paren is on the same height as >|=
       *)
      label ~break:`Never ~space:true (atom currentToken) (List.nth group 1)
  in
  let rec print acc group currentToken l =
    match l with
    | x::xs -> (match x with
      | InfixToken t ->
          (* = or := *)
          if List.mem t requireIndentFor then
            let groupNode =
              makeList ~inline:(true, true) ~sep:(Sep " ") ((print [] group currentToken []) @ [atom t])
            in
            let children =
              makeList ~inline:(true, true) ~preSpace:true ~break:IfNeed
                (print [] [] t xs)
            in
            print (acc @ [label ~space:true groupNode children]) [] t []
          (* Represents:
           * List.map @@
           * List.length
           *
           * Notice how we want the `@@` on the first line.
           * Extra indent puts pressure on the subsequent line lengths
           * *)
          else if t = "@@" then
            let groupNode =
              makeList ~inline:(true, true) ~sep:(Sep " ") (group @ [atom t])
            in
            print (acc @ [groupNode]) [] t xs
          (* != !== === == >= <= < > etc *)
          else if List.mem t equalityOperators then
            print acc ((print [] group currentToken []) @ [atom t]) t xs
          else
            begin if requireNoSpaceFor t then
              begin if (currentToken = "" || requireNoSpaceFor currentToken) then
                print acc (group@[atom t]) t xs
              else
                (* a + b + foo##bar##baz
                 * `foo` needs to be picked from the current group
                 * and inserted into a new one. This way `foo`
                 * gets the special "chained"-printing:
                 * foo##bar##baz. *)
                 begin match List.rev group with
                 |  hd::tl ->
                     let acc =
                       acc @ [layout_of_group (List.rev tl) currentToken]
                      in
                     print acc [hd; atom t] t xs
                 | [] -> print acc (group@[atom t]) t xs
                 end
              end
            else
              print (acc @ [layout_of_group group currentToken]) [(atom t)] t xs
            end
      | Layout layoutNode -> print acc (group @ [layoutNode]) currentToken xs
      )
    | [] ->
      if List.mem currentToken requireIndentFor then
        acc @ group
        else
          acc @ [layout_of_group group currentToken]
  in
  let l = print [] [] "" infixChainList in
  makeList ~inline:(true, true) ~sep:(Sep " ") ~break:IfNeed l

(**
 * [groupAndPrint] will print every item in [items] according to the function [xf].
 * [getLoc] will extract the location from an item. Based on the difference
 * between the location of two items, if there's whitespace between the two
 * (taken possible comments into account), items get grouped.
 * Every group designates a series of layout nodes "in need
 * of whitespace above". A group gets decorated with a Whitespace node
 * containing enough info to interleave whitespace at a later time during
 * printing.
 *)
let groupAndPrint ~xf ~getLoc ~comments items =
  let rec group prevLoc curr acc = function
    (* group items *)
    | x::xs ->
        let item = xf x in
        let loc = getLoc x in
        (* Get the range between the current and previous item
         * Example:
         * 1| let a = 1;
         * 2|            --> this is the range between the two
         * 3| let b = 2;
         * *)
        let range = Range.makeRangeBetween prevLoc loc in
        (* If there's whitespace interleaved, append the new layout node
         * to a new group, otherwise keep it in the current group.
         * Takes possible comments interleaved into account.
         *
         * Example:
         * 1| let a = 1;
         * 2|
         * 3| let b = 2;
         * 4| let c = 3;
         * `let b = 2` will mark the start of a new group
         * `let c = 3` will be added to the group containing `let b = 2`
         *)
        if Range.containsWhitespace ~range ~comments () then
          group loc [(range, item)] ((List.rev curr)::acc) xs
        else
          group loc ((range, item)::curr) acc xs
    (* convert groups into "Layout.Whitespace" *)
    | [] ->
        let groups = List.rev ((List.rev curr)::acc) in
        List.mapi (fun i group -> match group with
          | curr::xs ->
              let (range, x) = curr in
              (* if this is the first group of all "items", the number of
               * newlines interleaved should be 0, else we collapse all newlines
               * to 1.
               *
               * Example:
               * module Abc = {
               *   let a = 1;
               *
               *   let b = 2;
               * }
               * `let a = 1` should be wrapped in a `Layout.Whitespace` because a
               * user might put comments above the `let a = 1`.
               * e.g.
               * module Abc = {
               *   /* comment 1 */
               *
               *   /* comment 2 */
               *   let a = 1;
               *
               *  A Whitespace-node will automatically take care of the whitespace
               *  interleaving between the comments.
               *)
              let newlines = if i > 0 then 1 else 0 in
              let region = WhitespaceRegion.make ~range ~newlines () in
              let firstLayout = Layout.Whitespace(region, x) in
              (* the first layout node of every group taks care of the
               * whitespace above a group*)
              (firstLayout::(List.map snd xs))
          | [] -> []
        ) groups
  in
  match items with
  | first::rest ->
      List.concat (group (getLoc first) [] [] (first::rest))
  | [] -> []

let printer = object(self:'self)
  val pipe = false
  val semi = false

  val inline_braces = false
  val preserve_braces = true

  (* *Mutable state* in the printer to keep track of all comments
   * Used when whitespace needs to be interleaved.
   * The printing algorithm needs to take the comments into account in between
   * two items, to correctly determine if there's whitespace between two items.
   * The ast doesn't know if there are comments between two items, since
   * comments are store separately. The location diff between two items
   * might indicate whitespace between the two. While in reality there are
   * comments filling that whitespace. The printer needs access to the comments
   * for this reason.
   *
   * Example:
   * 1| let a = 1;
   * 2|
   * 3|
   * 4| let b = 2;
   *  -> here we can just diff the locations between `let a = 1` and `let b = 2`
   *
   * 1| let a = 1;
   * 2| /* a comment */
   * 3| /* another comment */
   * 4| let b = 2;
   *  -> here the location diff will result into false info if we don't include
   *  the comments in the diffing
   *)
  val mutable comments = []

  method comments = comments
  method trackComment comment = comments <- comment::comments

  (* The test and first branch of ternaries must be guarded *)
  method under_pipe = {<pipe=true>}
  method under_semi = {<semi=true>}
  method reset_semi = {<semi=false>}
  method reset_pipe = {<pipe=false>}
  method reset = {<pipe=false;semi=false>}

  method inline_braces = {<inline_braces=true>}
  method dont_preserve_braces = {<preserve_braces=false>}
  method reset_request_braces = {<inline_braces=false; preserve_braces=true>}


  method longident = function
    | Lident s -> (protectIdentifier s)
    | Ldot(longPrefix, s) ->
        (protectLongIdentifier (self#longident longPrefix) s)
    | Lapply (y,s) -> makeList [self#longident y; atom "("; self#longident s; atom ")";]

  (* This form allows applicative functors. *)
  method longident_class_or_type_loc x = self#longident x.txt
  (* TODO: Fail if observing applicative functors for this form. *)
  method longident_loc (x:Longident.t Location.loc) =
    source_map ~loc:x.loc (self#longident x.txt)

  method constant ?raw_literal ?(parens=true) =
    wrap (constant ?raw_literal ~parens)

  method constant_string = wrap constant_string
  method tyvar = wrap tyvar

  (* c ['a,'b] *)
  method class_params_def = function
    | [] -> atom ""
    | l -> makeTup (List.map self#type_param l)

  (* This will fall through to the simple version. *)
  method non_arrowed_core_type x = self#non_arrowed_non_simple_core_type x

  method core_type2 x =
    let {stdAttrs; uncurried} = partitionAttributes x.ptyp_attributes in
    let uncurried = uncurried || try Hashtbl.find uncurriedTable x.ptyp_loc with | Not_found -> false in
    if stdAttrs != [] then
      formatAttributed
        (self#non_arrowed_simple_core_type {x with ptyp_attributes = []})
        (self#attributes stdAttrs)
    else
      let x = if uncurried then { x with ptyp_attributes = [] } else x in
      match x.ptyp_desc with
        | Ptyp_arrow _ ->
          let rec allArrowSegments ?(uncurried=false) acc = function
            | { ptyp_desc = Ptyp_arrow (l, ct1, ct2); ptyp_attributes = []} ->
              allArrowSegments ~uncurried:false
                ((l,ct1, false || uncurried) :: acc) ct2
            | rhs ->
              let rhs = self#core_type2 rhs in
              let is_tuple typ = match typ.ptyp_desc with
                | Ptyp_tuple _ -> true
                | _ -> false
              in
              match acc with
              | [(Nolabel, lhs, uncurried )] when not (is_tuple lhs) ->
                  let t = self#non_arrowed_simple_core_type lhs in
                  let lhs = if uncurried then
                    makeList ~wrap:("(. ", ")") ~postSpace:true [t]
                  else t in
                (lhs, rhs)
              | acc ->
                let params = List.rev_map self#type_with_label acc in
                (makeCommaBreakableListSurround "(" ")" params, rhs)
          in
          let (lhs, rhs) = allArrowSegments ~uncurried [] x in
          let normalized = makeList
              ~preSpace:true ~postSpace:true ~inline:(true, true)
              ~break:IfNeed ~sep:(Sep "=>") [lhs; rhs]
          in source_map ~loc:x.ptyp_loc normalized
        | Ptyp_poly (sl, ct) ->
          let ct = self#core_type ct in
          let poly = match sl with
          | [] -> ct
          | sl ->
            makeList ~break:IfNeed ~postSpace:true [
              makeList [
                makeList ~postSpace:true (List.map (fun x -> self#tyvar x) sl);
                atom ".";
              ];
              ct
            ]
          in source_map ~loc:x.ptyp_loc poly
        | _ -> self#non_arrowed_core_type x

  (* Same as core_type2 but can be aliased *)
  method core_type x =
    let {stdAttrs; uncurried} = partitionAttributes x.ptyp_attributes in
    let () = if uncurried then Hashtbl.add uncurriedTable x.ptyp_loc true in
    if stdAttrs != [] then
      formatAttributed
        (self#non_arrowed_simple_core_type {x with ptyp_attributes = []})
        (self#attributes stdAttrs)
    else match x.ptyp_desc with
      | (Ptyp_alias (ct, s)) ->
        source_map ~loc:x.ptyp_loc
          (label
             ~space:true
             (self#core_type ct)
             (makeList ~postSpace:true [atom "as"; atom ("'" ^ s)]))
      | _ -> self#core_type2 x

  method type_with_label (lbl, c, uncurried) =
    let typ = self#core_type c in
    let t = match lbl with
    | Nolabel -> typ
    | Labelled lbl ->
        makeList ~sep:(Sep " ") [atom (namedArgSym ^ lbl ^ ":"); typ]
    | Optional lbl ->
        makeList ~sep:(Sep " ") [atom (namedArgSym ^ lbl ^ ":"); label typ (atom "=?")]
    in
    if uncurried then
      makeList ~postSpace:true [atom "."; t]
    else t

  method type_param (ct, a) =
    makeList [atom (type_variance a); self#core_type ct]

  (* According to the parse rule [type_declaration], the "type declaration"'s
   * physical location (as indicated by [td.ptype_loc]) begins with the
   * identifier and includes the constraints. *)
  method formatOneTypeDef prepend name assignToken ({ptype_params; ptype_kind; ptype_loc} as td) =
    let (equalInitiatedSegments, constraints) = (self#type_declaration_binding_segments td) in
    let formattedTypeParams = List.map self#type_param ptype_params in
    let binding = makeList ~postSpace:true [prepend;name] in
    (*
        /-----------everythingButConstraints--------------  | -constraints--\
       /-innerL---| ------innerR--------------------------\
      /binding\     /typeparams\ /--equalInitiatedSegments-\
      type name      'v1    'v1  =  foo = private bar        constraint a = b
    *)

    let labelWithParams = match formattedTypeParams with
      | [] -> binding
      | l -> label binding (makeTup l)
    in
    let everythingButConstraints =
      let nameParamsEquals = makeList ~postSpace:true [labelWithParams; assignToken] in
      match equalInitiatedSegments with
        | [] -> labelWithParams
        | _::_::_::_ -> raise (NotPossible "More than two type segments.")
        | hd::[] ->
            formatAttachmentApplication
              typeApplicationFinalWrapping
              (Some (true, nameParamsEquals))
              (hd, None)
        | hd::hd2::[] ->
            let first = makeList ~postSpace:true ~break:IfNeed ~inline:(true, true) (hd @ [atom "="]) in
            (*
             * Because we want a record as a label with the opening brace on the same line
             * and the closing brace indented at the beginning, we can't wrap it in a list here
             * Example:
             * type doubleEqualsRecord =
             *  myRecordWithReallyLongName = {   <- opening brace on the same line
             *    xx: int,
             *    yy: int
             *  };                               <- closing brace indentation
             *)
            let second = match ptype_kind with
              | Ptype_record _ -> List.hd hd2
              | _ -> makeList ~postSpace:true ~break:IfNeed ~inline:(true, true) hd2
            in
            label ~space:true nameParamsEquals (
              label ~space:true first second
            )
    in
    let everything =
      match constraints with
        | [] -> everythingButConstraints
        | hd::tl -> makeList ~break:IfNeed ~postSpace:true ~indent:0 ~inline:(true, true) (everythingButConstraints::hd::tl)
    in
    source_map ~loc:ptype_loc everything

  method formatOneTypeExt prepend name assignToken te =
    let privateAtom = (atom "pri") in
    let privatize scope lst = match scope with
      | Public -> lst
      | Private -> privateAtom::lst in
    let equalInitiatedSegments =
      let segments = List.map self#type_extension_binding_segments te.ptyext_constructors in
      let privatized_segments = privatize te.ptyext_private segments in
      [makeList ~break:Always_rec ~postSpace:true ~inline:(true, true) privatized_segments] in
    let formattedTypeParams = List.map self#type_param te.ptyext_params in
    let binding = makeList ~postSpace:true (prepend::name::[]) in
    let labelWithParams = match formattedTypeParams with
      | [] -> binding
      | l -> label binding (makeTup l)
    in
    let everything =
      let nameParamsEquals = makeList ~postSpace:true [labelWithParams; assignToken] in
      formatAttachmentApplication
             typeApplicationFinalWrapping
             (Some (true, nameParamsEquals))
             (equalInitiatedSegments, None)
    in
    source_map ~loc:te.ptyext_path.loc everything

  method type_extension_binding_segments {pext_kind; pext_loc; pext_attributes; pext_name} =
    let normalize lst = match lst with
        | [] -> raise (NotPossible "should not be called")
        | [hd] -> hd
        | _::_ -> makeList lst
      in
      let add_bar name attrs args =
        let lbl = begin match args with
        | None -> name
        | Some args -> label name args
        end in
        if attrs != [] then
         label ~space:true
            (makeList
              ~postSpace:true
              [
                atom "|";
                makeList
                  ~postSpace:true
                  ~break:Layout.IfNeed
                  ~inline:(true, true)
                  (self#attributes attrs)
              ]
            )
            lbl
        else
          makeList ~postSpace:true [atom "|"; lbl]
      in
    let sourceMappedName = atom ~loc:pext_name.loc pext_name.txt in
    let resolved = match pext_kind with
      | Pext_decl (ctor_args, gadt) ->
        let formattedArgs = match ctor_args with
          | Pcstr_tuple [] -> []
          | Pcstr_tuple args -> [makeTup (List.map self#non_arrowed_non_simple_core_type args)]
          | Pcstr_record r -> [self#record_declaration ~wrap:("({", "})") r]
        in
        let formattedGadt = match gadt with
        | None -> None
        | Some x -> Some (
            makeList [
              formatJustTheTypeConstraint (self#core_type x)
            ]
          )
        in
        (formattedArgs, formattedGadt)
      (* type bar += Foo = Attr.Foo *)
      | Pext_rebind rebind ->
        let r = self#longident_loc rebind in
        (* we put an empty space before the '=': we don't have access to the fact
         * that we need a space because of the Pext_rebind later *)
        let prepend = (atom " =") in
        ([makeList ~postSpace:true [prepend; r]], None)
    in
      (*
        The first element of the tuple represents constructor arguments,
        the second an optional formatted gadt.

        Case 1: No constructor arguments, neither a gadt
          type attr = ..;
          type attr += | Str

        Case 2: No constructor arguments, is a gadt
          type attr = ..;
          type attr += | Str :attr

        Case 3: Has Constructor args, not a gadt
          type attr  = ..;
          type attr += | Str(string);
          type attr += | Point(int, int);

        Case 4: Has Constructor args & is a gadt
          type attr  = ..;
          type attr += | Point(int, int) :attr;
      *)
    let everything = match resolved with
      | ([], None) -> add_bar sourceMappedName pext_attributes None
      | ([], Some gadt) -> add_bar sourceMappedName pext_attributes (Some gadt)
      | (ctorArgs, None) -> add_bar sourceMappedName pext_attributes (Some (normalize ctorArgs))
      | (ctorArgs, Some gadt) -> add_bar sourceMappedName pext_attributes (Some (normalize (ctorArgs@[gadt])))
    in
    source_map ~loc:pext_loc everything

  (* shared by [Pstr_type,Psig_type]*)
  method type_def_list (rf, l) =
    (* As oposed to used in type substitution. *)
    let formatOneTypeDefStandard prepend td =
      let itm =
        self#formatOneTypeDef
          prepend
          (atom ~loc:td.ptype_name.loc td.ptype_name.txt)
          (atom "=")
          td
      in
      let {stdAttrs; docAttrs} = partitionAttributes ~partDoc:true td.ptype_attributes in
      let layout = self#attach_std_item_attrs stdAttrs itm in
      self#attachDocAttrsToLayout
        ~stdAttrs
        ~docAttrs
        ~loc:td.ptype_loc
        ~layout
        ()
    in

    match l with
      | [] -> raise (NotPossible "asking for type list of nothing")
      | hd::tl ->
          let first =
            match rf with
            | Recursive -> formatOneTypeDefStandard (atom "type") hd
            | Nonrecursive ->
                formatOneTypeDefStandard (atom "type nonrec") hd
          in
          match tl with
            (* Exactly one type *)
            | [] -> first
            | _::_ as typeList ->
                let items = (hd.ptype_loc, first)::(List.map (fun ptyp ->
                    (ptyp.ptype_loc, formatOneTypeDefStandard (atom "and") ptyp)
                  ) typeList
                ) in
                makeList ~indent:0 ~inline:(true, true) ~break:Always_rec (
                  groupAndPrint
                    ~xf:snd
                    ~getLoc:fst
                    ~comments:self#comments
                    items
                )

  method type_variant_leaf ?opt_ampersand:(a=false) ?polymorphic:(p=false) = self#type_variant_leaf1 a p true
  method type_variant_leaf_nobar ?opt_ampersand:(a=false) ?polymorphic:(p=false) = self#type_variant_leaf1 a p false

  (* TODOATTRIBUTES: Attributes on the entire variant leaf are likely
   * not parsed or printed correctly. *)
  method type_variant_leaf1 opt_ampersand polymorphic print_bar x =
    let {pcd_name; pcd_args; pcd_res; pcd_loc; pcd_attributes} = x in
    let {stdAttrs; docAttrs} = partitionAttributes ~partDoc:true pcd_attributes in
    let ampersand_helper i arg =
      let ct = self#core_type arg in
      let ct = match arg.ptyp_desc with
        | Ptyp_tuple _ -> ct
        | _ -> makeTup [ct]
      in
      if i == 0 && not opt_ampersand then
        ct
      else
        label (atom "&") ct
    in
    let args = match pcd_args with
      | Pcstr_record r ->
          [self#record_declaration ~wrap:("({", "})") r]
      | Pcstr_tuple [] -> []
      | Pcstr_tuple l when polymorphic -> List.mapi ampersand_helper l
      (* Here's why this works. With the new syntax, all the args, are already inside of
        a safely guarded place like Constructor(here, andHere). Compare that to the
        previous syntax Constructor here andHere. In the previous syntax, we needed to
        require that we print "non-arrowed" types for here, and andHere to avoid
        something like Constructor a=>b c=>d. In the new syntax, we don't care if here
        and andHere have unguarded arrow types like a=>b because they're safely
        separated by commas.
       *)
      | Pcstr_tuple l -> [makeTup (List.map self#core_type l)]
    in
    let gadtRes = match pcd_res with
      | None -> None
      | Some x -> Some (
          formatJustTheTypeConstraint (self#core_type x)
        )
    in
    let normalize lst = match lst with
      | [] -> raise (NotPossible "should not be called")
      | [hd] -> hd
      | _::_ -> makeList ~inline:(true, true) ~break:IfNeed ~postSpace:true lst
    in
    let add_bar constructor =
      makeList ~postSpace:true (if print_bar then [atom "|"; constructor] else [constructor])
    in
    (* In some cases (e.g. inline records) we want the label with bar & the gadt resolution
     * as a list.
     *   | If {
     *       pred: expr bool,
     *       true_branch: expr 'a,
     *       false_branch: expr 'a
     *     }                           ==> end of label
     *     :expr 'a;                   ==> gadt res
     * The label & the gadt res form two separate units combined into a list.
     * This is necessary to properly align the closing '}' on the same height as the 'If'.
     *)
    let add_bar_2 ?gadt name args =
      let lbl = label name args in
      let fullLbl = match gadt with
        | Some g -> makeList ~inline:(true, true) ~break:IfNeed [lbl; g]
        | None -> lbl
      in
      add_bar fullLbl
    in

    let prefix = if polymorphic then "`" else "" in
    let sourceMappedName = atom ~loc:pcd_name.loc (prefix ^ pcd_name.txt) in
    let sourceMappedNameWithAttributes =
      let layout = match stdAttrs with
      | [] -> sourceMappedName
      | stdAttrs ->
        formatAttributed sourceMappedName (self#attributes stdAttrs)
      in
      match docAttrs with
      | [] -> layout
      | docAttrs ->
        makeList ~break:Always ~inline:(true, true) [
          makeList (self#attributes docAttrs);
          layout
        ]
    in
    let constructorName = makeList ~postSpace:true [sourceMappedNameWithAttributes] in
    let everything = match (args, gadtRes) with
      | ([], None) -> add_bar sourceMappedNameWithAttributes
      | ([], Some gadt) -> add_bar_2 sourceMappedNameWithAttributes gadt
      | (_::_, None) -> add_bar_2 constructorName (normalize args)
      | (_::_, Some gadt) ->
          (match pcd_args with
            | Pcstr_record _ -> add_bar_2 ~gadt constructorName (normalize args)
            | _ -> add_bar_2 constructorName ~gadt (normalize args))
    in
    source_map ~loc:pcd_loc everything

  method record_declaration ?(wrap=("{", "}")) ?assumeRecordLoc lbls =
    let recordRow pld =
      let hasPunning = recordRowIsPunned pld in
      let name =
        if hasPunning
        then [atom pld.pld_name.txt]
        else [atom pld.pld_name.txt; atom ":"]
      in
      let name = source_map ~loc:pld.pld_name.loc (makeList name) in
      let withMutable =
        match pld.pld_mutable with
        | Immutable -> name
        | Mutable -> makeList ~postSpace:true [atom "mutable"; name]
      in
      let recordRow = if hasPunning then
          label withMutable (atom "")
        else
          label ~space:true withMutable (self#core_type pld.pld_type)
      in
      let recordRow = match pld.pld_attributes with
      | [] -> recordRow
      | attrs ->
          let {stdAttrs; docAttrs} = partitionAttributes ~partDoc:true attrs in
        let stdAttrsLayout =
          makeList ~inline:(true, true) ~postSpace:true (self#attributes stdAttrs)
        in
        let docAttrsLayout = makeList ~inline:(true, true) (self#attributes docAttrs) in
        let children = match (docAttrs, stdAttrs) with
        | [], [] -> [recordRow]
        | _, [] -> [docAttrsLayout; recordRow]
        | [], _ -> [stdAttrsLayout; recordRow]
        | _, _ ->
            [docAttrsLayout; stdAttrsLayout; recordRow]
        in
        makeList ~inline:(true, true) ~break:Always_rec children
      in
      source_map ~loc:pld.pld_loc recordRow
    in
    let rows = List.map recordRow lbls in
    (* if a record has more than 2 rows, always break *)
    let break =
      if List.length rows >= 2
      then Layout.Always_rec
      else Layout.IfNeed
    in
    source_map ?loc:assumeRecordLoc
      (makeList ~wrap ~sep:commaTrail ~postSpace:true ~break rows)

  (* Returns the type declaration partitioned into three segments - one
     suitable for appending to a label, the actual type manifest
     and the list of constraints. *)
  method type_declaration_binding_segments x =
    (* Segments of the type binding (occuring after the type keyword) that
       should begin with "=". Zero to two total sections.
       This is just a straightforward reverse mapping from the original parser:
        type_kind:
            /*empty*/
              { (Ptype_abstract, Public, None) }
          | EQUAL core_type
              { (Ptype_abstract, Public, Some $2) }
          | EQUAL PRIVATE core_type
              { (Ptype_abstract, Private, Some $3) }
          | EQUAL constructor_declarations
              { (Ptype_variant(List.rev $2), Public, None) }
          | EQUAL PRIVATE constructor_declarations
              { (Ptype_variant(List.rev $3), Private, None) }
          | EQUAL private_flag BAR constructor_declarations
              { (Ptype_variant(List.rev $4), $2, None) }
          | EQUAL DOTDOT
              { (Ptype_open, Public, None) }
          | EQUAL private_flag LBRACE label_declarations opt_comma RBRACE
              { (Ptype_record(List.rev $4), $2, None) }
          | EQUAL core_type EQUAL private_flag opt_bar constructor_declarations
              { (Ptype_variant(List.rev $6), $4, Some $2) }
          | EQUAL core_type EQUAL DOTDOT
              { (Ptype_open, Public, Some $2) }
          | EQUAL core_type EQUAL private_flag LBRACE label_declarations opt_comma RBRACE
              { (Ptype_record(List.rev $6), $4, Some $2) }
    *)
    let privateAtom = (atom "pri") in
    let privatize scope lst = match scope with
      | Public -> lst
      | Private -> privateAtom::lst in

    let estimateRecordOpenBracePoint () =
      match x.ptype_params with
        | [] -> x.ptype_name.loc.loc_end
        | _ ->
          (fst (List.nth x.ptype_params (List.length x.ptype_params - 1))).ptyp_loc.loc_end
    in

    let equalInitiatedSegments = match (x.ptype_kind, x.ptype_private, x.ptype_manifest) with
      (* /*empty*/ {(Ptype_abstract, Public, None)} *)
      | (Ptype_abstract, Public, None) -> [

        ]
      (* EQUAL core_type {(Ptype_abstract, Public, Some _)} *)
      | (Ptype_abstract, Public, Some y) -> [
          [self#core_type y]
        ]
      (* EQUAL PRIVATE core_type {(Ptype_abstract, Private, Some $3)} *)
      | (Ptype_abstract, Private, Some y) -> [
          [privateAtom; self#core_type y]
        ]
      (* EQUAL constructor_declarations {(Ptype_variant _., Public, None)} *)
      (* This case is redundant *)
      (* | (Ptype_variant lst, Public, None) -> [ *)
      (*     [makeSpacedBreakableInlineList (List.map type_variant_leaf lst)] *)
      (*   ] *)
      (* EQUAL PRIVATE constructor_declarations {(Ptype_variant _, Private, None)} *)
      | (Ptype_variant lst, Private, None) -> [
          [privateAtom; makeList ~break:IfNeed ~postSpace:true ~inline:(true, true) (List.map self#type_variant_leaf lst)]
        ]
      (* EQUAL private_flag BAR constructor_declarations {(Ptype_variant _, $2, None)} *)
      | (Ptype_variant lst, scope, None) ->  [
          privatize scope [makeList ~break:Always_rec ~postSpace:true ~inline:(true, true) (List.map self#type_variant_leaf lst)]
        ]
      (* EQUAL DOTDOT {(Ptype_open, Public, None)} *)
      | (Ptype_open, Public, None) -> [
          [atom ".."]
        ]
      (* Super confusing how record/variants' manifest is not actually the
         description of the structure. What's in the manifest in that case is
         the *second* EQUALS asignment. *)

      (* EQUAL private_flag LBRACE label_declarations opt_comma RBRACE {(Ptype_record _, $2, None)} *)
      | (Ptype_record lst, scope, None) ->
          let assumeRecordLoc = {loc_start = estimateRecordOpenBracePoint(); loc_end = x.ptype_loc.loc_end; loc_ghost = false} in
          [privatize scope [self#record_declaration ~assumeRecordLoc lst]]
      (* And now all of the forms involving *TWO* equals *)
      (* Again, super confusing how manifests of variants/records represent the
         structure after the second equals. *)
      (* ================================================*)


      (* EQUAL core_type EQUAL private_flag opt_bar constructor_declarations {
         (Ptype_variant _, _, Some _)} *)
      | (Ptype_variant lst, scope, Some mani) -> [
          [self#core_type mani];
          let variant = makeList ~break:IfNeed ~postSpace:true ~inline:(true, true) (List.map self#type_variant_leaf lst) in
          privatize scope [variant];
        ]

      (* EQUAL core_type EQUAL DOTDOT {(Ptype_open, Public, Some $2)} *)
      | (Ptype_open, Public, Some mani) -> [
          [self#core_type mani];
          [atom ".."];
        ]
      (* EQUAL core_type EQUAL private_flag LBRACE label_declarations opt_comma RBRACE
           {(Ptype_record _, $4, Some $2)} *)
      | (Ptype_record lst, scope, Some mani) ->
          let declaration = self#record_declaration lst in
          let record = match scope with
            | Public -> [declaration]
            | Private -> [label ~space:true privateAtom declaration]
          in
          [ [self#core_type mani]; record ]

      (* Everything else is impossible *)
      (* ================================================*)

      | (_, _, _ ) ->  raise (NotPossible "Encountered impossible type specification")
    in

    let makeConstraint (ct1, ct2, _) =
      let constraintEq = makeList ~postSpace:true [
        atom "constraint";
        self#core_type ct1;
        atom "=";
      ] in
      label ~space:true constraintEq (self#core_type ct2) in
    let constraints = List.map makeConstraint x.ptype_cstrs in
    (equalInitiatedSegments, constraints)

  (* "non-arrowed" means "a type where all arrows are inside at least one level of parens"

    z => z: not a "non-arrowed" type.
    (a, b): a "non-arrowed" type.
    (z=>z): a "non-arrowed" type because the arrows are guarded by parens.

    A "non arrowed, non simple" type would be one that is not-arrowed, and also
    not "simple". Simple means it is "clearly one unit" like (a, b), identifier,
    "hello", None.
  *)
  method non_arrowed_non_simple_core_type x =
    let {stdAttrs} = partitionAttributes x.ptyp_attributes in
    if stdAttrs != [] then
      formatAttributed
        (self#non_arrowed_simple_core_type {x with ptyp_attributes=[]})
        (self#attributes stdAttrs)
    else
      match x.ptyp_desc with
      (* This significantly differs from the standard OCaml printer/parser:
         Type constructors are no longer simple *)
      | _ -> self#non_arrowed_simple_core_type x

  method type_param_list_element = function
    | {ptyp_attributes = []; ptyp_desc = Ptyp_package(lid,cstrs)} ->
        self#typ_package ~mod_prefix:true lid cstrs
    | t -> self#core_type t

  method non_arrowed_simple_core_type x =
    let {stdAttrs} = partitionAttributes x.ptyp_attributes in
    if stdAttrs != [] then
      formatSimpleAttributed
        (self#non_arrowed_simple_core_type {x with ptyp_attributes=[]})
        (self#attributes stdAttrs)
    else
      let result =
        match x.ptyp_desc with
        (*   LPAREN core_type_comma_list RPAREN %prec below_NEWDOT *)
        (*       { match $2 with *)
        (*         | [] -> raise Parse_error *)
        (*         | one::[] -> one *)
        (*         | moreThanOne -> mktyp(Ptyp_tuple(List.rev moreThanOne)) } *)
        | Ptyp_tuple l -> makeTup (List.map self#type_param_list_element l)
        | Ptyp_object (l, o) -> self#unparseObject l o
        | Ptyp_package (lid, cstrs) ->
            self#typ_package ~protect:true ~mod_prefix:true lid cstrs
        (*   | QUOTE ident *)
        (*       { mktyp(Ptyp_var $2) } *)
        | Ptyp_var s -> ensureSingleTokenSticksToLabel (self#tyvar s)
        (*   | UNDERSCORE *)
        (*       { mktyp(Ptyp_any) } *)
        | Ptyp_any -> ensureSingleTokenSticksToLabel (atom "_")
        (*   | type_longident *)
        (*       { mktyp(Ptyp_constr(mkrhs $1 1, [])) } *)
        | Ptyp_constr (li, []) ->
          (* [ensureSingleTokenSticksToLabel] loses location information which is important
               when you are embedded inside a list and comments are to be interleaved around you.
               Therefore, we wrap the result in the correct [SourceMap].  *)
          source_map ~loc:li.loc
            (ensureSingleTokenSticksToLabel (self#longident_loc li))
        | Ptyp_constr (li, l) ->
            (match l with
            | [{ptyp_desc = Ptyp_object (_::_ as l, o) }] when isJsDotTLongIdent li.txt ->
                (* should have one or more rows, Js.t({..}) should print as Js.t({..})
                 * {..} has a totally different meaning than Js.t({..}) *)
                self#unparseObject ~withStringKeys:true l o
            | [{ptyp_desc = Ptyp_object (l, o) }] when not (isJsDotTLongIdent li.txt) ->
                label (self#longident_loc li)
                  (self#unparseObject ~wrap:("(",")") l o)
            | [{ptyp_desc = Ptyp_constr(lii, [{ ptyp_desc = Ptyp_object (_::_ as ll, o)}])}]
              when isJsDotTLongIdent lii.txt ->
              label (self#longident_loc li)
                (self#unparseObject ~withStringKeys:true ~wrap:("(",")") ll o)
            | _ ->
              (* small guidance: in `type foo = bar`, we're now at the `bar` part *)

              (* The single identifier has to be wrapped in a [ensureSingleTokenSticksToLabel] to
                 avoid (@see @avoidSingleTokenWrapping): *)
              label
                (self#longident_loc li)
                (makeTup (
                  List.map self#type_param_list_element l
                ))
            )
        | Ptyp_variant (l, closed, low) ->
          let pcd_loc = x.ptyp_loc in
          let pcd_attributes = x.ptyp_attributes in
          let pcd_res = None in
          let variant_helper i rf =
            match rf with
              | Rtag (label, attrs, opt_ampersand, ctl) ->
                let pcd_name = {
                  txt = label;
                  loc = pcd_loc;
                } in
                let pcd_args = Pcstr_tuple ctl in
                let all_attrs = List.concat [pcd_attributes; attrs] in
                self#type_variant_leaf ~opt_ampersand ~polymorphic:true {pcd_name; pcd_args; pcd_res; pcd_loc; pcd_attributes = all_attrs}
              | Rinherit ct ->
                (* '| type' is required if the Rinherit is not the first
                  row_field in the list
                 *)
                if i = 0 then
                  self#core_type ct
                else
                  makeList ~postSpace:true [atom "|"; self#core_type ct] in
          let (designator, tl) =
            match (closed,low) with
              | (Closed,None) -> ("", [])
              | (Closed,Some tl) -> ("<", tl)
              | (Open,_) -> (">", []) in
          let node_list = List.mapi variant_helper l in
          let ll = (List.map (fun t -> atom ("`" ^ t)) tl) in
          let tag_list = makeList ~postSpace:true ~break:IfNeed ((atom ">")::ll) in
          let type_list = if tl != [] then node_list@[tag_list] else node_list in
          makeList ~wrap:("[" ^ designator,"]") ~pad:(true, false) ~postSpace:true ~break:IfNeed type_list
        | Ptyp_class (li, []) -> makeList [atom "#"; self#longident_loc li]
        | Ptyp_class (li, l) ->
          label
            (makeList [atom "#"; self#longident_loc li])
            (makeTup (List.map self#core_type l))
        | Ptyp_extension e -> self#extension e
        | Ptyp_arrow (_, _, _)
        | Ptyp_alias (_, _)
        | Ptyp_poly (_, _) ->
            makeList ~wrap:("(",")") ~break:IfNeed [self#core_type x]
      in
      source_map ~loc:x.ptyp_loc result
  (* TODO: ensure that we have a form of desugaring that protects *)
  (* when final argument of curried pattern is a type constraint: *)
  (* | COLON non_arrowed_core_type EQUALGREATER expr
      { mkexp_constraint $4 (Some $2, None) }         *)
  (*                         \----/   \--/
                             constraint coerce

                             Creates a ghost expression:
                             mkexp_constraint | Some t, None -> ghexp(Pexp_constraint(e, t))
  *)

  method pattern_list_split_cons acc = function
    | {
      ppat_desc = Ppat_construct (
        { txt = Lident("::")},
        Some {ppat_desc = Ppat_tuple ([pat1; pat2])}
      ) } ->
        self#pattern_list_split_cons (pat1::acc) pat2
    | p -> (List.rev acc), p

  (*
   * Adds parens to the right sub-tree when it is not a single node:
   *
   * A | B                   is formatted as    A | B
   * A | (B | C)             is formatted as    A | (B | C)
   *
   * Also, adds parens to both sub-trees when both of them
   * are not a single node:
   * (A | B) | (C | D)       is formatted as    A | B | (C | D)
   * A | B | (C | D)         is formatted as    A | B | (C | D)
   * (A | B) | C             is formatted as    A | B | C
   * A | B | C               is formatted as    A | B | C
   *
   *)
  method or_pattern p1 p2 =
    let (p1_raw, p2_raw) = (self#pattern p1, self#pattern p2) in
    let (left, right) =
      match p2.ppat_desc with
        | Ppat_or _ -> (p1_raw, formatPrecedence p2_raw)
        | _ -> (p1_raw, p2_raw)
    in
    makeList
      ~break:IfNeed
      ~inline:(true, true)
      ~sep:(Sep "|")
      ~postSpace:true
      ~preSpace:true
      [left; right]

  method pattern_without_or x =
    (* TODOATTRIBUTES: Handle the stdAttrs here *)
    let {arityAttrs} = partitionAttributes x.ppat_attributes in
    match x.ppat_desc with
      | Ppat_alias (p, s) ->
          let raw_pattern = (self#pattern p) in
          let pattern_with_precedence = match p.ppat_desc with
            | Ppat_or (p1, p2) -> formatPrecedence (self#or_pattern p1 p2)
            | _ -> raw_pattern
          in
          label ~space:true
            (source_map ~loc:p.ppat_loc pattern_with_precedence)
            (makeList ~postSpace:true [
              atom "as";
              (source_map ~loc:s.loc (protectIdentifier s.txt))
            ]) (* RA*)
      | Ppat_variant (l, Some p) ->
          if arityAttrs != [] then
            raise (NotPossible "Should never see embedded attributes on poly variant")
          else
            source_map ~loc:x.ppat_loc
              (self#constructor_pattern (atom ("`" ^ l)) p
                 ~polyVariant:true ~arityIsClear:true)
      | Ppat_lazy p -> label ~space:true (atom "lazy") (self#simple_pattern p)
      | Ppat_construct (({txt} as li), po) when not (txt = Lident "::")-> (* FIXME The third field always false *)
          let formattedConstruction = match po with
            (* TODO: Check the explicit_arity field on the pattern/constructor
               attributes to determine if should desugar to an *actual* tuple. *)
            (* | Some ({ *)
            (*   ppat_desc=Ppat_tuple l; *)
            (*   ppat_attributes=[{txt="explicit_arity"; loc}] *)
            (* }) -> *)
            (*   label ~space:true (self#longident_loc li) (makeSpacedBreakableInlineList (List.map self#simple_pattern l)) *)
            | Some pattern ->
                let arityIsClear = isArityClear arityAttrs in
                self#constructor_pattern ~arityIsClear (self#longident_loc li) pattern
            | None ->
                self#longident_loc li
          in
          source_map ~loc:x.ppat_loc formattedConstruction
      | _ -> self#simple_pattern x

  method pattern x =
    let {arityAttrs; stdAttrs} = partitionAttributes x.ppat_attributes in
    if stdAttrs != [] then
      formatAttributed
        (* Doesn't need to be simple_pattern because attributes are parse as
         * appyling to the entire "function application style" syntax preceeding them *)
        (self#pattern {x with ppat_attributes=arityAttrs})
        (self#attributes stdAttrs)
    else match x.ppat_desc with
      | Ppat_or (p1, p2) ->
        self#or_pattern p1 p2
      | _ -> self#pattern_without_or x

  method patternList ?(wrap=("","")) pat =
    let pat_list, pat_last = self#pattern_list_split_cons [] pat in
    let pat_list = List.map self#pattern pat_list in
    match pat_last with
    | {ppat_desc = Ppat_construct ({txt=Lident "[]"},_)} -> (* [x,y,z] *)
      let (lwrap, rwrap) = wrap in
      makeList pat_list
        ~break:Layout.IfNeed ~sep:commaTrail ~postSpace:true
        ~wrap:(lwrap ^ "[", "]" ^ rwrap)
    | _ -> (* x::y *)
      makeES6List pat_list (self#pattern pat_last) ~wrap

  (* In some contexts the Ptyp_package needs to be protected by parens, or
   * the `module` keyword needs to be added.
   * Example: let f = (module Add: S.Z, x) => Add.add(x);
   *  It's clear that `S.Z` is a module because it constraints the
   *  `module Add` pattern. No need to add "module" before `S.Z`.
   *
   * Example2:
   *   type t = (module Console);
   *   In this case the "module" keyword needs to be printed to indicate
   *   usage of a first-class-module.
   *)
  method typ_package ?(protect=false) ?(mod_prefix=true) lid cstrs =
    let packageIdent =
      let packageIdent = self#longident_loc lid in
      if mod_prefix then
        makeList ~postSpace:true [atom "module"; packageIdent]
      else packageIdent
    in
    let unwrapped_layout = match cstrs with
    | [] -> packageIdent
    | cstrs ->
        label ~space:true
          (makeList ~postSpace:true [packageIdent; atom "with"])
          (makeList
            ~inline:(true, true)
            ~break:IfNeed
            ~sep:(Sep " and ")
            (List.map (fun (s, ct) ->
              label ~space:true
                (makeList
                  ~break:IfNeed ~postSpace:true
                  [atom "type"; self#longident_loc s; atom "="])
                (self#core_type ct)
            ) cstrs))
    in
    if protect then
      makeList ~postSpace:true ~wrap:("(", ")") [unwrapped_layout ]
    else unwrapped_layout

  method constrained_pattern x = match x.ppat_desc with
    | Ppat_constraint (p, ct) ->
        let (pat, typ) = begin match (p, ct) with
        | (
            {ppat_desc = Ppat_unpack(unpack)},
            {ptyp_desc = Ptyp_package (lid, cstrs)}
          ) ->
            (makeList ~postSpace:true [atom "module"; atom unpack.txt],
             self#typ_package ~mod_prefix:false lid cstrs)
        | _ ->
          (self#pattern p, self#core_type ct)
        end in
        formatTypeConstraint pat typ
    | _  -> self#pattern x

  method simple_pattern x =
    let {arityAttrs; stdAttrs} = partitionAttributes x.ppat_attributes in
    if stdAttrs != [] then
      formatSimpleAttributed
        (self#simple_pattern {x with ppat_attributes=arityAttrs})
        (self#attributes stdAttrs)
    else
      let itm =
        match x.ppat_desc with
          | Ppat_construct (({loc; txt=Lident ("()"|"[]" as x)}), _) ->
              (* Patterns' locations might include a leading bar depending on the
               * context it was parsed in. Therefore, we need to include further
               * information about the contents of the pattern such as tokens etc,
               * in order to get comments to be distributed correctly.*)
            atom ~loc x
          | Ppat_construct (({txt=Lident "::"}), _) ->
            self#patternList x (* LIST PATTERN *)
          | Ppat_construct (li, None) ->
            source_map ~loc:x.ppat_loc (self#longident_loc li)
          | Ppat_any -> atom "_"
          | Ppat_var ({loc; txt = txt}) ->
            (*
               To prevent this:

                 let oneArgShouldWrapToAlignWith
                   theFunctionNameBinding => theFunctionNameBinding;

               And instead do:

                 let oneArgShouldWrapToAlignWith
                     theFunctionNameBinding => theFunctionNameBinding;

               We have to do something to the non "listy" patterns. Non listy
               patterns don't indent the same amount as listy patterns when docked
               to a label.

               If wrapping the non-listy pattern in [ensureSingleTokenSticksToLabel]
               you'll get the following (even though it should wrap)

                 let oneArgShouldWrapToAlignWith theFunctionNameBinding => theFunctionNameBinding;

             *)
            source_map ~loc (protectIdentifier txt)
          | Ppat_array l ->
              self#patternArray l
          | Ppat_unpack s ->
              makeList ~wrap:("(", ")") ~break:IfNeed ~postSpace:true [atom "module"; atom s.txt]
          | Ppat_open (lid, pat) ->
            (* let someFn Qualified.{ record } = ... *)
            let needsParens = match pat.ppat_desc with
              | Ppat_exception _ -> true
              | _ -> false
            in
            let pat = self#simple_pattern pat in
            label
              (label (self#longident_loc lid) (atom (".")))
              (if needsParens then formatPrecedence pat else pat)
          | Ppat_type li ->
              makeList [atom "#"; self#longident_loc li]
          | Ppat_record (l, closed) ->
             self#patternRecord l closed
          | Ppat_tuple l ->
             self#patternTuple l
          | Ppat_constant c ->
            let raw_literal, _ = extract_raw_literal x.ppat_attributes in
            (self#constant ?raw_literal c)
          | Ppat_interval (c1, c2) ->
            makeList [self#constant c1; atom ".."; self#constant c2]
          | Ppat_variant (l, None) -> makeList[atom "`"; atom l]
          | Ppat_constraint (p, ct) ->
              formatPrecedence (formatTypeConstraint (self#pattern p) (self#core_type ct))
          | Ppat_lazy p ->formatPrecedence (label ~space:true (atom "lazy") (self#simple_pattern p))
          | Ppat_extension e -> self#extension e
          | Ppat_exception p ->
              (*
                An exception pattern with an alias should be wrapped in (...)
                The rules for what goes to the right of the exception are a little (too) nuanced.
                It accepts "non simple" parameters, except in the case of `as`.
                Here we consistently apply "simplification" to the exception argument.
                Example:
                  | exception (Sys_error _ as exc) => raise exc
                 parses correctly while
                  | Sys_error _ as exc => raise exc
                 results in incorrect parsing with type error otherwise.
              *)
               (makeList ~postSpace:true [atom "exception"; self#simple_pattern p])
          | _ -> formatPrecedence (self#pattern x) (* May have a redundant sourcemap *)
        in
        source_map ~loc:x.ppat_loc itm

  method label_exp lbl opt pat =
    let term = self#constrained_pattern pat in
    let param = match lbl with
      | Nolabel -> term
      | Labelled lbl | Optional lbl when is_punned_labelled_pattern pat lbl ->
        makeList [atom namedArgSym; term]
      | Labelled lbl | Optional lbl ->
        let lblLayout=
          makeList ~sep:(Sep " ") ~break:Layout.Never
            [atom (namedArgSym ^ lbl); atom "as"]
        in
        label lblLayout ~space:true term
    in
    match opt, lbl with
    | None, Optional _ -> makeList [param; atom "=?"]
    | None, _ -> param
    | Some o, _ -> makeList [param; atom "="; (self#unparseProtectedExpr ~forceParens:true o)]

  method access op cls e1 e2 = makeList [
    (* Important that this be not breaking - at least to preserve same
       behavior as stock desugarer. It might even be required (double check
       in parser.mly) *)
    e1;
    atom op;
    e2;
    atom cls;
  ]


  method simple_get_application x =
    let {stdAttrs; jsxAttrs} = partitionAttributes x.pexp_attributes in
    match (x.pexp_desc, stdAttrs, jsxAttrs) with
    | (_, _::_, []) -> None (* Has some printed attributes - not simple *)
    | (Pexp_apply ({pexp_desc=Pexp_ident loc}, l), [], _jsx::_) -> (
      (* TODO: Soon, we will allow the final argument to be an identifier which
         represents the entire list. This would be written as
         `<tag>...list</tag>`. If you imagine there being an implicit [] inside
         the tag, then it would be consistent with array spread:
         [...list] evaluates to the thing as list.
      *)
      let hasLabelledChildrenLiteral = List.exists (function
        | (Labelled "children", _) -> true
        | _ -> false
      ) l in
      let rec hasSingleNonLabelledUnitAndIsAtTheEnd l = match l with
      | [] -> false
      | (Nolabel, {pexp_desc = Pexp_construct ({txt = Lident "()"}, _)}) :: [] -> true
      | (Nolabel, _) :: _ -> false
      | _ :: rest -> hasSingleNonLabelledUnitAndIsAtTheEnd rest
      in
      if hasLabelledChildrenLiteral && hasSingleNonLabelledUnitAndIsAtTheEnd l then
        let moduleNameList = List.rev (List.tl (List.rev (Longident.flatten loc.txt))) in
        if moduleNameList != [] then
          if Longident.last loc.txt = "createElement" then
            Some (self#formatJSXComponent (String.concat "." moduleNameList) l)
          else None
        else Some (self#formatJSXComponent (Longident.last loc.txt) l)
      else None
    )
    | (Pexp_apply (
        {pexp_desc=
          Pexp_letmodule(_,
            ({pmod_desc=Pmod_apply _} as app),
            {pexp_desc=Pexp_ident loc}
          )}, l), [], _jsx::_) -> (
      (* TODO: Soon, we will allow the final argument to be an identifier which
         represents the entire list. This would be written as
         `<tag>...list</tag>`. If you imagine there being an implicit [] inside
         the tag, then it would be consistent with array spread:
         [...list] evaluates to the thing as list.
      *)
      let rec extract_apps args = function
        | { pmod_desc = Pmod_apply (m1, {pmod_desc=Pmod_ident loc}) } ->
          let arg = String.concat "." (Longident.flatten loc.txt) in
          extract_apps (arg :: args) m1
        | { pmod_desc=Pmod_ident loc } -> (String.concat "." (Longident.flatten loc.txt))::args
        | _ -> failwith "Functors in JSX tags support only module names as parameters" in
      let hasLabelledChildrenLiteral = List.exists (function
        | (Labelled "children", _) -> true
        | _ -> false
      ) l in
      let rec hasSingleNonLabelledUnitAndIsAtTheEnd l = match l with
      | [] -> false
      | (Nolabel, {pexp_desc = Pexp_construct ({txt = Lident "()"}, _)}) :: [] -> true
      | (Nolabel, _) :: _ -> false
      | _ :: rest -> hasSingleNonLabelledUnitAndIsAtTheEnd rest
      in
      if hasLabelledChildrenLiteral && hasSingleNonLabelledUnitAndIsAtTheEnd l then
        if List.length (Longident.flatten loc.txt) > 1 then
          if Longident.last loc.txt = "createElement" then
            begin match extract_apps [] app with
              | ftor::args ->
                let applied = ftor ^ "(" ^ String.concat ", " args ^ ")" in
                Some (self#formatJSXComponent ~closeComponentName:ftor applied l)
              | _ -> None
            end
          else None
        else Some (self#formatJSXComponent (Longident.last loc.txt) l)
      else None
    )
    | _ -> None

  (** Detects "sugar expressions" (sugar for array/string setters) and returns their separate
      parts.  *)
  method sugar_set_expr_parts e =
    if e.pexp_attributes != [] then None
    (* should also check attributes underneath *)
    else match e.pexp_desc with
      | Pexp_apply ({pexp_desc=Pexp_ident{txt=Ldot (Lident ("Array"), "set")}}, [(_,e1);(_,e2);(_,e3)]) ->
        let prec = Custom "prec_lbracket" in
        let lhs = self#unparseResolvedRule (
            self#ensureExpression ~reducesOnToken:prec e1
          ) in
        Some (self#access "[" "]" lhs (self#unparseExpr e2), e3)
      | Pexp_apply ({pexp_desc=Pexp_ident {txt=Ldot (Lident "String", "set")}}, [(_,e1);(_,e2);(_,e3)]) ->
        let prec = Custom "prec_lbracket" in
        let lhs = self#unparseResolvedRule (
            self#ensureExpression ~reducesOnToken:prec e1
          ) in
        Some ((self#access ".[" "]" lhs (self#unparseExpr e2)), e3)
      | Pexp_apply (
        {pexp_desc=Pexp_ident {txt = Ldot (Ldot (Lident "Bigarray", array), "set")}},
        label_exprs
      ) -> (
        match array with
          | "Genarray" -> (
            match label_exprs with
            | [(_,a);(_,{pexp_desc=Pexp_array ls});(_,c)] ->
              let formattedList = List.map self#unparseExpr ls in
              let lhs = makeList [self#simple_enough_to_be_lhs_dot_send a; atom "."] in
              let rhs = makeList ~break:IfNeed ~postSpace:true ~sep:commaSep ~wrap:("{", "}") formattedList
              in
              Some (label lhs rhs, c)
            | _ -> None
          )
          | ("Array1"|"Array2"|"Array3") -> (
            match label_exprs with
            | (_,a)::rest -> (
              match List.rev rest with
              | (_,v)::rest ->
                let args = List.map snd (List.rev rest) in
                let formattedList = List.map self#unparseExpr args in
                let lhs = makeList [self#simple_enough_to_be_lhs_dot_send a; atom "."] in
                let rhs = makeList ~break:IfNeed ~postSpace:true ~sep:commaSep ~wrap:("{", "}") formattedList in
                Some (label lhs rhs, v)
              | _ -> assert false
            )
            | _ -> assert false
          )
          | _ -> None
        )
      | _ -> None

  (*

     How would we know not to print the sequence without { }; protecting the let a?

                            let a
                             |
                           sequence
                          /        \
                    let a           print a
                    alert a
     let res = {
       let a = something();
       {                     \
         alert(a);           | portion to be parsed as a sequence()
         let a = 20;         | The final ; print(a) causes the entire
         alert(a);           | portion to be parsed as a sequence()
       };                    |
       print (a);            /
     }

     ******************************************************************
     Any time the First expression of a sequence is another sequence, or (as in
     this case) a let, wrapping the first sequence expression in { } is
     required.
     ******************************************************************
  *)

  (**
     TODO: Configure the optional ability to print the *minimum* number of
     parens. It's simply a matter of changing [higherPrecedenceThan] to
     [higherOrEqualPrecedenceThan].
   *)

  (* The point of the function is to ensure that ~reducesAfterRight:rightExpr will reduce
     at the proper time when it is reparsed, possibly wrapping it
     in parenthesis if needed. It ensures a rule doesn't reduce
     until *after* `reducesAfterRight` gets a chance to reduce.
     Example: The addition rule which has precedence of rightmost
     token "+", in `x + a * b` should not reduce until after the a * b gets
     a chance to reduce. This function would determine the minimum parens to
     ensure that. *)
  method ensureContainingRule ~withPrecedence ~reducesAfterRight () =
    match self#unparseExprRecurse reducesAfterRight with
    | SpecificInfixPrecedence ({shiftPrecedence}, rightRecurse) ->
      if higherPrecedenceThan shiftPrecedence withPrecedence then rightRecurse
      else if (higherPrecedenceThan withPrecedence shiftPrecedence) then
        LayoutNode (formatPrecedence ~loc:reducesAfterRight.pexp_loc (self#unparseResolvedRule rightRecurse))
      else (
        if isRightAssociative ~prec:withPrecedence then
         rightRecurse
        else
          LayoutNode (formatPrecedence ~loc:reducesAfterRight.pexp_loc (self#unparseResolvedRule rightRecurse))
      )
    | FunctionApplication itms ->
      let funApplExpr = formatAttachmentApplication applicationFinalWrapping None (itms, Some reducesAfterRight.pexp_loc)
      in
      (* Little hack: need to print parens for the `bar` application in e.g.
         `foo->other##(bar(baz))` or `foo->other->(bar(baz))`. *)
      if higherPrecedenceThan withPrecedence (Custom "prec_functionAppl")
      then LayoutNode (formatPrecedence ~loc:reducesAfterRight.pexp_loc funApplExpr)
      else LayoutNode funApplExpr
    | PotentiallyLowPrecedence itm -> LayoutNode (formatPrecedence ~loc:reducesAfterRight.pexp_loc itm)
    | Simple itm -> LayoutNode itm

  method ensureExpression ~reducesOnToken expr =
    match self#unparseExprRecurse expr with
    | SpecificInfixPrecedence ({reducePrecedence}, leftRecurse) ->
      if higherPrecedenceThan reducePrecedence reducesOnToken then leftRecurse
      else if higherPrecedenceThan reducesOnToken reducePrecedence then
        LayoutNode (formatPrecedence ~loc:expr.pexp_loc (self#unparseResolvedRule leftRecurse))
      else (
        if isLeftAssociative ~prec:reducesOnToken then
          leftRecurse
        else
          LayoutNode (formatPrecedence ~loc:expr.pexp_loc (self#unparseResolvedRule leftRecurse))
      )
    | FunctionApplication itms -> LayoutNode (formatAttachmentApplication applicationFinalWrapping None (itms, Some expr.pexp_loc))
    | PotentiallyLowPrecedence itm -> LayoutNode (formatPrecedence ~loc:expr.pexp_loc itm)
    | Simple itm -> LayoutNode itm

  (** Attempts to unparse: The beginning of a more general printing algorithm,
      that determines how to print based on precedence of tokens and rules.
      The end goal is that this should be completely auto-generated from the
      Menhir parsing tables. We could move more and more into this function.

      You could always just call self#expression, but `unparseExpr` will render
      infix/prefix/unary/terary fixities in their beautiful forms while
      minimizing parenthesis.
  *)
  method unparseExpr x =
    match self#unparseExprRecurse x with
    | SpecificInfixPrecedence (_, resolvedRule) ->
        self#unparseResolvedRule resolvedRule
    | FunctionApplication itms ->
        formatAttachmentApplication applicationFinalWrapping None (itms, Some x.pexp_loc)
    | PotentiallyLowPrecedence itm -> itm
    | Simple itm -> itm

  (* This method may not even be needed *)
  method unparseUnattributedExpr x =
    match partitionAttributes x.pexp_attributes with
    | {docAttrs = []; stdAttrs = []} -> self#unparseExpr x
    | _ -> makeList ~wrap:("(",")") [self#unparseExpr x]

  (* ensureExpr ensures that the expression is wrapped in parens
   * e.g. is necessary in cases like:
   * let display = (:message=("hello": string)) => 1;
   * but not in cases like:
   * let f = (a: bool) => 1;
   * TODO: in the future we should probably use the type ruleCategory
   * to 'automatically' ensure the validity of a constraint expr with parens...
   *)
  method unparseProtectedExpr ?(forceParens=false) e =
    let itm =
      match e with
      | { pexp_attributes = []; pexp_desc = Pexp_constraint (x, ct)} ->
        let x = self#unparseExpr x in
        let children = [x; label ~space:true (atom ":") (self#core_type ct)] in
        if forceParens then
          makeList ~wrap:("(", ")") children
        else makeList children
      | { pexp_attributes; pexp_desc = Pexp_constant c } ->
        (* When we have Some(-1) or someFunction(-1, -2), the arguments -1 and -2
         * pass through this case. In this context they don't need to be wrapped in extra parens
         * Some((-1)) should be printed as Some(-1). This is in contrast with
         * 1 + (-1) where we print the parens for readability. *)
          let raw_literal, pexp_attributes =
            extract_raw_literal pexp_attributes
          in
          let constant = self#constant ?raw_literal ~parens:forceParens c in
          begin match pexp_attributes with
          | [] -> constant
          | attrs ->
              let formattedAttrs = makeSpacedBreakableInlineList (List.map self#item_attribute attrs) in
               makeSpacedBreakableInlineList [formattedAttrs; constant]
          end
      | {pexp_desc = Pexp_fun _ } -> self#formatPexpFun e
      | x -> self#unparseExpr x
    in
    source_map ~loc:e.pexp_loc itm

  method simplifyUnparseExpr ?(inline=false) ?(wrap=("(", ")")) x =
    match self#unparseExprRecurse x with
    | SpecificInfixPrecedence (_, itm) ->
        formatPrecedence
          ~inline
          ~wrap
          ~loc:x.pexp_loc
          (self#unparseResolvedRule itm)
    | FunctionApplication itms ->
      formatPrecedence
        ~inline
        ~wrap
        ~loc:x.pexp_loc
        (formatAttachmentApplication applicationFinalWrapping None (itms, Some x.pexp_loc))
    | PotentiallyLowPrecedence itm ->
        formatPrecedence
          ~inline
          ~wrap
          ~loc:x.pexp_loc
          itm
    | Simple itm -> itm


  method unparseResolvedRule  = function
    | LayoutNode layoutNode -> layoutNode
    | InfixTree _ as infixTree ->
      formatComputedInfixChain (computeInfixChain infixTree)

  method unparseExprApplicationItems x =
    match self#unparseExprRecurse x with
    | SpecificInfixPrecedence (_, wrappedRule) ->
        let itm = self#unparseResolvedRule wrappedRule in
        ([itm], Some x.pexp_loc)
    | FunctionApplication itms -> (itms, Some x.pexp_loc)
    | PotentiallyLowPrecedence itm -> ([itm], Some x.pexp_loc)
    | Simple itm -> ([itm], Some x.pexp_loc)


  (* Provides beautiful printing for pipe first sugar:
   * foo
   * ->f(a, b)
   * ->g(c, d)
   *)
  method formatPipeFirst e =
    let module PipeFirstTree = struct
      type exp = Parsetree.expression

      type flatNode =
        | Exp of exp
        | ExpU of exp (* uncurried *)
        | Args of (Asttypes.arg_label * exp) list
      type flatT = flatNode list

      type node = {
        exp: exp;
        args: (Asttypes.arg_label *exp) list;
        uncurried: bool;
      }
      type t = node list

      let formatNode ?prefix ?(first=false) {exp; args; uncurried} =
        let formatLayout expr =
          let formatted = if first then
            self#ensureExpression ~reducesOnToken:(Token pipeFirstToken) expr
          else
            match expr with
            (* a->foo(x, _) and a->(foo(x, _)) are equivalent under pipe first
             * (a->foo)(x, _) is unnatural and desugars to
             *    (__x) => (a |. foo)(x, __x)
             * Under `->`, it makes more sense to desugar into
             *  a |. (__x => foo(x, __x))
             *
             * Hence we don't need parens in this case.
             *)
            | expr when Reason_heuristics.isUnderscoreApplication expr ->
                LayoutNode (self#unparseExpr expr)
            | _ ->
              self#ensureContainingRule
                ~withPrecedence:(Token pipeFirstToken) ~reducesAfterRight:expr ()
          in
          self#unparseResolvedRule formatted
        in
        let parens = match (exp.pexp_desc) with
        | Pexp_apply (e,_) -> printedStringAndFixityExpr e = UnaryPostfix "^"
        | _ -> false
        in
        let layout = match args with
        | [] ->
          let e = formatLayout exp in
          (match prefix with
          | Some l -> makeList [l; e]
          | None -> e)
        | args ->
            let fakeApplExp =
              let loc_end = match List.rev args with
                | (_, e)::_ -> e.pexp_loc.loc_end
                | _ -> exp.pexp_loc.loc_end
              in
              {exp with pexp_loc = { exp.pexp_loc with loc_end = loc_end } }
            in
            makeList (
              self#formatFunAppl
                ?prefix
                ~jsxAttrs:[]
                ~args
                ~funExpr:exp
                ~applicationExpr:fakeApplExp
                ~uncurried
                ()
            )
        in
        if parens then
          formatPrecedence layout
        else layout
    end in
    (* Imagine: foo->f(a, b)->g(c,d)
     * The corresponding parsetree looks more like:
     *   (((foo->f)(a,b))->g)(c, d)
     * The extra Pexp_apply nodes, e.g. (foo->f), result into a
     * nested/recursive ast which is pretty inconvenient in terms of printing.
     * For printing purposes we actually want something more like:
     *  foo->|f(a,b)|->|g(c, d)|
     * in order to provide to following printing:
     *  foo
     *  ->f(a, b)
     *  ->g(c, d)
     * The job of "flatten" is to turn the inconvenient, nested ast
     *  (((foo->f)(a,b))->g)(c, d)
     * into
     *  [Exp foo; Exp f; Args [a; b]; Exp g; Args [c; d]]
     * which can be processed for printing purposes.
     *)
    let rec flatten ?(uncurried=false) acc = function
      | {pexp_desc = Pexp_apply(
          {pexp_desc = Pexp_ident({txt = Longident.Lident("|.")})},
          [Nolabel, arg1; Nolabel, arg2]
         )} ->
          flatten ((PipeFirstTree.Exp arg2)::acc) arg1
      | {pexp_attributes;
         pexp_desc = Pexp_apply(
          {pexp_desc = Pexp_apply(
           {pexp_desc = Pexp_ident({txt = Longident.Lident("|.")})},
             [Nolabel, arg1; Nolabel, arg2]
           )},
           args
         )} as e ->
          let args = PipeFirstTree.Args args in
          begin match pexp_attributes with
          | [{txt = "bs"}, PStr []] ->
            flatten ((PipeFirstTree.ExpU arg2)::args::acc) arg1
          | [] ->
              (* the uncurried attribute might sit on the Pstr_eval
               * enclosing the Pexp_apply*)
              if uncurried then
                flatten ((PipeFirstTree.ExpU arg2)::args::acc) arg1
              else
                flatten ((PipeFirstTree.Exp arg2)::args::acc) arg1
          | _ ->
            (PipeFirstTree.Exp e)::acc
          end
      | {pexp_desc = Pexp_ident({txt = Longident.Lident("|.")})} -> acc
      | arg -> ((PipeFirstTree.Exp arg)::acc)
    in
    (* Given: foo->f(a, b)->g(c, d)
     * We get the following PipeFirstTree.flatNode list:
     *   [Exp foo; Exp f; Args [a; b]; Exp g; Args [c; d]]
     * The job of `parse` is to turn the "flat representation"
     * (a.k.a. PipeFirstTree.flastNode list) into a more convenient structure
     * that allows us to express the segments: "foo" "f(a, b)" "g(c, d)".
     * PipeFirstTree.t expresses those segments.
     *  [{exp = foo; args = []}; {exp = f; args = [a; b]}; {exp = g; args = [c; d]}]
     *)
    let rec parse acc = function
    | (PipeFirstTree.Exp e)::(PipeFirstTree.Args args)::xs ->
        parse ((PipeFirstTree.{exp = e; args; uncurried = false})::acc) xs
    | (PipeFirstTree.ExpU e)::(PipeFirstTree.Args args)::xs ->
        parse ((PipeFirstTree.{exp = e; args; uncurried = true})::acc) xs
    | (PipeFirstTree.Exp e)::xs ->
        parse ((PipeFirstTree.{exp = e; args = []; uncurried = false})::acc) xs
    | _ -> List.rev acc
    in
    (* Given: foo->f(. a,b);
     * The uncurried attribute doesn't sit on the Pexp_apply, but sits on
     * the top level Pstr_eval. We don't have access to top-level context here,
     * hence the lookup in the global uncurriedTable to correctly determine
     * if we need to print uncurried. *)
    let uncurried = try Hashtbl.find uncurriedTable e.pexp_loc with
      | Not_found -> false
    in
    (* Turn
     *  foo->f(a, b)->g(c, d)
     * into
     *  [Exp foo; Exp f; Args [a; b]; Exp g; Args [c; d]]
     *)
    let (flatNodes : PipeFirstTree.flatT) = flatten ~uncurried [] e in
    (* Turn
     *  [Exp foo; Exp f; Args [a; b]; Exp g; Args [c; d]]
     * into
     *  [{exp = foo; args = []}; {exp = f; args = [a; b]}; {exp = g; args = [c; d]}]
     *)
    let (pipetree : PipeFirstTree.t) = parse [] flatNodes in
    (* Turn
     *  [{exp = foo; args = []}; {exp = f; args = [a; b]}; {exp = g; args = [c; d]}]
     * into
     *  [foo; ->f(a, b); ->g(c, d)]
     *)
    let pipeSegments = match pipetree with
    (* Special case printing of
     * foo->bar(
     *  aa,
     *  bb,
     * )
     *
     *  We don't want
     *  foo
     *  ->bar(
     *      aa,
     *      bb
     *    )
     *
     *  Notice how `foo->bar` shouldn't break, it wastes space and is
     *  inconsistent with
     *  foo.bar(
     *    aa,
     *    bb,
     *  )
     *)
    | [({exp = {pexp_desc = Pexp_ident _ }} as hd); last] ->
        let prefix = Some (
          makeList [PipeFirstTree.formatNode ~first:true hd; atom "->"]
        ) in
        [PipeFirstTree.formatNode ?prefix last]
    | hd::tl ->
        let hd = PipeFirstTree.formatNode ~first:true hd in
        let tl = List.map (fun node ->
          makeList [atom "->"; PipeFirstTree.formatNode node]
        ) tl in
        hd::tl
    | [] -> []
    in
    (* Provide nice breaking for: [foo; ->f(a, b); ->g(c, d)]
     * foo
     * ->f(a, b)
     * ->g(c, d)
     *)
    makeList ~break:IfNeed ~inline:(true, true) pipeSegments

  (*
   * Replace (__x) => foo(__x) with foo(_)
   *)
  method process_underscore_application x =
    let process_application expr =
      let process_arg (l,e) = match e.pexp_desc with
        | Pexp_ident ({ txt = Lident "__x"} as id) ->
          let pexp_desc = Pexp_ident {id with txt = Lident "_"} in
          (l, {e with pexp_desc})
        | _ ->
          (l,e) in
      match expr.pexp_desc with
      | Pexp_apply (e_fun, args) ->
        let pexp_desc = Pexp_apply (e_fun, List.map process_arg args) in
        {expr with pexp_desc}
      | _ ->
        expr in
    match x.pexp_desc with
    | Pexp_fun (Nolabel, None, {ppat_desc = Ppat_var {txt="__x"}},
        ({pexp_desc = Pexp_apply _} as e)) ->
      process_application e
    | Pexp_fun (l, eo, p, e) ->
       let e_processed = self#process_underscore_application e in
       if e == e_processed then
         x
       else
         {x with pexp_desc = Pexp_fun (l, eo, p, e_processed)}
    | _ ->
      x

  method unparseExprRecurse x =
    let x = self#process_underscore_application x in
    (* If there are any attributes, render unary like `(~-) x [@ppx]`, and infix like `(+) x y [@attr]` *)

    let {arityAttrs; stdAttrs; jsxAttrs; stylisticAttrs; uncurried} =
      partitionAttributes ~allowUncurry:(Reason_heuristics.bsExprCanBeUncurried x) x.pexp_attributes
    in
    let stylisticAttrs = Reason_attributes.maybe_remove_stylistic_attrs stylisticAttrs preserve_braces in
    let () = if uncurried then Hashtbl.add uncurriedTable x.pexp_loc true in
    let x = {x with pexp_attributes = (stylisticAttrs @ arityAttrs @ stdAttrs @ jsxAttrs) } in
    (* If there's any attributes, recurse without them, then apply them to
       the ends of functions, or simplify infix printings then append. *)
    if stdAttrs != [] then
      let withoutVisibleAttrs = {x with pexp_attributes=(stylisticAttrs @ arityAttrs @ jsxAttrs)} in
      let attributesAsList = (List.map self#attribute stdAttrs) in
      let itms = match self#unparseExprRecurse withoutVisibleAttrs with
        | SpecificInfixPrecedence ({reducePrecedence}, wrappedRule) ->
            let itm = self#unparseResolvedRule wrappedRule in
            (match reducePrecedence with
             (* doesn't need wrapping; we know how to parse *)
             | Custom "prec_lbracket" | Token "." -> [itm]
             | _ -> [formatPrecedence ~loc:x.pexp_loc itm])
        | FunctionApplication itms -> itms
        | PotentiallyLowPrecedence itm -> [formatPrecedence ~loc:x.pexp_loc itm]
        | Simple itm -> [itm]
      in
      FunctionApplication [
        makeList
          ~break:IfNeed
          ~inline:(true, true)
          ~indent:0
          ~postSpace:true
          (List.concat [attributesAsList; itms])
      ]
    else
    match self#simplest_expression x with
    | Some se -> Simple se
    | None ->
    match x.pexp_desc with
    | Pexp_apply (e, ls) -> (
      let ls = List.map (fun (l,expr) -> (l, self#process_underscore_application expr)) ls in
      match (e, ls) with
      | (e, _) when Reason_heuristics.isPipeFirst e ->
        let prec = Token pipeFirstToken in
          SpecificInfixPrecedence
            ({reducePrecedence=prec; shiftPrecedence=prec}, LayoutNode (self#formatPipeFirst x))
      | ({pexp_desc = Pexp_ident {txt = Ldot (Lident ("Array"),"get")}}, [(_,e1);(_,e2)]) ->
        begin match e1.pexp_desc with
          | Pexp_ident ({txt = Lident "_"}) ->
            let k = atom "Array.get" in
            let v = makeList ~postSpace:true ~sep:(Layout.Sep ",") ~wrap:("(", ")")
                [atom "_"; self#unparseExpr e2]
            in
            Simple (label k v)
          | _ ->
            let prec = Custom "prec_lbracket" in
            let lhs = self#unparseResolvedRule (
              self#ensureExpression ~reducesOnToken:prec e1
            ) in
            let rhs = self#unparseExpr e2 in
            SpecificInfixPrecedence
              ({reducePrecedence=prec; shiftPrecedence=prec}, LayoutNode (self#access "[" "]" lhs rhs))
        end
      | ({pexp_desc = Pexp_ident {txt = Ldot (Lident ("String"),"get")}}, [(_,e1);(_,e2)]) ->
        if Reason_heuristics.isUnderscoreIdent e1 then
          let k = atom "String.get" in
          let v = makeList ~postSpace:true ~sep:(Layout.Sep ",") ~wrap:("(", ")")
              [atom "_"; self#unparseExpr e2]
          in
          Simple (label k v)
        else
          let prec = Custom "prec_lbracket" in
            let lhs = self#unparseResolvedRule (
              self#ensureExpression ~reducesOnToken:prec e1
            ) in
            let rhs = self#unparseExpr e2 in
          SpecificInfixPrecedence
            ({reducePrecedence=prec; shiftPrecedence=prec}, LayoutNode (self#access ".[" "]" lhs rhs))
      | (
        {pexp_desc= Pexp_ident {txt=Ldot (Ldot (Lident "Bigarray", "Genarray" ), "get")}},
        [(_,e1); (_,({pexp_desc=Pexp_array ls} as e2))]
      ) ->
        if (Reason_heuristics.isUnderscoreIdent e1) then
          let k = atom "Bigarray.Genarray.get" in
          let v = makeList ~postSpace:true ~sep:(Layout.Sep ",") ~wrap:("(", ")")
              [atom "_"; self#unparseExpr e2]
          in
          Simple (label k v)
        else
          let formattedList = List.map self#unparseExpr ls in
          let lhs = makeList [(self#simple_enough_to_be_lhs_dot_send e1); atom "."] in
          let rhs = makeList ~break:IfNeed ~postSpace:true ~sep:commaSep ~wrap:("{", "}") formattedList in
          let prec = Custom "prec_lbracket" in
          SpecificInfixPrecedence ({reducePrecedence=prec; shiftPrecedence=prec}, LayoutNode (label lhs rhs))
      | (
        {pexp_desc= Pexp_ident {txt=
                                  Ldot (Ldot (Lident "Bigarray", (("Array1"|"Array2"|"Array3") as arrayIdent)), "get")}
        },
        (_,e1)::rest
      ) ->
        if Reason_heuristics.isUnderscoreIdent e1 then
          let k = atom("Bigarray." ^ arrayIdent ^ ".get") in
          let v = makeList ~postSpace:true ~sep:(Layout.Sep ",") ~wrap:("(", ")")
              ((atom "_")::(List.map (fun (_, e) -> self#unparseExpr e) rest))
          in
          Simple (label k v)
        else
          let formattedList = List.map self#unparseExpr (List.map snd rest) in
          let lhs = makeList [(self#simple_enough_to_be_lhs_dot_send e1); atom "."] in
          let rhs = makeList ~break:IfNeed ~postSpace:true ~sep:commaSep ~wrap:("{", "}") formattedList in
          let prec = Custom "prec_lbracket" in
          SpecificInfixPrecedence ({reducePrecedence=prec; shiftPrecedence=prec}, LayoutNode (label lhs rhs))
      | _ -> (

          match (self#sugar_set_expr_parts x) with
      (* Returns None if there's attributes - would render as regular function *)
      (* Format as if it were an infix function application with identifier "=" *)
      | Some (simplyFormatedLeftItm, rightExpr) -> (
        let tokenPrec = Token updateToken in
        let rightItm = self#ensureContainingRule ~withPrecedence:tokenPrec ~reducesAfterRight:rightExpr () in
        let leftWithOp = makeList ~postSpace:true [simplyFormatedLeftItm; atom updateToken] in
        let expr = label ~space:true leftWithOp (self#unparseResolvedRule rightItm) in
        SpecificInfixPrecedence ({reducePrecedence=tokenPrec; shiftPrecedence=tokenPrec}, LayoutNode expr)
      )
      | None -> (
        match (printedStringAndFixityExpr e, ls) with
       (* We must take care not to print two subsequent prefix operators without
         spaces between them (`! !` could become `!!` which is totally
         different).  *)
        | (AlmostSimplePrefix prefixStr, [(Nolabel, rightExpr)]) ->
        let forceSpace = match rightExpr.pexp_desc with
          | Pexp_apply (ee, _) ->
            (match printedStringAndFixityExpr ee with | AlmostSimplePrefix _ -> true | _ -> false)
          | _ -> false
        in
        let prec = Token prefixStr in
        let rightItm = self#unparseResolvedRule (
          self#ensureContainingRule ~withPrecedence:prec ~reducesAfterRight:rightExpr ()
        ) in
        SpecificInfixPrecedence
          ({reducePrecedence=prec; shiftPrecedence = prec}, LayoutNode (label ~space:forceSpace (atom prefixStr) rightItm))
        | (UnaryPostfix postfixStr, [(Nolabel, leftExpr)]) ->
          let forceSpace = match leftExpr.pexp_desc with
            | Pexp_apply (ee, _) ->
              (match printedStringAndFixityExpr ee with
               | UnaryPostfix "^" | AlmostSimplePrefix _ -> true
               | _ -> false)
            | _ -> false
          in
          let leftItm = (match leftExpr.pexp_desc with
            | Pexp_apply (e,_) ->
              (match printedStringAndFixityExpr e with
               | Infix printedIdent
                 when requireNoSpaceFor printedIdent ||
                      Reason_heuristics.isPipeFirst e ->
                 self#unparseExpr leftExpr
               | _ -> self#simplifyUnparseExpr leftExpr)
            | Pexp_field _ -> self#unparseExpr leftExpr
            | _ -> self#simplifyUnparseExpr leftExpr
          )
          in
          Simple (label ~space:forceSpace leftItm (atom postfixStr))
        | (Infix printedIdent, [(Nolabel, leftExpr); (Nolabel, rightExpr)]) ->
          let infixToken = Token printedIdent in
          let rightItm = self#ensureContainingRule ~withPrecedence:infixToken ~reducesAfterRight:rightExpr () in
          let leftItm = self#ensureExpression ~reducesOnToken:infixToken leftExpr in
          (* Left exprs of infix tokens which we don't print spaces for (e.g. `##`)
             need to be wrapped in parens in the case of postfix `^`. Otherwise,
             printing will be ambiguous as `^` is also a valid start of an infix
             operator. *)
          let formattedLeftItm = (match leftItm with
            | LayoutNode x -> begin match leftExpr.pexp_desc with
                | Pexp_apply (e,_) ->
                  (match printedStringAndFixityExpr e with
                   | UnaryPostfix "^" when requireNoSpaceFor printedIdent ->
                     LayoutNode (formatPrecedence ~loc:leftExpr.pexp_loc x)
                   | _ -> leftItm)
                | _ -> leftItm
              end
            | InfixTree _ -> leftItm
          ) in
          let infixTree = InfixTree (printedIdent, formattedLeftItm, rightItm) in
          SpecificInfixPrecedence ({reducePrecedence=infixToken; shiftPrecedence=infixToken}, infixTree)
        (* Will be rendered as `(+) a b c` which is parsed with higher precedence than all
           the other forms unparsed here.*)
        | (UnaryPlusPrefix printedIdent, [(Nolabel, rightExpr)]) ->
          let prec = Custom "prec_unary" in
          let rightItm = self#unparseResolvedRule (
            self#ensureContainingRule ~withPrecedence:prec ~reducesAfterRight:rightExpr ()
          ) in
          let expr = label ~space:true (atom printedIdent) rightItm in
          SpecificInfixPrecedence ({reducePrecedence=prec; shiftPrecedence=Token printedIdent}, LayoutNode expr)
        | (UnaryMinusPrefix printedIdent as x, [(Nolabel, rightExpr)])
        | (UnaryNotPrefix printedIdent as x, [(Nolabel, rightExpr)]) ->
          let forceSpace = (match x with
              | UnaryMinusPrefix _ -> true
              | _ -> begin match rightExpr.pexp_desc with
                  | Pexp_apply ({pexp_desc = Pexp_ident {txt = Lident s}}, _) ->
                    isSimplePrefixToken s
                  | _ -> false
                end) in
          let prec = Custom "prec_unary" in
          let rightItm = self#unparseResolvedRule (
            self#ensureContainingRule ~withPrecedence:prec ~reducesAfterRight:rightExpr ()
          ) in
          let expr = label ~space:forceSpace (atom printedIdent) rightItm in
          SpecificInfixPrecedence ({reducePrecedence=prec; shiftPrecedence=Token printedIdent}, LayoutNode expr)
        (* Will need to be rendered in self#expression as (~-) x y z. *)
        | (_, _) ->
        (* This case will happen when there is something like

             Bar.createElement a::1 b::2 [] [@bla] [@JSX]

           At this point the bla will be stripped (because it's a visible
           attribute) but the JSX will still be there.
         *)

        (* this case also happens when we have something like:
         * List.map((a) => a + 1, numbers);
         * We got two "List.map" as Pexp_ident & a list of arguments:
         * [`(a) => a + 1`; `numbers`]
         *
         * Another possible case is:
         * describe("App", () =>
         *   test("math", () =>
         *     Expect.expect(1 + 2) |> toBe(3)));
         *)
        let uncurried = try Hashtbl.find uncurriedTable x.pexp_loc with | Not_found -> false in
        FunctionApplication (
          self#formatFunAppl
            ~uncurried
            ~jsxAttrs
            ~args:ls
            ~applicationExpr:x
            ~funExpr:e
            ()
          )
        )
      )
    )
    | Pexp_field (e, li) ->
        let prec = Token "." in
        let leftItm = self#unparseResolvedRule (
          self#ensureExpression ~reducesOnToken:prec e
        ) in
        let {stdAttrs} = partitionAttributes e.pexp_attributes in
        let formattedLeftItm = if stdAttrs == [] then
            leftItm
          else
            formatPrecedence ~loc:e.pexp_loc leftItm
        in
        let layout = label (makeList [formattedLeftItm; atom "."]) (self#longident_loc li) in
        SpecificInfixPrecedence ({reducePrecedence=prec; shiftPrecedence=prec}, LayoutNode layout)
    | Pexp_construct (li, Some eo) when not (is_simple_construct (view_expr x)) -> (
        match view_expr x with
        (* TODO: Explicit arity *)
        | `normal ->
            let arityIsClear = isArityClear arityAttrs in
            FunctionApplication [self#constructor_expression ~arityIsClear stdAttrs (self#longident_loc li) eo]
        | _ -> assert false
      )
    | Pexp_variant (l, Some eo) ->
        if arityAttrs != [] then
          raise (NotPossible "Should never see embedded attributes on poly variant")
        else
          FunctionApplication [self#constructor_expression ~polyVariant:true ~arityIsClear:true stdAttrs (atom ("`" ^ l)) eo]
    (* TODO: Should protect this identifier *)
    | Pexp_setinstvar (s, rightExpr) ->
      let rightItm = self#unparseResolvedRule (
        self#ensureContainingRule ~withPrecedence:(Token updateToken) ~reducesAfterRight:rightExpr ()
      ) in
      let expr = label ~space:true (makeList ~postSpace:true [(protectIdentifier s.txt); atom updateToken]) rightItm in
      SpecificInfixPrecedence ({reducePrecedence=(Token updateToken); shiftPrecedence=(Token updateToken)}, LayoutNode expr)
    | Pexp_setfield (leftExpr, li, rightExpr) ->
      let rightItm = self#unparseResolvedRule (
        self#ensureContainingRule ~withPrecedence:(Token updateToken) ~reducesAfterRight:rightExpr ()
      ) in
      let leftItm = self#unparseResolvedRule (
        self#ensureExpression ~reducesOnToken:(Token ".") leftExpr
      ) in
      let leftLbl =
        label
          (makeList [leftItm; atom "."])
          (self#longident_loc li) in
      let expr = label ~space:true (makeList ~postSpace:true [leftLbl; atom updateToken]) rightItm in
      SpecificInfixPrecedence ({reducePrecedence=(Token updateToken); shiftPrecedence=(Token updateToken)}, LayoutNode expr)
    | Pexp_match (e, l) when detectTernary l != None -> (
      match detectTernary l with
      | None -> raise (Invalid_argument "Impossible")
      | Some (tt, ff) ->
        let ifTrue = self#reset_request_braces#unparseExpr tt in
        let testItem = self#unparseResolvedRule (
          self#reset_request_braces#ensureExpression e ~reducesOnToken:(Token "?")
        ) in
        let ifFalse = self#unparseResolvedRule (
          self#reset_request_braces#ensureContainingRule ~withPrecedence:(Token ":") ~reducesAfterRight:ff ()
        ) in
        let trueBranch = label ~space:true ~break:`Never (atom "?") ifTrue
        in
        let falseBranch = label ~space:true ~break:`Never (atom ":") ifFalse
        in
        let expr = label ~space:true testItem (makeList ~break:IfNeed ~sep:(Sep " ") ~inline:(true, true) [trueBranch; falseBranch])
        in
        SpecificInfixPrecedence ({reducePrecedence=Token ":"; shiftPrecedence=Token "?"}, LayoutNode expr)
      )
    | _ -> (
      match self#expression_requiring_parens_in_infix x with
      | Some e -> e
      | None -> raise (Invalid_argument "No match for unparsing expression")
    )

  method formatNonSequencyExpression e =
    (*
     * Instead of printing:
     *   let result =  { open Fmt; strf(foo);}
     *
     * We format as:
     *   let result = Fmt.(strf(foo))
     *
     * (Also see https://github.com/facebook/Reason/issues/114)
     *)
    match e.pexp_attributes, e.pexp_desc with
    | [], Pexp_record _ (* syntax sugar for M.{x:1} *)
    | [], Pexp_tuple _ (* syntax sugar for M.(a, b) *)
    | [], Pexp_object {pcstr_fields = []} (* syntax sugar for M.{} *)
    | [], Pexp_construct ( {txt= Lident"::"},Some _)
    | [], Pexp_construct ( {txt= Lident"[]"},_)
    | [], Pexp_extension ( {txt = "bs.obj"}, _ ) ->
      self#simplifyUnparseExpr e (* syntax sugar for M.[x,y] *)
    (* syntax sugar for the rest, wrap with parens to avoid ambiguity.
     * E.g., avoid M.(M2.v) being printed as M.M2.v
     * Or ReasonReact.(<> {string("Test")} </>);
     *)
    | _ -> makeList ~wrap:("(",")") ~break:IfNeed [self#unparseExpr e]

  (*
     It's not enough to only check if precedence of an infix left/right is
     greater than the infix itself. We also should likely pay attention to
     left/right associativity. So how do we render the minimum number of
     parenthesis?

     The intuition is that sequential right associative operators will
     naturally build up deep trees on the right side (left builds up left-deep
     trees). So by default, we add parens to model the tree structure that
     we're rendering except when the parser will *naturally* parse the tree
     structure that the parens assert.

     Sequential identical infix operators:
     ------------------------------------
     So if we see a nested infix operator of precedence Y, as one side of
     another infix operator that has the same precedence (Y), that is S
     associative on the S side of the function application, we don't need to
     wrap in parens. In more detail:

     -Add parens around infix binary function application
       Exception 1: Unless we are a left-assoc operator of precedence X in the left branch of an operator w/ precedence X.
       Exception 2: Unless we are a right-assoc operator of precedence X in the right branch of an operator w/ precedence X.
       Exception 3: Unless we are a _any_-assoc X operator in the _any_ branch of an Y operator where X has greater precedence than Y.

     Note that the exceptions do not specify any special cases for mixing
     left/right associativity. Precedence is what determines necessity of
     parens for operators with non-identical precedences. Associativity
     only determines necessity of parens for identically precedented operators.

     PLUS is left assoc:
     - So this one *shouldn't* expand into two consecutive infix +:


            [Pexp_apply]
              /      \
         first +   [Pexp_apply]
                      /   \
                  second + third


     - This one *should*:

                    [Pexp_apply]
                      /      \
           [  Pexp_apply  ] + third
              /     \
           first +  second



     COLONCOLON is right assoc, so
     - This one *should* expand into two consecutive infix ::  :

            [Pexp_apply]
              /      \
         first ::   [Pexp_apply]
                      /   \
                  second :: third


     - This one *shouldn't*:

                    [Pexp_apply]
                      /      \
           [  Pexp_apply  ] :: third
              /     \
           first ::  second




     Sequential differing infix operators:
     ------------------------------------

     Neither of the following require paren grouping because of rule 3.


            [Pexp_apply]
              /      \
         first  +  [Pexp_apply]
                      /   \
                  second * third


                    [Pexp_apply]
                      /      \
            [Pexp_apply  +  third
              /     \
           first *  second

      The previous has nothing to do with the fact that + and * have the same
      associativity. Exception 3 applies to the following where :: is right assoc
      and + is left. + has higher precedence than ::

      - so parens aren't required to group + when it is in a branch of a
        lower precedence ::

            [Pexp_apply]
              /      \
         first ::   [Pexp_apply]
                      /   \
                  second + third


      - Whereas there is no Exception that applies in this case (Exception 3
        doesn't apply) so parens are required around the :: in this case.

                    [Pexp_apply]
                      /      \
           [  Pexp_apply  ] + third
              /     \
           first ::  second

  *)

  method classExpressionToFormattedApplicationItems = function
    | { pcl_desc = Pcl_apply (ce, l) } ->
      [label (self#simple_class_expr ce) (self#label_x_expression_params l)]
    | x -> [self#class_expr x]


  (**
        How JSX is formatted/wrapped. We want the attributes to wrap independently
        of children.

        <xxx
          attr1=blah
          attr2=foo>
          child
          child
          child
        </x>

      +-------------------------------+
      |  left   right (list of attrs) |
      |   / \   /   \                 |
      |   <tag                        |
      |     attr1=blah                |
      |     attr2=foo                 |
      +-------------------------------+
       |
       |
       |
       |      left       right  list of children with
       |   /       \    /  \     open,close = > </tag>
       |  +---------+
       +--|         |    >
          +---------+

          </tag>           *)
  method formatJSXComponent componentName ?closeComponentName args =
    let rec processArguments arguments processedAttrs children =
      match arguments with
      | (Labelled "children", {pexp_desc = Pexp_construct (_, None)}) :: tail ->
        processArguments tail processedAttrs None
      | (Labelled "children", {pexp_desc = Pexp_construct ({txt = Lident"::"}, Some {pexp_desc = Pexp_tuple components} )}) :: tail ->
        processArguments tail processedAttrs (self#formatChildren components [])
      | (Labelled "children", expr) :: tail ->
          let dotdotdotChild = match expr with
            | {pexp_desc = Pexp_apply (funExpr, args)}
              when printedStringAndFixityExpr funExpr == Normal &&
                   Reason_attributes.without_stylistic_attrs expr.pexp_attributes == [] ->
              begin match (self#formatFunAppl ~prefix:(atom "...") ~wrap:("{", "}") ~jsxAttrs:[] ~args ~funExpr ~applicationExpr:expr ()) with
              | [x] -> x
              | xs -> makeList xs
              end
            | {pexp_desc = Pexp_fun _ } ->
                self#formatPexpFun ~prefix:(atom "...") ~wrap:("{", "}") expr
            | _ ->
              let childLayout = self#dont_preserve_braces#simplifyUnparseExpr ~wrap:("{", "}") expr in
              makeList ~break:Never [atom "..."; childLayout]
          in
          processArguments tail processedAttrs (Some [dotdotdotChild])
      | (Optional lbl, expression) :: tail ->
        let nextAttr =
          match expression.pexp_desc with
          | Pexp_ident ident when isPunnedJsxArg lbl ident ->
              makeList ~break:Layout.Never [atom "?"; atom lbl]
          | _ ->
              label
                (makeList ~break:Layout.Never [atom lbl; atom "=?"])
                (self#dont_preserve_braces#simplifyUnparseExpr ~wrap:("{","}") expression) in
        processArguments tail (nextAttr :: processedAttrs) children

      | (Labelled lbl, expression) :: tail ->
         let nextAttr =
           match expression.pexp_desc with
           | Pexp_ident ident when isPunnedJsxArg lbl ident -> atom lbl
           | _ when isJSXComponent expression  ->
               label (atom (lbl ^ "="))
                     (makeList ~break:IfNeed ~wrap:("{", "}")
                       [self#dont_preserve_braces#simplifyUnparseExpr expression])
           | Pexp_open (_, lid, e)
             when self#isSeriesOfOpensFollowedByNonSequencyExpression expression ->
             label (makeList [atom lbl;
                              atom "=";
                              (label (self#longident_loc lid) (atom "."))])
                   (self#formatNonSequencyExpression e)
           | Pexp_apply ({pexp_desc = Pexp_ident _} as funExpr, args)
                when printedStringAndFixityExpr funExpr == Normal &&
                     Reason_attributes.without_stylistic_attrs expression.pexp_attributes == [] ->
             let lhs = makeList [atom lbl; atom "="] in
             begin match (
               self#formatFunAppl
                ~prefix:lhs
                ~wrap:("{", "}")
                ~jsxAttrs:[]
                ~args
                ~funExpr
                ~applicationExpr:expression
                ())
             with
             | [x] -> x
             | xs -> makeList xs
             end
           | Pexp_apply (eFun, _) ->
             let lhs = makeList [atom lbl; atom "="] in
             let rhs = (match printedStringAndFixityExpr eFun with
                 | Infix str when requireNoSpaceFor str -> self#unparseExpr expression
                 | _ -> self#dont_preserve_braces#simplifyUnparseExpr ~wrap:("{","}") expression)
             in label lhs rhs
           | Pexp_record _
           | Pexp_construct _
           | Pexp_array _
           | Pexp_tuple _
           | Pexp_match _
           | Pexp_extension _
           | Pexp_function _ ->
               label
                (makeList [atom lbl; atom "="])
                (self#dont_preserve_braces#simplifyUnparseExpr ~wrap:("{","}") expression)
           | Pexp_fun _ ->
               let propName = makeList [atom lbl; atom "="] in
               self#formatPexpFun ~wrap:("{", "}") ~prefix:propName expression
           | _ -> makeList [
                    atom lbl;
                    atom "=";
                    self#dont_preserve_braces#simplifyUnparseExpr ~wrap:("{","}") expression
                  ]
         in
         processArguments tail (nextAttr :: processedAttrs) children
      | [] -> (processedAttrs, children)
      | _ :: tail -> processArguments tail processedAttrs children
    in
    let (reversedAttributes, children) = processArguments args [] None in
    match children with
    | None ->
      makeList
        ~break:IfNeed
        ~wrap:("<" ^ componentName, "/>")
        ~pad:(true, true)
        ~inline:(false, false)
        ~postSpace:true
        (List.rev reversedAttributes)
    | Some renderedChildren ->
      let openTagAndAttrs =
        match reversedAttributes with
        | [] -> (atom ("<" ^ componentName ^ ">"))
        | revAttrHd::revAttrTl ->
          let finalAttrList = (List.rev (makeList ~break:Layout.Never [revAttrHd; atom ">"] :: revAttrTl)) in
          let renderedAttrList = (makeList ~inline:(true, true) ~break:IfNeed ~pad:(false, false) ~preSpace:true finalAttrList) in
          label
            ~space:true
            (atom ("<" ^ componentName))
            renderedAttrList
      in
      label
        openTagAndAttrs
        (makeList
          ~wrap:("", "</" ^ (match closeComponentName with None -> componentName | Some close -> close) ^ ">")
          ~inline:(true, false)
          ~break:IfNeed
          ~pad:(true, true)
          ~postSpace:true
          renderedChildren)

  (*
   * Format Pexp_fun expression: (a, b) => a + b;
   * Example: the `onClick` prop with Pexp_fun in
   *  <div
   *    onClick={(event) => {
   *      Js.log(event);
   *      handleChange(event);
   *    }}
   *  />;
   *
   *  The arguments of the callback (Pexp_fun) should be inlined as much as
   *  possible on the same line as `onClick={`.
   *  Also notice the brace-hugging `}}` at the end.
   *
   *  ~prefix -> prefixes the Pexp_fun layout, example `onClick=`
   *  ~wrap -> wraps the `Pexp_fun` in the tuple passed to wrap, e.g. `{` and
   *  `}` for jsx
   *)
  method formatPexpFun ?(prefix=(atom "")) ?(wrap=("","")) expression =
    let (lwrap, rwrap) = wrap in
    let {stdAttrs; uncurried} = partitionAttributes expression.pexp_attributes in
    if uncurried then Hashtbl.add uncurriedTable expression.pexp_loc true;

    let (args, ret) =
      (* omit attributes here, we're formatting them manually *)
      self#curriedPatternsAndReturnVal {expression with pexp_attributes = [] }
    in
    (* Format `onClick={` *)
    let propName = makeList ~wrap:("", lwrap) [prefix] in
    let argsList =
      let args = match args with
      | [argsList] -> argsList
      | args -> makeList args
      in
      match stdAttrs with
      | [] -> args
      | attrs ->
          (* attach attributes to the args of the Pexp_fun: `[@attr] (event)` *)
          let attrList =
            makeList ~inline:(true, true) ~break:IfNeed ~postSpace:true
              (List.map self#attribute attrs)
          in
          let all = [attrList; args] in
          makeList ~break:IfNeed ~inline:(true, true) ~postSpace:true all
    in
    (* Format `onClick={(event)` *)
    let propNameWithArgs = label propName argsList in
    (* Pick constraints: (a, b) :string => ...
     * :string is the constraint here *)
    let (return, optConstr) = match ret.pexp_desc with
      | Pexp_constraint (e, ct) -> (e, Some (self#non_arrowed_core_type ct))
      | _ -> (ret, None)
    in
    let returnExpr = match (self#letList return) with
    | [x] ->
      (* Format `handleChange(event)}` or
       *  handleChange(event)
       * }
       *
       * If the closing rwrap is empty, we need it to be inline, otherwise
       * we get a empty newline when the layout breaks:
       * ```
       *  handleChange(event)
       *
       * ```
       * (Notice to nonsense newline)
       *)
       let inlineClosing = rwrap = "" in
       makeList ~break:IfNeed ~inline:(true, inlineClosing) ~wrap:("", rwrap) [x]
    | xs ->
      (* Format `Js.log(event)` and `handleChange(event)` as
       * {
       *   Js.log(event);
       *   handleChange(event);
       * }}
       *)
        makeList
          ~break:Always_rec ~sep:(SepFinal (";", ";")) ~wrap:("{", "}" ^ rwrap)
          xs
    in
    match optConstr with
    | Some typeConstraint ->
      let upToConstraint =
        label ~space:true
          (makeList ~wrap:("", ":") [propNameWithArgs])
          typeConstraint
      in
      label ~space:true
        (makeList ~wrap:("", " =>") [upToConstraint])
        returnExpr
    | None ->
      label ~space:true
        (makeList ~wrap:("", " =>") [propNameWithArgs])
        returnExpr

  (* Creates a list of simple module expressions corresponding to module
     expression or functor application. *)
  method moduleExpressionToFormattedApplicationItems ?(prefix="") x =
    match x with
    (* are we formatting a functor application with a module structure as arg?
     * YourLib.Make({
     *   type t = int;
     *   type s = string;
     * });
     *
     * We should "hug" the parens here: ({ & }) should stick together.
     *)
    | { pmod_desc = Pmod_apply (
            ({pmod_desc = Pmod_ident _} as m1),
            ({pmod_desc = Pmod_structure _} as m2)
         )
      } ->
        let modIdent = source_map ~loc:m1.pmod_loc (self#simple_module_expr m1) in
        let name = if prefix <> "" then
          makeList ~postSpace:true[atom prefix; modIdent]
          else modIdent
        in
        let arg = source_map ~loc:m2.pmod_loc (self#simple_module_expr ~hug:true m2) in
        label name arg
    | _ ->
      let rec extract_apps args = function
        | { pmod_desc = Pmod_apply (me1, me2) } ->
          let arg = source_map ~loc:me2.pmod_loc (self#simple_module_expr me2) in
          extract_apps (arg :: args) me1
        | me ->
          let head = source_map ~loc:me.pmod_loc (self#module_expr me) in
          if args == [] then head else label head (makeTup args)
      in
      let functor_application = extract_apps [] x in
      if prefix <> "" then
        makeList ~postSpace:true [atom prefix; functor_application]
      else
        functor_application

  (*

     Watch out, if you see something like below (sixteenTuple getting put on a
     newline), yet a paren-wrapped list wouldn't have had an extra newlin, you
     might need to wrap the single token (sixteenTuple) in [ensureSingleTokenSticksToLabel].
     let (
        axx,
        oxx,
        pxx
      ):
        sixteenTuple = echoTuple (
        0,
        0,
        0
      );
  *)

  method formatSimplePatternBinding labelOpener layoutPattern typeConstraint appTerms =
    let letPattern = label ~break:`Never ~space:true (atom labelOpener) layoutPattern in
    let upUntilEqual =
      match typeConstraint with
        | None -> letPattern
        | Some tc -> formatTypeConstraint letPattern tc
    in
    let includingEqual = makeList ~postSpace:true [upUntilEqual; atom "="] in
    formatAttachmentApplication applicationFinalWrapping (Some (true, includingEqual)) appTerms

  (*
     The [bindingLabel] is either the function name (if let binding) or first
     arg (if lambda).

     For defining layout of the following form:

         lbl one
             two
             constraint => {
           ...
         }

     If using "=" as the arrow, can also be used for:

         met private
             myMethod
             constraint = fun ...

   *)
  method wrapCurriedFunctionBinding
         ?attachTo
         ~arrow
         ?(sweet=false)
         ?(spaceBeforeArrow=true)
         prefixText
         bindingLabel
         patternList
         returnedAppTerms =
    let allPatterns = bindingLabel::patternList in
    let partitioning = curriedFunctionFinalWrapping allPatterns in
    let everythingButReturnVal =
      (*
         Because align_closing is set to false, you get:

         (Brackets[] inserted to show boundaries between open/close of pattern list)
         let[firstThing
             secondThing
             thirdThing]

         It only wraps to indent four by coincidence: If the "opening" token was
         longer, you'd get:

         letReallyLong[firstThing
                       secondThing
                       thirdThing]

         For curried let bindings, we stick the arrow in the *last* pattern:
         let[firstThing
             secondThing
             thirdThing =>]

         But it could have just as easily been the "closing" token corresponding to
         "let". This works because we have [align_closing = false]. The benefit of
         shoving it in the last pattern, is that we can turn [align_closing = true]
         and still have the arrow stuck to the last pattern (which is usually what we
         want) (See modeTwo below).
      *)
      match partitioning with
        | None when sweet ->
          makeList
            ~pad:(false, spaceBeforeArrow)
            ~wrap:("", arrow)
            ~indent:(settings.space * settings.indentWrappedPatternArgs)
            ~postSpace:true
            ~inline:(true, true)
            ~break:IfNeed
            allPatterns
        | None ->
            (* We want the binding label to break *with* the arguments. Again,
               there's no apparent way to add additional indenting for the
               args with this setting. *)

            (*
               Formats lambdas by treating the first pattern as the
               "bindingLabel" which is kind of strange in some cases (when
               you only have one arg that wraps)...

                  echoTheEchoer (
                    fun (
                          a,
                          p
                        ) => (
                      a,
                      b
                    )

               But it makes sense in others (where you have multiple args):

                  echoTheEchoer (
                    fun (
                          a,
                          p
                        )
                        mySecondArg
                        myThirdArg => (
                      a,
                      b
                    )

               Try any other convention for wrapping that first arg and it
               won't look as balanced when adding multiple args.

            *)
          makeList
            ~pad:(true, spaceBeforeArrow)
            ~wrap:(prefixText, arrow)
            ~indent:(settings.space * settings.indentWrappedPatternArgs)
            ~postSpace:true
            ~inline:(true, true)
            ~break:IfNeed
            allPatterns
        | Some (attachedList, wrappedListy) ->
            (* To get *only* the final argument to "break", while not
               necessarily breaking the prior arguments, we dock everything
               but the last item to a created label *)
          label
            ~space:true
            (
              makeList
                ~pad:(true, spaceBeforeArrow)
                ~wrap:(prefixText, arrow)
                ~indent:(settings.space * settings.indentWrappedPatternArgs)
                ~postSpace:true
                ~inline:(true, true)
                ~break:IfNeed
                attachedList
            )
            wrappedListy
    in

    let everythingButAppTerms = match attachTo with
      | None -> everythingButReturnVal
      | Some toThis -> label ~space:true toThis everythingButReturnVal
    in
    formatAttachmentApplication
      applicationFinalWrapping
      (Some (true, everythingButAppTerms))
      returnedAppTerms

  method leadingCurriedAbstractTypes x =
    let rec argsAndReturn xx =
      match xx.pexp_desc with
        | Pexp_newtype (str,e) ->
            let (nextArgs, return) = argsAndReturn e in
            (str::nextArgs, return)
        | _ -> ([], xx.pexp_desc)
    in argsAndReturn x

  method curriedConstructorPatternsAndReturnVal cl =
    let rec argsAndReturn args = function
      | { pcl_desc = Pcl_fun (label, eo, p, e); pcl_attributes = [] } ->
        let arg = source_map ~loc:p.ppat_loc (self#label_exp label eo p) in
        argsAndReturn (arg :: args) e
      | xx ->
        if args == [] then (None, xx) else (Some (makeTup (List.rev args)), xx)
    in
    argsAndReturn [] cl



  (*
    Returns the arguments list (if any, that occur before the =>), and the
    final expression (that is either returned from the function (after =>) or
    that is bound to the value (if there are no arguments, and this is just a
    let pattern binding)).
  *)
  method curriedPatternsAndReturnVal x =
    let uncurried = try Hashtbl.find uncurriedTable x.pexp_loc with | Not_found -> false in
    let rec extract_args xx =
      let {stdAttrs} = partitionAttributes ~allowUncurry:false xx.pexp_attributes in
      if stdAttrs != [] then
        ([], xx)
      else match xx.pexp_desc with
        (* label * expression option * pattern * expression *)
        | Pexp_fun (l, eo, p, e) ->
          let args, ret = extract_args e in
          (`Value (l,eo,p) :: args, ret)
        | Pexp_newtype (newtype,e) ->
          let args, ret = extract_args e in
          (`Type newtype :: args, ret)
        | Pexp_constraint _ -> ([], xx)
        | _ -> ([], xx)
    in
    let prepare_arg = function
      | `Value (l,eo,p) -> source_map ~loc:p.ppat_loc (self#label_exp l eo p)
      | `Type nt -> atom ("type " ^ nt)
    in
    let single_argument_no_parens p ret =
      if uncurried then false
      else
        let isUnitPat = is_unit_pattern p in
        let isAnyPat = is_any_pattern p in
        begin match ret.pexp_desc with
        (* (event) :ReasonReact.event => {...}
         * The above Pexp_fun with constraint ReasonReact.event requires parens
         * surrounding the single argument `event`.*)
        | Pexp_constraint _ when not isUnitPat && not isAnyPat -> false
        | _ -> isUnitPat || isAnyPat || is_ident_pattern p
      end
    in
    match extract_args x with
    | ([], ret) -> ([], ret)
    | ([`Value (Nolabel, None, p) ], ret) when is_unit_pattern p && uncurried ->
        ( [atom "(.)"], ret)
    | ([`Value (Nolabel, None, p) as arg], ret) when single_argument_no_parens p ret ->
      ([prepare_arg arg], ret)
    | (args, ret) ->
        ([makeTup ~uncurried (List.map prepare_arg args)], ret)

  (* Returns the (curriedModule, returnStructure) for a functor *)
  method curriedFunctorPatternsAndReturnStruct = function
    (* string loc * module_type option * module_expr *)
    | { pmod_desc = Pmod_functor(s, mt, me2) } ->
        let firstOne =
          match mt with
            | None -> atom "()"
            | Some mt' -> self#module_type (makeList [atom s.txt; atom ":"]) mt'
        in
        let (functorArgsRecurse, returnStructure) = (self#curriedFunctorPatternsAndReturnStruct me2) in
        (firstOne::functorArgsRecurse, returnStructure)
    | me -> ([], me)

  method isRenderableAsPolymorphicAbstractTypes
         typeVars
         polyType
         leadingAbstractVars
         nonVarifiedType =
      same_ast_modulo_varification_and_extensions polyType nonVarifiedType &&
      for_all2' string_equal typeVars leadingAbstractVars

  (* Reinterpret this as a pattern constraint since we don't currently have a
     way to disambiguate. There is currently a way to disambiguate a parsing
     from Ppat_constraint vs.  Pexp_constraint. Currently (and consistent with
     OCaml standard parser):

       let (x: typ) = blah;
         Becomes Ppat_constraint
       let x:poly . type = blah;
         Becomes Ppat_constraint
       let x:typ = blah;
         Becomes Pexp_constraint(ghost)
       let x = (blah:typ);
         Becomes Pexp_constraint(ghost)

     How are double constraints represented?
     let (x:typ) = (blah:typ);
     If currently both constraints are parsed into a single Pexp_constraint,
     then something must be lost, and how could you fail type checking on:
     let x:int = (10:string) ?? Answer: It probably parses into a nested
     Pexp_constraint.

     Proposal:

       let (x: typ) = blah;
         Becomes Ppat_constraint   (still)
       let x:poly . type = blah;
         Becomes Ppat_constraint   (still)
       let x:typ = blah;
         Becomes Ppat_constraint
       let x = blah:typ;
         Becomes Pexp_constraint


     Reasoning: Allows parsing of any of the currently valid ML forms, but
     combines the two most similar into one form. The only lossyness is the
     unnecessary parens, which there is already precedence for dropping in
     expressions. In the existing approach, preserving a paren-constrained
     expression is *impossible* because it becomes pretty printed as
     let x:t =.... In the proposal, it is not impossible - it is only
     impossible to preserve unnecessary parenthesis around the let binding.

     The one downside is that integrating with existing code that uses [let x =
     (blah:typ)] in standard OCaml will be parsed as a Pexp_constraint. There
     might be some lossiness (beyond parens) that occurs in the original OCaml
     parser.
  *)

  method locallyAbstractPolymorphicFunctionBinding prefixText layoutPattern funWithNewTypes absVars bodyType =
    let appTerms = self#unparseExprApplicationItems funWithNewTypes in
    let locallyAbstractTypes = (List.map atom absVars) in
    let typeLayout =
      source_map ~loc:bodyType.ptyp_loc (self#core_type bodyType)
    in
    let polyType =
      label
        ~space:true
        (* TODO: This isn't a correct use of sep! It ruins how
         * comments are interleaved. *)
        (makeList [makeList ~sep:(Sep " ") (atom "type"::locallyAbstractTypes); atom "."])
        typeLayout
      in
    self#formatSimplePatternBinding
      prefixText
      layoutPattern
      (Some polyType)
      appTerms

  (**
      Intelligently switches between:
      Curried function binding w/ constraint on return expr:
         lbl patt
             pattAux
             arg
             :constraint => {
           ...
         }

      Constrained:
         lbl patt
             pattAux...
             :constraint = {
           ...
         }
   *)
  method wrappedBinding prefixText ~arrow pattern patternAux expr =
    let expr = self#process_underscore_application expr in
    let (argsList, return) = self#curriedPatternsAndReturnVal expr in
    let patternList = match patternAux with
      | [] -> pattern
      | _::_ -> makeList ~postSpace:true ~inline:(true, true) ~break:IfNeed (pattern::patternAux)
    in
    match (argsList, return.pexp_desc) with
      | ([], Pexp_constraint (e, ct)) ->
          let typeLayout =
            source_map ~loc:ct.ptyp_loc
              begin match ct.ptyp_desc with
              | Ptyp_package (li, cstrs) ->
                self#typ_package li cstrs
              | _ ->
                self#core_type ct
              end
          in
          let appTerms = self#unparseExprApplicationItems e in
          self#formatSimplePatternBinding prefixText patternList (Some typeLayout) appTerms
      | ([], _) ->
          (* simple let binding, e.g. `let number = 5` *)
          (* let f = (. a, b) => a + b; *)
          let appTerms = self#unparseExprApplicationItems expr in
          self#formatSimplePatternBinding prefixText patternList None appTerms
      | (_::_, _) ->
          let (argsWithConstraint, actualReturn) = self#normalizeFunctionArgsConstraint argsList return in
          let fauxArgs =
            List.concat [patternAux; argsWithConstraint] in
          let returnedAppTerms = self#unparseExprApplicationItems actualReturn in
           (* Attaches the `=` to `f` to recreate javascript function syntax in
            * let f = (a, b) => a + b; *)
          let lbl = makeList ~sep:(Sep " ") ~break:Layout.Never [pattern; atom "="] in
          self#wrapCurriedFunctionBinding prefixText ~arrow lbl fauxArgs returnedAppTerms

  (* Similar to the above method. *)
  method wrappedClassBinding prefixText pattern patternAux expr =
    let (args, return) = self#curriedConstructorPatternsAndReturnVal expr in
    let patternList =
      match patternAux with
        | [] -> pattern
        | _::_ -> makeList ~postSpace:true ~inline:(true, true) ~break:IfNeed (pattern::patternAux)
    in
    match (args, return.pcl_desc) with
      | (None, Pcl_constraint (e, ct)) ->
          let typeLayout = source_map ~loc:ct.pcty_loc (self#class_constructor_type ct) in
          self#formatSimplePatternBinding prefixText patternList (Some typeLayout)
            (self#classExpressionToFormattedApplicationItems e, None)
      | (None, _) ->
          self#formatSimplePatternBinding prefixText patternList None
            (self#classExpressionToFormattedApplicationItems expr, None)
      | (Some args, _) ->
          let (argsWithConstraint, actualReturn) =
            self#normalizeConstructorArgsConstraint [args] return in
          let fauxArgs =
            List.concat [patternAux; argsWithConstraint] in
          self#wrapCurriedFunctionBinding prefixText ~arrow:"=" pattern fauxArgs
            (self#classExpressionToFormattedApplicationItems actualReturn, None)

  (* Attaches doc comments to a layout, with whitespace preserved
   * Example:
   * /** Doc comment */
   *
   * /* another random comment */
   * let a = 1;
   *)
  method attachDocAttrsToLayout
    (* all std attributes attached on the ast node backing the layout *)
    ~stdAttrs:(stdAttrs : Ast_404.Parsetree.attributes)
    (* all doc comments attached on the ast node backing the layout *)
    ~docAttrs:(docAttrs : Ast_404.Parsetree.attributes)
    (* location of the layout *)
    ~loc
    (* layout to attach the doc comments to *)
    ~layout () =
    (*
     * compute the correct location of layout
     * Example:
     * 1| /** doc-comment */
     * 2|
     * 3| [@attribute]
     * 4| let a = 1;
     *
     * The location might indicate a start of line 4 for the ast-node
     * representing `let a = 1`. The reality is that `[@attribute]` should be
     * included (start of line 3), to represent the correct start location
     * of the whole layout.
     *)
    let loc = match stdAttrs with
    | (astLoc, _)::_ -> astLoc.loc
    | [] -> loc
    in
    let rec aux prevLoc layout = function
      | ((x, _) as attr : Ast_404.Parsetree.attribute)::xs ->
        let newLayout =
          let range = Range.makeRangeBetween x.loc prevLoc in
          let layout =
            if Range.containsWhitespace ~range ~comments:self#comments () then
              let region = WhitespaceRegion.make ~range ~newlines:1 () in
              Layout.Whitespace(region, layout)
            else layout
          in
          makeList ~inline:(true, true) ~break:Always [
            self#attribute attr;
            layout
          ]
        in aux x.loc newLayout xs
      | [] -> layout
    in
    aux loc layout (List.rev docAttrs)

  method binding prefixText x = (* TODO: print attributes *)
    let body = match x.pvb_pat.ppat_desc with
      | (Ppat_var _) ->
        self#wrappedBinding prefixText ~arrow:"=>"
          (source_map ~loc:x.pvb_pat.ppat_loc (self#simple_pattern x.pvb_pat))
          [] x.pvb_expr
      (*
         Ppat_constraint is used in bindings of the form

            let (inParenVar:typ) = ...

         And in the case of let bindings for explicitly polymorphic type
         annotations (see parser for more details).

         See reason_parser.mly for explanation of how we encode the two primary
         forms of explicit polymorphic annotations in the parse tree, and how
         we must recover them here.
       *)
      | (Ppat_constraint(p, ty)) -> (
          (* Locally abstract forall types are *seriously* mangled by the parsing
             stage, and we have to be very smart about how to recover it.

              let df_locallyAbstractFuncAnnotated:
                type a b.
                  a =>
                  b =>
                  (inputEchoRecord a, inputEchoRecord b) =
                fun (input: a) (input2: b) => (
                  {inputIs: input},
                  {inputIs: input2}
                );

             becomes:

               let df_locallyAbstractFuncAnnotatedTwo:
                 'a 'b .
                 'a => 'b => (inputEchoRecord 'a, inputEchoRecord 'b)
                =
                 fun (type a) (type b) => (
                   fun (input: a) (input2: b) => ({inputIs: input}, {inputIs:input2}):
                     a => b => (inputEchoRecord a, inputEchoRecord b)
                 );
          *)
          let layoutPattern =
            source_map ~loc:x.pvb_pat.ppat_loc (self#simple_pattern p)
          in
          let leadingAbsTypesAndExpr = self#leadingCurriedAbstractTypes x.pvb_expr in
          match (p.ppat_desc, ty.ptyp_desc, leadingAbsTypesAndExpr) with
            | (Ppat_var _,
               Ptyp_poly (typeVars, varifiedPolyType),
               (_::_ as absVars, Pexp_constraint(funWithNewTypes, nonVarifiedExprType)))
              when self#isRenderableAsPolymorphicAbstractTypes
                  typeVars
                  (* If even artificially varified - don't know until returns*)
                  varifiedPolyType
                  absVars
                  nonVarifiedExprType ->
              (*
                 We assume was the case whenever we see this pattern in the
                 AST, it was because the parser parsed the polymorphic locally
                 abstract type sugar.

                 Ppat_var..Ptyp_poly...Pexp_constraint:

                    let x: 'a 'b . 'a => 'b => 'b =
                      fun (type a) (type b) =>
                         (fun aVal bVal => bVal : a => b => b);

                 We need to be careful not to accidentally detect similar
                 forms, that cannot be printed as sugar.

                    let x: 'a 'b . 'a => 'b => 'b =
                      fun (type a) (type b) =>
                         (fun aVal bVal => bVal : int => int => int);

                 Should *NOT* be formatted as:

                    let x: type a b. int => int => int = fun aVal bVal => bVal;

                 The helper function
                 [same_ast_modulo_varification_and_extensions] was created to
                 help compare the varified constraint pattern body, and the
                 non-varified expression constraint type.

                 The second requirement that we check before assuming that the
                 sugar form is correct, is to make sure the list of type vars
                 corresponds to a leading prefix of the Pexp_newtype variables.
              *)
              self#locallyAbstractPolymorphicFunctionBinding
                prefixText
                layoutPattern
                funWithNewTypes
                absVars
                nonVarifiedExprType
            | _ ->
              let typeLayout = source_map ~loc:ty.ptyp_loc (self#core_type ty) in
              let appTerms = self#unparseExprApplicationItems x.pvb_expr in
              self#formatSimplePatternBinding
                prefixText
                layoutPattern
                (Some typeLayout)
                appTerms
        )
      | _ ->
        let layoutPattern =
          source_map ~loc:x.pvb_pat.ppat_loc (self#pattern x.pvb_pat)
        in
        let appTerms = self#unparseExprApplicationItems x.pvb_expr in
        self#formatSimplePatternBinding prefixText layoutPattern None appTerms
    in
    let {stdAttrs; docAttrs} = partitionAttributes ~partDoc:true x.pvb_attributes in

    let body = makeList ~inline:(true, true) [body] in
    let layout = self#attach_std_item_attrs stdAttrs (source_map ~loc:x.pvb_loc body) in
    self#attachDocAttrsToLayout
      ~stdAttrs
      ~docAttrs
      ~loc:x.pvb_pat.ppat_loc
      ~layout
      ()

  (* Ensures that the constraint is formatted properly for sake of function
     binding (formatted without arrows)
     let x y z : no_unguarded_arrows_allowed_here => ret;
   *)
  method normalizeFunctionArgsConstraint argsList return =
    match return.pexp_desc with
      | Pexp_constraint (e, ct) ->
        let typeLayout =
          source_map ~loc:ct.ptyp_loc
            (self#non_arrowed_non_simple_core_type ct)
        in
        ([makeList
           ~break:IfNeed
           ~inline:(true, true)
           (argsList@[formatJustTheTypeConstraint typeLayout])], e)
      | _ -> (argsList, return)

  method normalizeConstructorArgsConstraint argsList return =
    match return.pcl_desc with
      | Pcl_constraint (e, ct) when return.pcl_attributes == [] ->
        let typeLayout =
          source_map ~loc:ct.pcty_loc
            (self#non_arrowed_class_constructor_type ct)
        in
        (argsList@[formatJustTheTypeConstraint typeLayout], e)
      | _ -> (argsList, return)

  method bindingsLocationRange ?extension l =
    let len = List.length l in
    let fstLoc = match extension with
    | Some ({pexp_loc = {loc_ghost = false}} as ext) -> ext.pexp_loc
    | _ -> (List.nth l 0).pvb_loc
    in
    let lstLoc = (List.nth l (len - 1)).pvb_loc in
    {
      loc_start = fstLoc.loc_start;
      loc_end = lstLoc.loc_end;
      loc_ghost = false
    }

  method bindings ?extension (rf, l) =
    let label = add_extension_sugar "let" extension in
    let label = match rf with
      | Nonrecursive -> label
      | Recursive -> label ^ " rec"
    in
    match l with
    | [x] -> self#binding label x
    | l ->
      let items = List.mapi (fun i x ->
        let loc = extractLocValBinding x in
        let layout = self#binding (if i == 0 then label else "and") x in
        (loc, layout)
      ) l
      in
      let itemsLayout = groupAndPrint
        ~xf:(fun (_, layout) -> layout)
        ~getLoc:(fun (loc, _) -> loc)
        ~comments:self#comments
        items
      in
      makeList
        ~postSpace:true
        ~break:Always
        ~indent:0
        ~inline:(true, true)
        itemsLayout

  method letList expr =
    (* Recursively transform a nested ast of "let-items", into a flat
     * list containing the location indicating start/end of the "let-item" and
     * its layout. *)
    let rec processLetList acc expr =
      let {stdAttrs; arityAttrs; jsxAttrs} = partitionAttributes ~allowUncurry:false expr.pexp_attributes in
      match (stdAttrs, expr.pexp_desc) with
        | ([], Pexp_let (rf, l, e)) ->
          (* For "letList" bindings, the start/end isn't as simple as with
           * module value bindings. For "let lists", the sequences were formed
           * within braces {}. The parser relocates the first let binding to the
           * first brace. *)
           let bindingsLayout = self#bindings (rf, l) in
           let bindingsLoc = self#bindingsLocationRange l in
           let layout = source_map ~loc:bindingsLoc bindingsLayout in
           processLetList ((bindingsLoc, layout)::acc) e
        | (attrs, Pexp_open (ovf, lid, e))
            (* Add this when check to make sure these are handled as regular "simple expressions" *)
            when not (self#isSeriesOfOpensFollowedByNonSequencyExpression {expr with pexp_attributes = []}) ->
          let overrideStr = match ovf with | Override -> "!" | Fresh -> "" in
          let openLayout = label ~space:true
            (atom ("open" ^ overrideStr))
            (self#longident_loc lid)
          in
          let attrsOnOpen =
            makeList ~inline:(true, true) ~postSpace:true ~break:Always
            ((self#attributes attrs)@[openLayout])
          in
          (* Just like the bindings, have to synthesize a location since the
           * Pexp location is parsed (potentially) beginning with the open
           * brace {} in the let sequence. *)
          let layout = source_map ~loc:lid.loc attrsOnOpen in
          let loc = {
            lid.loc with
            loc_start = {
              lid.loc.loc_start with
              pos_lnum = expr.pexp_loc.loc_start.pos_lnum
            }
          } in
          processLetList ((loc, layout)::acc) e
        | ([], Pexp_letmodule (s, me, e)) ->
            let prefixText = "module" in
            let bindingName = atom ~loc:s.loc s.txt in
            let moduleExpr = me in
            let letModuleLayout =
              (self#let_module_binding prefixText bindingName moduleExpr) in
            let letModuleLoc = {
              loc_start = s.loc.loc_start;
              loc_end = me.pmod_loc.loc_end;
              loc_ghost = false
            } in
            (* Just like the bindings, have to synthesize a location since the
             * Pexp location is parsed (potentially) beginning with the open
             * brace {} in the let sequence. *)
          let layout = source_map ~loc:letModuleLoc letModuleLayout in
        let (_, return) = self#curriedFunctorPatternsAndReturnStruct moduleExpr in
          let loc = {
            letModuleLoc with
            loc_end = return.pmod_loc.loc_end
          } in
           processLetList ((loc, layout)::acc) e
        | ([], Pexp_letexception (extensionConstructor, expr)) ->
            let exc = self#exception_declaration extensionConstructor in
            let layout = source_map ~loc:extensionConstructor.pext_loc exc in
            processLetList ((extensionConstructor.pext_loc, layout)::acc) expr
        | ([], Pexp_sequence (({pexp_desc=Pexp_sequence _ }) as e1, e2))
        | ([], Pexp_sequence (({pexp_desc=Pexp_let _      }) as e1, e2))
        | ([], Pexp_sequence (({pexp_desc=Pexp_open _     }) as e1, e2))
        | ([], Pexp_sequence (({pexp_desc=Pexp_letmodule _}) as e1, e2))
        | ([], Pexp_sequence (e1, e2)) ->
            let e1Layout = match expression_not_immediate_extension_sugar e1 with
              | Some (extension, e) ->
                    self#attach_std_item_attrs ~extension []
                      (self#unparseExpr e)
              | None ->
                  self#unparseExpr e1
            in
            let loc = e1.pexp_loc in
            let layout = source_map ~loc e1Layout in
            processLetList ((loc, layout)::acc) e2
        | _ ->
          let expr = { expr with pexp_attributes = (arityAttrs @ stdAttrs @ jsxAttrs) }
          in
          match expression_not_immediate_extension_sugar expr with
          | Some (extension, {pexp_attributes = []; pexp_desc = Pexp_let (rf, l, e)}) ->
            let bindingsLayout = self#bindings ~extension (rf, l) in
            let bindingsLoc = self#bindingsLocationRange ~extension:expr l in
            let layout = source_map ~loc:bindingsLoc bindingsLayout in
            processLetList ((extractLocationFromValBindList expr l, layout)::acc) e
          | Some (extension, e) ->
            let layout = self#attach_std_item_attrs ~extension [] (self#unparseExpr e) in
            (expr.pexp_loc, layout)::acc
          | None ->
            (* Should really do something to prevent infinite loops here. Never
               allowing a top level call into letList to recurse back to
               self#unparseExpr- top level calls into letList *must* be one of the
               special forms above whereas lower level recursive calls may be of
               any form. *)
            let layout = source_map ~loc:expr.pexp_loc (self#unparseExpr expr) in
            (expr.pexp_loc, layout)::acc
    in
    let es = processLetList [] expr in
    (* Interleave whitespace between the "let-items" when appropriate *)
    groupAndPrint
      ~xf:(fun (_, layout) -> layout)
      ~getLoc:(fun (loc, _) -> loc)
      ~comments:self#comments
      (List.rev es)

  method constructor_expression ?(polyVariant=false) ~arityIsClear stdAttrs ctor eo =
    let (implicit_arity, arguments) =
      match eo.pexp_desc with
      | Pexp_construct ( {txt= Lident "()"},_) ->
        (* `foo() is a polymorphic variant that contains a single unit construct as expression
         * This requires special formatting: `foo(()) -> `foo() *)
        (false, atom "()")
      (* special printing: MyConstructor(()) -> MyConstructor() *)
      | Pexp_tuple l when is_single_unit_construct l ->
          (false, atom "()")
      | Pexp_tuple l when polyVariant == true ->
          (false, self#unparseSequence ~wrap:("(", ")") ~construct:`Tuple l)
      | Pexp_tuple l ->
        (* There is no ambiguity when the number of tuple components is 1.
             We don't need put implicit_arity in that case *)
        (match l with
        | exprList when isSingleArgParenApplication exprList ->
            (false, self#singleArgParenApplication exprList)
        | _ ->
            (not arityIsClear, makeTup (List.map self#unparseProtectedExpr l)))
      | _ when isSingleArgParenApplication [eo] ->
          (false, self#singleArgParenApplication [eo])
      | _ ->
          (false, makeTup [self#unparseProtectedExpr eo])
    in
    let arguments = source_map ~loc:eo.pexp_loc arguments in
    let construction =
      label ctor (if isSequencey arguments
                  then arguments
                  else (ensureSingleTokenSticksToLabel arguments))
    in
    let attrs =
      if implicit_arity && (not polyVariant) then
        ({txt="implicit_arity"; loc=eo.pexp_loc}, PStr []) :: stdAttrs
      else
        stdAttrs
    in
    match attrs with
      | [] -> construction
      | _::_ -> formatAttributed construction (self#attributes attrs)

  (* TODOATTRIBUTES: Handle stdAttrs here (merge with implicit_arity) *)
  method constructor_pattern ?(polyVariant=false) ~arityIsClear ctor po =
    let (implicit_arity, arguments) =
      match po.ppat_desc with
      (* There is no ambiguity when the number of tuple components is 1.
           We don't need put implicit_arity in that case *)
      | Ppat_tuple (([] | _::[]) as l) ->
        (false, l)
      | Ppat_tuple l ->
        (not arityIsClear, l)

      | _ -> (false, [po])
    in
    let space, arguments = match arguments with
      | [x] when is_direct_pattern x -> (true, self#simple_pattern x)
      | xs when isSingleArgParenPattern xs -> (false, self#singleArgParenPattern xs)
      (* Optimize the case when it's a variant holding a shot variable - avoid trailing*)
      | [{ppat_desc=Ppat_constant (Pconst_string (s, None))} as x]
      | [{ppat_desc=Ppat_construct (({txt=Lident s}), None)} as x]
      | [{ppat_desc=Ppat_var ({txt = s})} as x]
        when Reason_heuristics.singleTokenPatternOmmitTrail s ->
        let layout = makeTup ~trailComma:false [self#pattern x] in
        (false, source_map ~loc:po.ppat_loc layout)
      | [{ppat_desc=Ppat_any} as x]
      | [{ppat_desc=Ppat_constant (Pconst_char _)} as x]
      | [{ppat_desc=Ppat_constant (Pconst_integer _)} as x] ->
        let layout = makeTup ~trailComma:false [self#pattern x] in
        (false, source_map ~loc:po.ppat_loc layout)
      | xs ->
        let layout = makeTup (List.map self#pattern xs) in
        (false, source_map ~loc:po.ppat_loc layout)
    in
    let construction = label ~space ctor arguments in
    if implicit_arity && (not polyVariant) then
      formatAttributed construction
        (self#attributes [({txt="implicit_arity"; loc=po.ppat_loc}, PStr [])])
    else
      construction

  (*
   * Provides special printing for constructor arguments:
   * iff there's one argument & they have some kind of wrapping,
   * they're wrapping need to 'hug' the surrounding parens.
   * Example:
   *  switch x {
   *  | Some({
   *      a,
   *      b,
   *    }) => ()
   *  }
   *
   *  Notice how ({ and }) hug.
   *  This applies for records, arrays, tuples & lists.
   *  Also see `isSingleArgParenPattern` to determine if this kind of wrapping applies.
   *)
  method singleArgParenPattern = function
    | [{ppat_desc = Ppat_record (l, closed); ppat_loc = loc}] ->
      source_map ~loc (self#patternRecord ~wrap:("(", ")") l closed)
    | [{ppat_desc = Ppat_array l; ppat_loc = loc}] ->
      source_map ~loc (self#patternArray ~wrap:("(", ")") l)
    | [{ppat_desc = Ppat_tuple l; ppat_loc = loc}] ->
      source_map ~loc (self#patternTuple ~wrap:("(", ")") l)
    | [{ppat_desc = Ppat_construct (({txt=Lident "::"}), _); ppat_loc} as listPattern]  ->
      source_map ~loc:ppat_loc (self#patternList ~wrap:("(", ")")  listPattern)
    | _ -> assert false

  method patternArray ?(wrap=("","")) l =
    let (left, right) = wrap in
    let wrap = (left ^ "[|", "|]" ^ right) in
    makeList ~wrap ~break:IfNeed ~postSpace:true ~sep:commaTrail (List.map self#pattern l)

  method patternTuple ?(wrap=("","")) l =
    let (left, right) = wrap in
    let wrap = (left ^ "(", ")" ^ right) in
    makeList ~wrap ~sep:commaTrail ~postSpace:true ~break:IfNeed (List.map self#constrained_pattern l)

  method patternRecord ?(wrap=("","")) l closed =
    let longident_x_pattern (li, p) =
      match (li, p.ppat_desc) with
        | ({txt = ident}, Ppat_var {txt}) when Longident.last ident = txt ->
          (* record field punning when destructuring. {x: x, y: y} becomes {x, y} *)
          (* works with module prefix too: {MyModule.x: x, y: y} becomes {MyModule.x, y} *)
            self#longident_loc li
        | ({txt = ident},
           Ppat_alias ({ppat_desc = (Ppat_var {txt = ident2}) }, {txt = aliasIdent}))
           when Longident.last ident = ident2 ->
          (* record field punning when destructuring with renaming. {state: state as prevState} becomes {state as prevState *)
          (* works with module prefix too: {ReasonReact.state: state as prevState} becomes {ReasonReact.state as prevState *)
            makeList ~sep:(Sep " ") [self#longident_loc li; atom "as"; atom aliasIdent]
        | _ ->
            label ~space:true (makeList [self#longident_loc li; atom ":"]) (self#pattern p)
    in
    let rows = (List.map longident_x_pattern l)@(
      match closed with
        | Closed -> []
        | _ -> [atom "_"]
    ) in
    let (left, right) = wrap in
    let wrap = (left ^ "{", "}" ^ right) in
    makeList
      ~wrap
      ~break:IfNeed
      ~sep:commaTrail
      ~postSpace:true
      rows

  method patternFunction ?extension loc l =
    let estimatedFunLocation = {
        loc_start = loc.loc_start;
        loc_end = {loc.loc_start with pos_cnum = loc.loc_start.Lexing.pos_cnum + 3};
        loc_ghost = false;
    } in
    makeList
      ~postSpace:true
      ~break:IfNeed
      ~inline:(true, true)
      ~pad:(false, false)
      ((atom ~loc:estimatedFunLocation (add_extension_sugar funToken extension)) :: (self#case_list l))

  method parenthesized_expr ?break expr =
    let result = self#unparseExpr expr in
    match expr.pexp_attributes, expr.pexp_desc with
    | [], (Pexp_tuple _ | Pexp_construct ({txt=Lident "()"}, None)) -> result
    | _ -> makeList ~wrap:("(",")") ?break [self#unparseExpr expr]

  (* Expressions requiring parens, in most contexts such as separated by infix *)
  method expression_requiring_parens_in_infix x =
    let {stdAttrs} = partitionAttributes x.pexp_attributes in
    assert (stdAttrs == []);
    (* keep the incoming expression around, an expr with
     * immediate extension sugar might contain less than perfect location
     * info in its children (used for comment interleaving), the expression passed to
     * 'expression_requiring_parens_in_infix' contains the correct location *)
    let originalExpr = x in
    let extension, x = expression_immediate_extension_sugar x in
    match x.pexp_desc with
      (* The only reason Pexp_fun must also be wrapped in parens when under
         pipe, is that its => token will be confused with the match token.
         Simple expression will also invoke `#reset`. *)
      | Pexp_function _ when pipe || semi -> None (* Would be rendered as simplest_expression  *)
      (* Pexp_function, on the other hand, doesn't need wrapping in parens in
         most cases anymore, since `fun` is not ambiguous anymore (we print Pexp_fun
         as ES6 functions). *)
      | Pexp_function l ->
        let prec = Custom funToken in
        let expr = self#patternFunction ?extension x.pexp_loc l in
        Some (SpecificInfixPrecedence
                ({reducePrecedence=prec; shiftPrecedence=prec}, LayoutNode expr))
      | _ ->
        (* The Pexp_function cases above don't use location because comment printing
          breaks for them. *)
        let itm = match x.pexp_desc with
          | Pexp_fun _
          | Pexp_newtype _ ->
            (* let uncurried =  *)
            let (args, ret) = self#curriedPatternsAndReturnVal x in
            (match args with
              | [] -> raise (NotPossible ("no arrow args in unparse "))
              | firstArg::tl ->
                (* Suboptimal printing of parens:

                      something >>= fun x => x + 1;

                   Will be printed as:

                      something >>= (fun x => x + 1);

                   Because the arrow has lower precedence than >>=, but it wasn't
                   needed because

                      (something >>= fun x) => x + 1;

                   Is not a valid parse. Parens around the `=>` weren't needed to
                   prevent reducing instead of shifting. To optimize this part, we need
                   a much deeper encoding of the parse rules to print parens only when
                   needed, testing which rules will be reduced. It really should be
                   integrated deeply with Menhir.

                   One question is, if it's this difficult to describe when parens are
                   needed, should we even print them with the minimum amount?  We can
                   instead model everything as "infix" with ranked precedences.  *)
                let retValUnparsed = self#unparseExprApplicationItems ret in
                Some (self#wrapCurriedFunctionBinding
                        ~sweet:(extension = None)
                        (add_extension_sugar funToken extension)
                        ~arrow:"=>" firstArg tl retValUnparsed)
            )
          | Pexp_try (e, l) ->
            let estimatedBracePoint = {
              loc_start = e.pexp_loc.loc_end;
              loc_end = x.pexp_loc.loc_end;
              loc_ghost = false;
            }
            in
            let cases = (self#case_list ~allowUnguardedSequenceBodies:true l) in
            let switchWith = label ~space:true
                (atom (add_extension_sugar "try" extension))
                (self#parenthesized_expr ~break:IfNeed e)
            in
            Some (
              label
                ~space:true
                switchWith
                (source_map ~loc:estimatedBracePoint
                   (makeList ~indent:settings.trySwitchIndent ~wrap:("{", "}")
                      ~break:Always_rec ~postSpace:true cases))
            )
          (* These should have already been handled and we should never havgotten this far. *)
          | Pexp_setinstvar _ -> raise (Invalid_argument "Cannot handle setinstvar here - call unparseExpr")
          | Pexp_setfield (_, _, _) -> raise (Invalid_argument "Cannot handle setfield here - call unparseExpr")
          | Pexp_apply _ -> raise (Invalid_argument "Cannot handle apply here - call unparseExpr")
          | Pexp_match (e, l) ->
             let estimatedBracePoint = {
               loc_start = e.pexp_loc.loc_end;
               (* See originalExpr binding, for more info.
                * It contains the correct location under immediate extension sugar *)
               loc_end = originalExpr.pexp_loc.loc_end;
               loc_ghost = false;
             }
             in
             let cases = (self#case_list ~allowUnguardedSequenceBodies:true l) in
             let switchWith =
               label ~space:true (atom (add_extension_sugar "switch" extension))
                 (self#parenthesized_expr ~break:IfNeed e)
             in
             let lbl =
               label
                 ~space:true
                 switchWith
                 (source_map ~loc:estimatedBracePoint
                    (makeList ~indent:settings.trySwitchIndent ~wrap:("{", "}")
                       ~break:Always_rec ~postSpace:true cases))
             in
             Some lbl
          | Pexp_ifthenelse (e1, e2, eo) ->
            let (blocks, finalExpression) = sequentialIfBlocks eo in
            let rec singleExpression exp =
              match exp.pexp_desc with
              | Pexp_ident _ -> true
              | Pexp_constant _ -> true
              | Pexp_construct (_, arg) ->
                (match arg with
                | None -> true
                | Some x -> singleExpression x)
              | _ -> false
            in
            let singleLineIf =
              (singleExpression e1) &&
              (singleExpression e2) &&
              (match eo with
               | Some expr -> singleExpression expr
               | None -> true
              )
            in
            let makeLetSequence =
              if singleLineIf then
                makeLetSequenceSingleLine
              else
                makeLetSequence
            in
            let rec sequence soFar remaining = (
              match (remaining, finalExpression) with
                | ([], None) -> soFar
                | ([], Some e) ->
                  let soFarWithElseAppended = makeList ~postSpace:true [soFar; atom "else"] in
                  label ~space:true soFarWithElseAppended
                    (source_map ~loc:e.pexp_loc (makeLetSequence (self#letList e)))
                | (hd::tl, _) ->
                  let (e1, e2) = hd in
                  let soFarWithElseIfAppended =
                    label
                      ~space:true
                      (makeList ~postSpace:true [soFar; atom "else if"])
                      (makeList ~wrap:("(",")") [self#unparseExpr e1])
                  in
                  let nextSoFar =
                    label ~space:true soFarWithElseIfAppended
                      (source_map ~loc:e2.pexp_loc (makeLetSequence (self#letList e2)))
                  in
                  sequence nextSoFar tl
            ) in
            let init =
              let if_ = atom (add_extension_sugar "if" extension) in
              let cond = self#parenthesized_expr e1 in
              label ~space:true
                (source_map ~loc:e1.pexp_loc (label ~space:true if_ cond))
                (source_map ~loc:e2.pexp_loc (makeLetSequence (self#letList e2)))
            in
            Some (sequence init blocks)
          | Pexp_while (e1, e2) ->
            let lbl =
              let while_ = atom (add_extension_sugar "while" extension) in
              let cond = self#parenthesized_expr e1 in
              label ~space:true
                (label ~space:true while_ cond)
                (source_map ~loc:e2.pexp_loc (makeLetSequence (self#letList e2)))
            in
            Some lbl
          | Pexp_for (s, e1, e2, df, e3) ->
            (*
             *  for longIdentifier in
             *      (longInit expr) to
             *      (longEnd expr) {
             *    print_int longIdentifier;
             *  };
             *)
            let identifierIn = (makeList ~postSpace:true [self#pattern s; atom "in";]) in
            let dockedToFor = makeList
                ~break:IfNeed
                ~postSpace:true
                ~inline:(true, true)
                ~wrap:("(",")")
                [
                  identifierIn;
                  makeList ~postSpace:true [self#unparseExpr e1; self#direction_flag df];
                  (self#unparseExpr e2);
                ]
            in
            let upToBody = makeList ~inline:(true, true) ~postSpace:true
                [atom (add_extension_sugar "for" extension); dockedToFor]
            in
            Some (label ~space:true upToBody
                    (source_map ~loc:e3.pexp_loc (makeLetSequence (self#letList e3))))
          | Pexp_new li ->
            Some (label ~space:true (atom "new") (self#longident_class_or_type_loc li))
          | Pexp_assert e ->
            Some (
              label
                (atom "assert")
                (makeTup [(self#unparseExpr e)]);
            )
          | Pexp_lazy e ->
              Some (label ~space:true (atom "lazy") (self#simplifyUnparseExpr e))
          | Pexp_poly _ ->
            failwith (
              "This version of the pretty printer assumes it is impossible to " ^
              "construct a Pexp_poly outside of a method definition - yet it sees one."
            )
          | _ -> None
        in
        match itm with
          | None -> None
          | Some i -> Some (PotentiallyLowPrecedence (source_map ~loc:x.pexp_loc i))

  method potentiallyConstrainedExpr x =
    match x.pexp_desc with
      | Pexp_constraint (e, ct) ->
          formatTypeConstraint (self#unparseExpr e) (self#core_type ct)
      | _ -> self#unparseExpr x


  (*
   * Because the rule BANG simple_expr was given %prec below_DOT_AND_SHARP,
   * !x.y.z will parse as !(x.y.z) and not (!x).y.z.
   *
   *     !x.y.z == !((x.y).z)
   *     !x#y#z == !((x#y)#z)
   *
   * So the intuition is: In general, any simple expression can exist to the
   * left of a `.`, except `BANG simple_expr`, which has special precedence,
   * and must be guarded in this one case.
   *
   * TODO: Instead of special casing this here, we should continue to extend
   * unparseExpr to also unparse simple expressions, (by encoding the
   * rules precedence below_DOT_AND_SHARP).
   *
   * TODO:
   *  Some would even have the prefix application be parsed with lower
   *  precedence function *application*. In the case of !, where ! means not,
   *  it makes a lot of sense because (!identifier)(arg) would be meaningless.
   *
   *  !callTheFunction(1, 2, 3)(andEvenCurriedArgs)
   *
   * Only problem is that it could then not appear anywhere simple expressions
   * would appear.
   *
   * We could make a special case for ! followed by one simple expression, and
   * consider the result simple.
   *
   * Alternatively, we can figure out a way to not require simple expressions
   * in the most common locations such as if/while tests. This is really hard
   * (impossible w/ grammars Menhir supports?)
   *
   * if ! myFunc argOne argTwo {
   *
   * } else {
   *
   * };
   *
   *)
  method simple_enough_to_be_lhs_dot_send x =
    match x.pexp_desc with
    | (Pexp_apply (eFun, _)) -> (
        match printedStringAndFixityExpr eFun with
        | AlmostSimplePrefix _
        | UnaryPlusPrefix _
        | UnaryMinusPrefix _
        | UnaryNotPrefix _
        | UnaryPostfix _
        | Infix _ -> self#simplifyUnparseExpr x
        | Normal ->
          if x.pexp_attributes == [] then
            (* `let a = foo().bar` instead of `let a = (foo()).bar *)
            (* same for foo()##bar, foo()#=bar, etc. *)
            self#unparseExpr x
          else
            self#simplifyUnparseExpr x
      )
    | _ -> self#simplifyUnparseExpr x

  method unparseRecord
    ?wrap:((lwrap, rwrap)=("", ""))
    ?withStringKeys:(withStringKeys=false)
    ?allowPunning:(allowPunning=true)
    ?forceBreak:(forceBreak=false)
    l eo =
    (* forceBreak is a ref which can be set to always break the record rows.
     * Example, when we have a row which contains a nested record,
     * this ref can be set to true from inside the printing of that row,
     * which forces breaks for the outer record structure. *)
    let forceBreak = ref forceBreak in
    let quote = (atom "\"") in
    let maybeQuoteFirstElem fst rest =
        if withStringKeys then (match fst.txt with
          | Lident s -> quote::(atom s)::quote::rest
          | Ldot _  | Lapply _ -> assert false
          )
        else
          (self#longident_loc fst)::rest
    in
    let makeRow (li, e) shouldPun =
      let totalRowLoc = {
        loc_start = li.Asttypes.loc.loc_start;
        loc_end = e.pexp_loc.loc_end;
        loc_ghost = false;
      } in
      let theRow = match (e.pexp_desc, shouldPun, allowPunning) with
        (* record value punning. Turns {foo: foo, bar: 1} into {foo, bar: 1} *)
        (* also turns {Foo.bar: bar, baz: 1} into {Foo.bar, baz: 1} *)
        (* don't turn {bar: Foo.bar, baz: 1} into {bar, baz: 1}, naturally *)
        | (Pexp_ident {txt = Lident value}, true, true) when Longident.last li.txt = value ->
          makeList (maybeQuoteFirstElem li [])

          (* Force breaks for nested records or bs obj sugar
           * Example:
           *  let person = {name: {first: "Bob", last: "Zhmith"}, age: 32};
           * is a lot less readable than
           *  let person = {
           *   "name": {
           *     "first": "Bob",
           *     "last": "Zhmith"
           *   },
           *  "age": 32
           *  };
           *)
        | (Pexp_record (recordRows, optionalGadt), _, _) ->
            forceBreak := true;
            let keyWithColon = makeList (maybeQuoteFirstElem li [atom ":"]) in
            let value = self#unparseRecord ~forceBreak: true recordRows optionalGadt in
            label ~space:true keyWithColon value
        | (Pexp_extension (s, p), _, _) when s.txt = "bs.obj" ->
            forceBreak := true;
            let keyWithColon = makeList (maybeQuoteFirstElem li [atom ":"]) in
            let value = self#formatBsObjExtensionSugar ~forceBreak:true p in
            label ~space:true keyWithColon value
        | (Pexp_object classStructure, _, _) ->
            forceBreak := true;
            let keyWithColon = makeList (maybeQuoteFirstElem li [atom ":"]) in
            let value = self#classStructure ~forceBreak:true classStructure in
            label ~space:true keyWithColon value
        | _ ->
          let (argsList, return) = self#curriedPatternsAndReturnVal e in
          match argsList with
          | [] ->
            let appTerms = self#unparseExprApplicationItems e in
            let upToColon = makeList (maybeQuoteFirstElem li [atom ":"]) in
            formatAttachmentApplication applicationFinalWrapping (Some (true, upToColon)) appTerms
          | firstArg :: tl ->
            let upToColon = makeList (maybeQuoteFirstElem li [atom ":"]) in
            let returnedAppTerms = self#unparseExprApplicationItems return in
            self#wrapCurriedFunctionBinding
              ~sweet:true ~attachTo:upToColon funToken ~arrow:"=>"
              firstArg tl returnedAppTerms
      in (source_map ~loc:totalRowLoc theRow, totalRowLoc)
    in
    let rec getRows l =
      match l with
        | [] -> []
        | hd::[] -> [makeRow hd true]
        | hd::hd2::tl -> (makeRow hd true)::(getRows (hd2::tl))
    in

    let allRows = match eo with
      | None -> (
        match l with
          (* No punning (or comma) for records with only a single field. It's ambiguous with an expression in a scope *)
          (* See comment in parser.mly for lbl_expr_list_with_at_least_one_non_punned_field *)
          | [hd] -> [makeRow hd false]
          | _ -> getRows l
        )
      (* This case represents a "spread" being present -> {...x, a: 1, b: 2} *)
      | Some withRecord ->
        let firstRow =
          let row = (
            (* Unclear why "sugar_expr" was special cased hre. *)
            let appTerms = self#unparseExprApplicationItems withRecord in
            formatAttachmentApplication applicationFinalWrapping (Some (false, (atom "..."))) appTerms
          )
          in (
            source_map ~loc:withRecord.pexp_loc row,
            withRecord.pexp_loc
          )
        in
        firstRow::(getRows l)
    in
    makeList
      ~wrap:(lwrap ^ "{" ,"}" ^ rwrap)
      ~break:(if !forceBreak then Layout.Always else Layout.IfNeed)
      ~sep:commaTrail
      ~postSpace:true
      (groupAndPrint ~xf:fst ~getLoc:snd ~comments:self#comments allRows)

  method isSeriesOfOpensFollowedByNonSequencyExpression expr =
    match (expr.pexp_attributes, expr.pexp_desc) with
        | ([], Pexp_let _) -> false
        | ([], Pexp_sequence _) -> false
        | ([], Pexp_letmodule _) -> false
        | ([], Pexp_open (ovf, _, e)) ->
          ovf == Fresh && self#isSeriesOfOpensFollowedByNonSequencyExpression e
        | ([], Pexp_letexception _) -> false
        | ([], Pexp_extension ({txt}, _)) -> txt = "bs.obj"
        | _ -> true

  method unparseObject ?wrap:((lwrap,rwrap)=("", "")) ?(withStringKeys=false) l o =
    let core_field_type (s, attrs, ct) =
      let l = extractStdAttrs attrs in
      let row =
         let rowKey = if withStringKeys then
            (makeList ~wrap:("\"", "\"") [atom s])
          else (atom s)
          in
          label ~space:true
                (makeList ~break:Layout.Never [rowKey; (atom ":")])
                (self#core_type ct)
      in
      (match l with
       | [] -> row
       | _::_ ->
         makeList
           ~postSpace:true
           ~break:IfNeed
           ~inline:(true, true)
           (List.concat [self#attributes attrs; [row]]))
    in
    let rows = List.map core_field_type l in
    let openness = match o with
      | Closed -> atom "."
      | Open -> atom ".."
    in
    (* if an object has more than 2 rows, always break for readability *)
    let rows_layout = makeList
        ~inline:(true, true) ~postSpace:true ~sep:commaTrail rows
        ~break:(if List.length rows >= 2
                then Layout.Always_rec
                else Layout.IfNeed)
    in
    makeList
      ~break:Layout.IfNeed
      ~preSpace:(rows != [])
      ~wrap:(lwrap ^ "{", "}" ^ rwrap)
      (openness::[rows_layout])

  method unparseSequence ?wrap:(wrap=("", "")) ~construct l =
    match construct with
    | `ES6List ->
      let seq, ext = (match List.rev l with
        | ext :: seq_rev -> (List.rev seq_rev, ext)
        | [] -> assert false) in
      makeES6List ~wrap (List.map self#unparseExpr seq) (self#unparseExpr ext)
    | _ ->
      let (left, right) = wrap in
      let (xf, (leftDelim, rightDelim)) = (match construct with
        | `List -> (self#unparseExpr, ("[", "]"))
        | `Array -> (self#unparseExpr, ("[|", "|]"))
        | `Tuple -> (self#potentiallyConstrainedExpr, ("(", ")"))
        | `ES6List -> assert false)
      in
      let wrap = (left ^ leftDelim, rightDelim ^ right) in
      makeList
        ~wrap
        ~sep:commaTrail
        ~break:IfNeed
        ~postSpace:true
        (List.map xf l)


  method formatBsObjExtensionSugar ?wrap:(wrap=("", "")) ?(forceBreak=false) payload =
    match payload with
    | PStr [itm] -> (
      match itm with
      | {pstr_desc = Pstr_eval ({ pexp_desc = Pexp_record (l, eo) }, []) } ->
        self#unparseRecord ~forceBreak ~wrap ~withStringKeys:true ~allowPunning:false l eo
      | {pstr_desc = Pstr_eval ({ pexp_desc = Pexp_extension ({txt = "bs.obj"}, payload) }, []) } ->
        (* some folks write `[%bs.obj [%bs.obj {foo: bar}]]`. This looks improbable but
          it happens often if you use the sugared version: `[%bs.obj {"foo": bar}]`.
          We're gonna be lenient here and treat it as if they wanted to just write
          `{"foo": bar}`. BuckleScript does the same relaxation when parsing bs.obj
        *)
        self#formatBsObjExtensionSugar ~wrap ~forceBreak payload
      | _ -> raise (Invalid_argument "bs.obj only accepts a record. You've passed something else"))
    | _ -> assert false

  method should_preserve_requested_braces expr =
    let {stylisticAttrs} = partitionAttributes expr.pexp_attributes in
    match expr.pexp_desc with
    | Pexp_ifthenelse _
    | Pexp_try _ -> false
    | _ ->
        preserve_braces &&
        Reason_attributes.has_preserve_braces_attrs stylisticAttrs

  method simplest_expression x =
    let {stdAttrs; jsxAttrs} = partitionAttributes x.pexp_attributes in
    if stdAttrs != [] then
      None
    else if self#should_preserve_requested_braces x then
      let layout =
        makeList
          ~break:(if inline_braces then Always else Always_rec)
          ~inline:(true, inline_braces)
          ~wrap:("{", "}")
          ~postSpace:true
          ~sep:(if inline_braces then NoSep else (SepFinal (";", ";")))
          (self#letList x)
      in
      Some layout
    else
      let item =
        match x.pexp_desc with
        (* The only reason Pexp_fun must also be wrapped in parens is that its =>
           token will be confused with the match token. *)
        | Pexp_fun _ when pipe || semi -> Some (self#reset#simplifyUnparseExpr x)
        | Pexp_function l when pipe || semi -> Some (formatPrecedence ~loc:x.pexp_loc (self#reset#patternFunction x.pexp_loc l))
        | Pexp_apply _ -> (
          match self#simple_get_application x with
          (* If it's the simple form of application. *)
          | Some simpleGet -> Some simpleGet
          | None -> None
        )
        | Pexp_object cs -> Some (self#classStructure cs)
        | Pexp_override l -> (* FIXME *)
          let string_x_expression (s, e) =
            label ~space:true (atom (s.txt ^ ":")) (self#unparseExpr e)
          in
          Some (
            makeList
              ~postSpace:true
              ~wrap:("{<", ">}")
              ~sep:(Sep ",")
              (List.map string_x_expression l)
          )
        | Pexp_construct _  when is_simple_construct (view_expr x) ->
            let hasJsxAttribute = jsxAttrs != [] in
            Some (
              match view_expr x with
              | `nil -> if hasJsxAttribute then atom "<> </>" else atom "[]"
              | `tuple -> atom "()"
              | `list xs -> (* LIST EXPRESSION *)
                if hasJsxAttribute then
                  let actualChildren =
                    match self#formatChildren xs [] with
                    | None -> []
                    | Some ch -> ch
                  in
                    makeList
                      ~break:IfNeed
                      ~inline:(false, false)
                      ~postSpace:true
                      ~wrap:("<>", "</>")
                      ~pad:(true, true)
                      actualChildren
                else
                  self#unparseSequence ~construct:`List xs
              | `cons xs ->
                  self#unparseSequence ~construct:`ES6List xs
              | `simple x -> self#longident x
              | _ -> assert false
            )
        | Pexp_ident li ->
            (* Lone identifiers shouldn't break when to the right of a label *)
            Some (ensureSingleTokenSticksToLabel (self#longident_loc li))
        | Pexp_constant c ->
            (* Constants shouldn't break when to the right of a label *)
          let raw_literal, _ = extract_raw_literal x.pexp_attributes in
            Some (ensureSingleTokenSticksToLabel
                    (self#constant ?raw_literal c))
        | Pexp_pack me ->
          Some (
            makeList
              ~break:IfNeed
              ~postSpace:true
              ~wrap:("(", ")")
              ~inline:(true, true)
              [atom "module"; self#module_expr me;]
          )
        | Pexp_tuple l ->
            (* TODO: These may be simple, non-simple, or type constrained
               non-simple expressions *)
          Some (self#unparseSequence ~construct:`Tuple l)
        | Pexp_constraint (e, ct) ->
          Some (
            makeList
              ~break:IfNeed
              ~wrap:("(", ")")
              [formatTypeConstraint (self#unparseExpr e) (self#core_type ct)]
          )
        | Pexp_coerce (e, cto1, ct) ->
            let optFormattedType = match cto1 with
              | None -> None
              | Some typ -> Some (self#core_type typ) in
            Some (
              makeList
                ~break:IfNeed
                ~wrap:("(", ")")
                [formatCoerce (self#unparseExpr e) optFormattedType (self#core_type ct)]
            )
        | Pexp_variant (l, None) ->
            Some (ensureSingleTokenSticksToLabel (atom ("`" ^ l)))
        | Pexp_record (l, eo) -> Some (self#unparseRecord l eo)
        | Pexp_array l ->
          Some (self#unparseSequence ~construct:`Array l)
        | Pexp_let _ | Pexp_sequence _
        | Pexp_letmodule _ | Pexp_letexception _ ->
          Some (makeLetSequence (self#letList x))
        | Pexp_extension e ->
          begin match expression_immediate_extension_sugar x with
            | (Some _, _) -> None
            | (None, _) ->
              match expression_extension_sugar x with
              | None -> Some (self#extension e)
              | Some (_, x') ->
                match x'.pexp_desc with
                | Pexp_let _ ->
                  Some (makeLetSequence (self#letList x))
                | _ -> Some (self#extension e)
          end
        | Pexp_open (_, lid, e) ->
            if self#isSeriesOfOpensFollowedByNonSequencyExpression x then
              Some (label (label (self#longident_loc lid) (atom (".")))
                          (self#formatNonSequencyExpression e))
          else
            Some (makeLetSequence (self#letList x))
        | Pexp_send (e, s) ->
          let needparens = match e.pexp_desc with
            | Pexp_apply (ee, _) ->
              (match printedStringAndFixityExpr ee with
               | UnaryPostfix "^" -> true
               | _ -> false)
            | _ -> false
          in
          let lhs = self#simple_enough_to_be_lhs_dot_send e in
          let lhs = if needparens then makeList ~wrap:("(",")") [lhs] else lhs in
          Some (label (makeList [lhs; atom "#";]) (atom s))
        | _ -> None
      in
      match item with
      | None -> None
      | Some i -> Some (source_map ~loc:x.pexp_loc i)

  method formatChildren children processedRev =
    match children with
    | {pexp_desc = Pexp_constant constant} as x :: remaining ->
      let raw_literal, _ = extract_raw_literal x.pexp_attributes in
      self#formatChildren remaining (self#constant ?raw_literal constant :: processedRev)
    | {pexp_desc = Pexp_construct ({txt = Lident "::"}, Some {pexp_desc = Pexp_tuple children} )} as x :: remaining ->
      let {jsxAttrs} = partitionAttributes x.pexp_attributes in
      if jsxAttrs != [] then
        match self#simplest_expression x with
        | Some r -> self#formatChildren remaining (r :: processedRev)
        | None -> self#formatChildren (remaining @ children) processedRev
      else
        self#formatChildren (remaining @ children) processedRev
    | ({pexp_desc = Pexp_apply _} as e) :: remaining ->
        let child =
        (* Pipe first behaves differently according to the expression on the
         * right. In example (1) below, it's a `SpecificInfixPrecedence`; in
         * (2), however, it's `Simple` and doesn't need to be wrapped in parens.
         *
         * (1). <div> {items->Belt.Array.map(ReasonReact.string)->ReasonReact.array} </div>;
         * (2). <Foo> (title === "" ? [1, 2, 3] : blocks)->Foo.toString </Foo>; *)
        if Reason_heuristics.isPipeFirst e &&
           not (Reason_heuristics.isPipeFirstWithNonSimpleJSXChild e)
        then
          self#formatPipeFirst e
        else
          self#inline_braces#simplifyUnparseExpr ~inline:true ~wrap:("{", "}") e
        in
        self#formatChildren remaining (child::processedRev)
    | {pexp_desc = Pexp_ident li} :: remaining ->
      self#formatChildren remaining (self#longident_loc li :: processedRev)
    | {pexp_desc = Pexp_construct ({txt = Lident "[]"}, None)} :: remaining -> self#formatChildren remaining processedRev
    | {pexp_desc = Pexp_match _ } as head :: remaining ->
        self#formatChildren
          remaining
          (self#inline_braces#simplifyUnparseExpr ~inline:true ~wrap:("{", "}") head :: processedRev)
    | head :: remaining ->
        self#formatChildren
          remaining
          (self
            #dont_preserve_braces (* the brace logic is handled here *)
            #simplifyUnparseExpr ~inline:true ~wrap:("{", "}")
            head
           :: processedRev)
    | [] -> match processedRev with
        | [] -> None
        | _::_ -> Some (List.rev processedRev)

  method direction_flag = function
    | Upto -> atom "to"
    | Downto -> atom "downto"

  method payload ppxToken ppxId e =
    let wrap = ("[" ^ ppxToken ^ ppxId.txt, "]") in
    let wrap_prefix str (x,y) = (x^str, y) in
    let break = Layout.IfNeed in
    let pad = (true, false) in
    let postSpace = true in
    match e with
    | PStr [] -> atom ("[" ^ ppxToken  ^ ppxId.txt  ^ "]")
    | PStr [itm] -> makeList ~break ~wrap ~pad [self#structure_item itm]
    | PStr (_::_ as items) ->
      let rows = List.map self#structure_item items in
      makeList ~wrap ~break ~pad ~postSpace ~sep:(Layout.Sep ";") rows
    | PTyp x ->
      let wrap = wrap_prefix ":" wrap in
      makeList ~wrap ~break ~pad [self#core_type x]
    (* Signatures in attributes were added recently *)
    | PSig [] -> atom ("[" ^ ppxToken ^ ppxId.txt ^":]")
    | PSig [x] ->
      let wrap = wrap_prefix ":" wrap in
      makeList ~break ~wrap ~pad [self#signature_item x]
    | PSig items ->
      let wrap = wrap_prefix ":" wrap in
      let rows = List.map self#signature_item items in
      makeList ~wrap ~break ~pad ~postSpace ~sep:(Layout.Sep ";") rows
    | PPat (x, None) ->
      let wrap = wrap_prefix "?" wrap in
      makeList ~wrap ~break ~pad [self#pattern x]
    | PPat (x, Some e) ->
      let wrap = wrap_prefix "?" wrap in
      makeList ~wrap ~break ~pad ~postSpace [
        self#pattern x;
        label ~space:true (atom "when") (self#unparseExpr e)
      ]

  method extension (s, p) =
    match s.txt with
    (* We special case "bs.obj" for now to allow for a nicer interop with
     * BuckleScript. We might be able to generalize to any kind of record
     * looking thing with struct keys. *)
    | "bs.obj" -> self#formatBsObjExtensionSugar p
    | _ -> (self#payload "%" s p)

  method item_extension (s, e) = (self#payload "%%" s e)


  (* [@ ...] Simple attributes *)
  method attribute = function
    | { Location. txt = ("ocaml.doc" | "ocaml.text") },
      PStr [{ pstr_desc = Pstr_eval ({ pexp_desc = Pexp_constant (Pconst_string(text, None)) } , _);
              pstr_loc }] ->
      let text = if text = "" then "/**/" else "/**" ^ text ^ "*/" in
      makeList ~inline:(true, true) ~postSpace:true ~preSpace:true ~indent:0 ~break:IfNeed [atom ~loc:pstr_loc text]
    | (s, e) -> self#payload "@" s e

  (* [@@ ... ] Attributes that occur after a major item in a structure/class *)
  method item_attribute = self#attribute

  (* [@@ ...] Attributes that occur not *after* an item in some structure/class/sig, but
     rather as their own standalone item. Note that syntactic distinction
     between item_attribute and floating_attribute is no longer necessary with
     Reason. Thank you semicolons. *)
  method floating_attribute = self#item_attribute

  method attributes l = List.map self#attribute l

  method attach_std_attrs l toThis =
    let l = extractStdAttrs l in
    match l with
      | [] -> toThis
      | _::_ -> makeList ~postSpace:true (List.concat [self#attributes l; [toThis]])

  method attach_std_item_attrs ?(allowUncurry=true) ?extension l toThis =
    let l = (partitionAttributes ~allowUncurry l).stdAttrs in
    match extension, l with
    | None, [] -> toThis
    | _, _ ->
      let extension = match extension with
        | None -> []
        | Some id -> [atom ("%" ^ id.txt)]
      in
      makeList
        ~postSpace:true ~indent:0 ~break:Layout.Always_rec ~inline:(true, true)
        (extension @ List.map self#item_attribute l @ [toThis])

  method exception_declaration ed =
    let pcd_name = ed.pext_name in
    let pcd_loc = ed.pext_loc in
    let pcd_attributes = [] in
    let exn_arg = match ed.pext_kind with
      | Pext_decl (args, type_opt) ->
          let pcd_args, pcd_res = args, type_opt in
          [self#type_variant_leaf_nobar {pcd_name; pcd_args; pcd_res; pcd_loc; pcd_attributes}]
      | Pext_rebind id ->
          [atom pcd_name.txt; atom "="; (self#longident_loc id)] in
    let {stdAttrs; docAttrs} =
      partitionAttributes ~partDoc:true ed.pext_attributes
    in
    let layout =
      self#attach_std_item_attrs
        stdAttrs
        (label ~space:true
          (atom "exception")
          (makeList ~postSpace:true ~inline:(true, true) exn_arg))
    in
    self#attachDocAttrsToLayout
      ~stdAttrs
      ~docAttrs
      ~loc:ed.pext_loc
      ~layout
      ()

  (*
    Note: that override doesn't appear in class_sig_field, but does occur in
    class/object expressions.
    TODO: TODOATTRIBUTES
   *)
  method method_sig_flags_for s = function
    | Virtual -> [atom "virtual"; atom s]
    | Concrete ->  [atom s]

  method value_type_flags_for s = function
    | (Virtual, Mutable) -> [atom "virtual"; atom "mutable"; atom s]
    | (Virtual, Immutable) -> [atom "virtual"; atom s]
    | (Concrete, Mutable) -> [atom "mutable"; atom s]
    | (Concrete, Immutable) -> [atom s]

  method class_sig_field x =
    match x.pctf_desc with
    | Pctf_inherit ct ->
      label ~space:true (atom "inherit") (self#class_constructor_type ct)
    | Pctf_val (s, mf, vf, ct) ->
      let valueFlags = self#value_type_flags_for (s ^ ":") (vf, mf) in
      label
        ~space:true
        (
          label ~space:true
            (atom "val")
            (makeList ~postSpace:true ~inline:(false, true) ~break:IfNeed valueFlags)
        )
        (self#core_type ct)
    | Pctf_method (s, pf, vf, ct) ->
      let methodFlags = self#method_sig_flags_for (s ^ ":") vf
      in
      let pubOrPrivate =
        match pf with
        | Private -> "pri"
        | Public -> "pub"
      in
      let m = label
        ~space:true
        (label ~space:true
            (atom pubOrPrivate)
            (makeList ~postSpace:true ~inline:(false, true) ~break:IfNeed methodFlags)
        )
        (self#core_type ct)
      in
      (self#attach_std_item_attrs x.pctf_attributes m)
    | Pctf_constraint (ct1, ct2) ->
      label
        ~space:true
        (atom "constraint")
        (label ~space:true
            (makeList ~postSpace:true [self#core_type ct1; atom "="])
            (self#core_type ct2)
        )
    | Pctf_attribute a -> self#floating_attribute a
    | Pctf_extension e -> self#item_extension e

  (*
    /** doc comment */                                    (* formattedDocs *)
    [@bs.val] [@bs.module "react-dom"]                    (* formattedAttrs *)
    external render : reactElement => element => unit =   (* frstHalf *)
      "render";                                           (* sndHalf *)

    To improve the formatting with breaking & indentation:
      * consider the part before the '=' as a label
      * combine that label with '=' in a list
      * consider the part after the '=' as a list
      * combine both parts as a label
      * format the doc comment with a ~postSpace:true (inline, not inline) list
      * format the attributes with a ~postSpace:true (inline, inline) list
      * format everything together in a ~postSpace:true (inline, inline) list
        for nicer breaking
  *)
  method primitive_declaration vd =
    let lblBefore =
      label
        ~space:true
        (makeList
           [(makeList ~postSpace:true [atom "external"; protectIdentifier vd.pval_name.txt]); (atom ":")])
        (self#core_type vd.pval_type)
    in
    let frstHalf = makeList ~postSpace:true [lblBefore; atom "="] in
    let sndHalf = makeSpacedBreakableInlineList (List.map self#constant_string vd.pval_prim) in
    let primDecl = label ~space:true frstHalf sndHalf in
    match vd.pval_attributes with
    | [] -> primDecl
    | attrs ->
        let {stdAttrs; docAttrs} = partitionAttributes ~partDoc:true attrs in
        let docs = List.map self#item_attribute docAttrs in
        let formattedDocs = makeList ~postSpace:true docs in
        let attrs = List.map self#item_attribute stdAttrs in
        let formattedAttrs = makeSpacedBreakableInlineList attrs in
        let layouts = match (docAttrs, stdAttrs) with
        | ([], _) -> [formattedAttrs; primDecl]
        | (_, []) -> [formattedDocs; primDecl]
        | _ -> [formattedDocs; formattedAttrs; primDecl] in
        makeSpacedBreakableInlineList layouts

  method class_instance_type x =
    match x.pcty_desc with
    | Pcty_signature cs ->
      let {pcsig_self = ct; pcsig_fields = l} = cs in
      let instTypeFields = List.map self#class_sig_field l in
      let allItems = match ct.ptyp_desc with
        | Ptyp_any -> instTypeFields
        | _ ->
          label ~space:true (atom "as") (self#core_type ct) ::
          instTypeFields
      in
      self#attach_std_item_attrs ~allowUncurry:false x.pcty_attributes (
        makeList
          ~wrap:("{", "}")
          ~postSpace:true
          ~break:Layout.Always_rec
          (List.map semiTerminated allItems)
      )
    | Pcty_constr (li, l) ->
      self#attach_std_attrs x.pcty_attributes (
        match l with
        | [] -> self#longident_loc li
        | _::_ ->
          label
            (self#longident_loc li)
            (makeList ~wrap:("(", ")") ~sep:commaTrail (List.map self#core_type l))
      )
    | Pcty_extension e ->
      self#attach_std_item_attrs x.pcty_attributes (self#extension e)
    | Pcty_arrow _ -> failwith "class_instance_type should not be printed with Pcty_arrow"

  method class_declaration_list l =
    let class_declaration ?(class_keyword=false)
        ({pci_params=ls; pci_name={txt}; pci_virt; pci_loc} as x) =
      let (firstToken, pattern, patternAux) = self#class_opening class_keyword txt pci_virt ls in
      let classBinding = self#wrappedClassBinding firstToken pattern patternAux x.pci_expr in
      source_map ~loc:pci_loc
        (self#attach_std_item_attrs x.pci_attributes classBinding)
    in
    (match l with
      | [] -> raise (NotPossible "Class definitions will have at least one item.")
      | x::rest ->
        makeNonIndentedBreakingList (
          class_declaration ~class_keyword:true x ::
          List.map class_declaration rest
        )
    )
  (* For use with [class type a = class_instance_type]. Class type
     declarations/definitions declare the types of instances generated by class
     constructors.
     We have to call self#class_instance_type because self#class_constructor_type
     would add a "new" before the type.
     TODO: TODOATTRIBUTES:
  *)
  method class_type_declaration_list l =
    let class_type_declaration kwd ({pci_params=ls;pci_name;pci_attributes} as x) =
      let opener = match x.pci_virt with
        | Virtual -> kwd ^ " " ^ "virtual"
        | Concrete -> kwd
      in

      let upToName =
        if ls == [] then
          label ~space:true (atom opener) (atom pci_name.txt)
        else
          label
            ~space:true
            (label ~space:true (atom opener) (atom pci_name.txt))
            (self#class_params_def ls)
      in
      let includingEqual = makeList ~postSpace:true [upToName; atom "="] in
      let {stdAttrs; docAttrs} =
        partitionAttributes ~partDoc:true pci_attributes
      in
      let layout =
        self#attach_std_item_attrs stdAttrs @@
        label ~space:true includingEqual (self#class_instance_type x.pci_expr)
      in
      self#attachDocAttrsToLayout
        ~stdAttrs
        ~docAttrs
        ~loc:pci_name.loc
        ~layout
        ()
    in
    match l with
    | [] -> failwith "Should not call class_type_declaration with no classes"
    | [x] -> class_type_declaration "class type" x
    | x :: xs ->
      makeList
        ~break:Always_rec
        ~indent:0
        ~inline:(true, true)
        (
          (class_type_declaration "class type" x)::
          List.map (class_type_declaration "and") xs
        )

  (*
     Formerly the [class_type]
     Notice how class_constructor_type doesn't have any type attributes -
     class_instance_type does.
     TODO: Divide into class_constructor_types that allow arrows and ones
     that don't.
   *)
  method class_constructor_type x =
    match x.pcty_desc with
    | Pcty_arrow _ ->
      let rec allArrowSegments acc = function
        | { pcty_desc = Pcty_arrow (l, ct1, ct2); } ->
            allArrowSegments (self#type_with_label (l, ct1, false) :: acc) ct2
        (* This "new" is unfortunate. See reason_parser.mly for details. *)
        | xx -> (List.rev acc, self#class_constructor_type xx)
      in
      let (params, return) = allArrowSegments [] x in
      let normalized =
        makeList ~break:IfNeed
          ~sep:(Sep "=>")
          ~preSpace:true ~postSpace:true ~inline:(true, true)
        [makeCommaBreakableListSurround "(" ")" params; return]
      in
      source_map ~loc:x.pcty_loc normalized
    | _ ->
      (* Unfortunately, we have to have final components of a class_constructor_type
         be prefixed with the `new` keyword.  Hopefully this is temporary. *)
      self#class_instance_type x

  method non_arrowed_class_constructor_type x =
    match x.pcty_desc with
    | Pcty_arrow _ ->
      source_map ~loc:x.pcty_loc
        (formatPrecedence (self#class_constructor_type x))
    | _ -> self#class_instance_type x

  method class_field x =
    let itm =
      match x.pcf_desc with
      | Pcf_inherit (ovf, ce, so) ->
        let inheritText = ("inherit" ^ override ovf) in
        let inheritExp = self#class_expr ce in
        label
          ~space:true
          (atom inheritText)
          (
            match so with
            | None -> inheritExp;
            | Some s -> label ~space:true inheritExp (atom ("as " ^ s))
          )
      | Pcf_val (s, mf, Cfk_concrete (ovf, e)) ->
        let opening = match mf with
          | Mutable ->
            let mutableName = [atom "mutable"; atom s.txt] in
            label
              ~space:true
              (atom ("val" ^ override ovf))
              (makeList ~postSpace:true ~inline:(false, true) ~break:IfNeed mutableName)
          | Immutable -> label ~space:true (atom ("val" ^ override ovf)) (atom s.txt)
        in
        let valExprAndConstraint = match e.pexp_desc with
          | Pexp_constraint (ex, ct) ->
            let openingWithTypeConstraint = formatTypeConstraint opening (self#core_type ct) in
            label
              ~space:true
              (makeList ~postSpace:true [openingWithTypeConstraint; atom "="])
              (self#unparseExpr ex)
          | _ ->
            label ~space:true (makeList ~postSpace:true [opening; atom "="]) (self#unparseExpr e)
        in
        valExprAndConstraint
      | Pcf_val (s, mf, Cfk_virtual ct) ->
        let opening = match mf with
          | Mutable ->
            let mutableVirtualName = [atom "mutable"; atom "virtual"; atom s.txt] in
            let openingTokens =
              (makeList ~postSpace:true ~inline:(false, true) ~break:IfNeed mutableVirtualName) in
            label ~space:true (atom "val") openingTokens
          | Immutable ->
            let virtualName = [atom "virtual"; atom s.txt] in
            let openingTokens =
              (makeList ~postSpace:true ~inline:(false, true) ~break:IfNeed virtualName) in
            label ~space:true (atom "val") openingTokens
        in
        formatTypeConstraint opening (self#core_type ct)
      | Pcf_method (s, pf, Cfk_virtual ct) ->
        let opening = match pf with
          | Private ->
            let privateVirtualName = [atom "virtual"; atom s.txt] in
            let openingTokens =
              (makeList ~postSpace:true ~inline:(false, true) ~break:IfNeed privateVirtualName) in
            label ~space:true (atom "pri") openingTokens
          | Public ->
            let virtualName = [atom "virtual"; atom s.txt] in
            let openingTokens =
              (makeList ~postSpace:true ~inline:(false, true) ~break:IfNeed virtualName) in
            label ~space:true (atom "pub") openingTokens
        in
        formatTypeConstraint opening (self#core_type ct)
      | Pcf_method (s, pf, Cfk_concrete (ovf, e)) ->
        let methodText =
           let postFix = if ovf == Override then "!" else "" in
           (
           match pf with
           | Private -> "pri" ^ postFix
           | Public -> "pub" ^ postFix
           ) in
        (* Should refactor the binding logic so faking out the AST isn't needed,
           currently, it includes a ton of nuanced logic around recovering explicitly
           polymorphic type definitions, and that furthermore, that representation...
           Actually, let's do it.

           For some reason, concrete methods are only ever parsed as Pexp_poly.
           If there *is* no polymorphic function for the method, then the return
           value of the function is wrapped in a ghost Pexp_poly with [None] for
           the type vars.*)
        (match e.pexp_desc with
          | (Pexp_poly
              ({pexp_desc=Pexp_constraint (methodFunWithNewtypes, nonVarifiedExprType)},
                Some ({ptyp_desc=Ptyp_poly (typeVars, varifiedPolyType)})
              )
            ) when (
              let (leadingAbstractVars, _) =
                self#leadingCurriedAbstractTypes methodFunWithNewtypes in
              self#isRenderableAsPolymorphicAbstractTypes
                typeVars
                (* If even artificially varified. Don't know until this returns*)
                varifiedPolyType
                leadingAbstractVars
                nonVarifiedExprType
          ) ->
            let (leadingAbstractVars, _) =
              self#leadingCurriedAbstractTypes methodFunWithNewtypes in
            self#locallyAbstractPolymorphicFunctionBinding
              methodText
              (atom s.txt)
              methodFunWithNewtypes
              leadingAbstractVars
              nonVarifiedExprType
          | Pexp_poly (e, Some ct) ->
            self#formatSimplePatternBinding methodText (atom s.txt)
              (Some (source_map ~loc:ct.ptyp_loc (self#core_type ct)))
              (self#unparseExprApplicationItems e)
          (* This form means that there is no type constraint - it's a strange node name.*)
          | Pexp_poly (e, None) ->
            self#wrappedBinding methodText ~arrow:"=>" (atom s.txt) [] e
          | _ -> failwith "Concrete methods should only ever have Pexp_poly."
        )
      | Pcf_constraint (ct1, ct2) ->
        label
          ~space:true
          (atom "constraint")
          (
            makeList ~postSpace:true ~inline:(true, false) [
              makeList ~postSpace:true [self#core_type ct1; atom "="];
              self#core_type ct2
            ]
          )
      | Pcf_initializer e ->
        label
          ~space:true
          (atom "initializer")
          (self#simplifyUnparseExpr e)
      | Pcf_attribute a -> self#floating_attribute a
      | Pcf_extension e ->
        (* And don't forget, we still need to print post_item_attributes even for
           this case *)
        self#item_extension e
    in
    source_map ~loc:x.pcf_loc itm

  method class_self_pattern_and_structure {pcstr_self = p; pcstr_fields = l} =
    let fields = List.map self#class_field l in
    (* Recall that by default self is bound to "this" at parse time. You'd
       have to go out of your way to bind it to "_". *)
    match (p.ppat_attributes, p.ppat_desc) with
      | ([], Ppat_var ({txt = "this"})) -> fields
      | _ ->
        let field = label ~space:true (atom "as") (self#pattern p) in
        source_map ~loc:p.ppat_loc field :: fields

  method simple_class_expr x =
    let {stdAttrs} = partitionAttributes x.pcl_attributes in
    if stdAttrs != [] then
      formatSimpleAttributed
        (self#simple_class_expr {x with pcl_attributes=[]})
        (self#attributes stdAttrs)
    else
      let itm =
        match x.pcl_desc with
        | Pcl_constraint (ce, ct) ->
          formatTypeConstraint (self#class_expr ce) (self#class_constructor_type ct)
        (* In OCaml,
          - In the most recent version of OCaml, when in the top level of a
            module, let _ = ... is a PStr_eval.
          - When in a function, it is a Pexp_let PPat_any
          - When in class pre-member let bindings it is a Pcl_let PPat_any

           Reason normalizes all of these to be simple imperative expressions
           with trailing semicolons, *except* in the case of classes because it
           will likely introduce a conflict with some proposed syntaxes for
           objects.
        *)
        | Pcl_let _
        | Pcl_structure _ ->
          let rows = (self#classExprLetsAndRest x) in
          makeList ~wrap:("{", "}") ~inline:(true, false) ~postSpace:true ~break:Always_rec (List.map semiTerminated rows)
        | Pcl_extension e -> self#extension e
        | _ -> formatPrecedence (self#class_expr x)
     in source_map ~loc:x.pcl_loc itm

  method classExprLetsAndRest x =
    match x.pcl_desc with
      | Pcl_structure cs -> self#class_self_pattern_and_structure cs
      | Pcl_let (rf, l, ce) ->
        (* For "letList" bindings, the start/end isn't as simple as with
         * module value bindings. For "let lists", the sequences were formed
         * within braces {}. The parser relocates the first let binding to the
         * first brace. *)
        let binding =
          source_map ~loc:(self#bindingsLocationRange l)
            (self#bindings (rf, l))
        in
        (binding :: self#classExprLetsAndRest ce)
      | _ -> [self#class_expr x]

  method class_expr x =
    let {stdAttrs} = partitionAttributes x.pcl_attributes in
    (* We cannot handle the attributes here. Must handle them in each item *)
    if stdAttrs != [] then
      (* Do not need a "simple" attributes precedence wrapper. *)
      formatAttributed
        (self#simple_class_expr {x with pcl_attributes=[]})
        (self#attributes stdAttrs)
    else
      match x.pcl_desc with
      | Pcl_fun _ ->
        (match self#curriedConstructorPatternsAndReturnVal x with
         | None, _ ->
           (* x just matched Pcl_fun, there is at least one parameter *)
           assert false
         | Some args, e ->
           label ~space:true
             (makeList ~postSpace:true
                [label ~space:true (atom funToken) args; atom "=>"])
             (self#class_expr e))
      | Pcl_apply _ ->
        formatAttachmentApplication applicationFinalWrapping None
         (self#classExpressionToFormattedApplicationItems x, None)
      | Pcl_constr (li, []) ->
        label ~space:true (atom "class") (self#longident_loc li)
      | Pcl_constr (li, l) ->
        label
          (makeList ~postSpace:true [atom "class"; self#longident_loc li])
          (makeTup (List.map self#non_arrowed_non_simple_core_type l))
      | Pcl_constraint _
      | Pcl_extension _
      | Pcl_let _
      | Pcl_structure _ -> self#simple_class_expr x;

  method classStructure ?(forceBreak=false) ?(wrap=("", "")) cs =
    let (left, right) = wrap in
    makeList
      ~sep:(Layout.Sep ";")
      ~wrap:(left ^ "{", "}" ^ right)
      ~break:(if forceBreak then Layout.Always else Layout.IfNeed)
      ~postSpace:true
      ~inline:(true, false)
      (self#class_self_pattern_and_structure cs)

  method signature signatureItems =
    match signatureItems with
    | [] -> atom ""
    | first::_ as signatureItems ->
      let last = match (List.rev signatureItems) with | last::_ -> last | [] -> assert false in
      let loc_start = first.psig_loc.loc_start in
      let loc_end = last.psig_loc.loc_end in
      let items =
        groupAndPrint
          ~xf:self#signature_item
          ~getLoc:(fun x -> x.psig_loc)
          ~comments:self#comments
          signatureItems
      in
      source_map ~loc:{loc_start; loc_end; loc_ghost=false}
        (makeList
           ~postSpace:true
           ~break:Layout.Always_rec
           ~indent:0
           ~inline:(true, false)
           ~sep:(SepFinal (";", ";"))
           items)

  method signature_item x : Layout.t =
    let item: Layout.t =
      match x.psig_desc with
        | Psig_type (rf, l) ->
            self#type_def_list (rf, l)
        | Psig_value vd ->
            if vd.pval_prim != [] then
              self#primitive_declaration vd
            else
              let intro = atom "let" in
              let {stdAttrs; docAttrs} = partitionAttributes ~partDoc:true vd.pval_attributes in
              let layout = self#attach_std_item_attrs stdAttrs
                (formatTypeConstraint
                   (label ~space:true intro
                      (source_map ~loc:vd.pval_name.loc
                         (protectIdentifier vd.pval_name.txt)))
                  (self#core_type vd.pval_type))
              in
              self#attachDocAttrsToLayout
                ~stdAttrs
                ~docAttrs
                ~loc:vd.pval_loc
                ~layout
                ()

        | Psig_typext te ->
            self#type_extension te
        | Psig_exception ed ->
            self#exception_declaration ed
        | Psig_class l ->
            let class_description
                ?(class_keyword=false)
                ({pci_params=ls; pci_name={txt}; pci_loc} as x) =
              let (firstToken, pattern, patternAux) = self#class_opening class_keyword txt x.pci_virt ls in
              let withColon = self#wrapCurriedFunctionBinding
                ~arrow:":"
                ~spaceBeforeArrow:false
                firstToken
                pattern
                patternAux
                ([(self#class_constructor_type x.pci_expr)], None)
              in
              let {stdAttrs; docAttrs} = partitionAttributes ~partDoc:true x.pci_attributes in
              let layout = self#attach_std_item_attrs stdAttrs withColon in
              source_map ~loc:pci_loc
                (self#attachDocAttrsToLayout
                  ~stdAttrs
                  ~docAttrs
                  ~loc:x.pci_name.loc
                  ~layout
                  ())
            in
            makeNonIndentedBreakingList (
              match l with
              | [] -> raise (NotPossible "No recursive class bindings")
              | [x] -> [class_description ~class_keyword:true x]
              | x :: xs ->
                 (class_description ~class_keyword:true x)::
                 (List.map class_description xs)
            )
        | Psig_module {pmd_name; pmd_type={pmty_desc=Pmty_alias alias}; pmd_attributes} ->
            let {stdAttrs; docAttrs} =
              partitionAttributes ~partDoc:true pmd_attributes
            in
            let layout =
              self#attach_std_item_attrs stdAttrs @@
              label ~space:true
                (makeList ~postSpace:true [
                   atom "module";
                   atom pmd_name.txt;
                   atom "="
                 ])
                (self#longident_loc alias)
            in
            self#attachDocAttrsToLayout
              ~stdAttrs
              ~docAttrs
              ~loc:pmd_name.loc
              ~layout
              ()
        | Psig_module pmd ->
            let {stdAttrs; docAttrs} =
              partitionAttributes ~partDoc:true pmd.pmd_attributes
            in
            let letPattern =
              makeList
                [makeList ~postSpace:true [atom "module"; (atom pmd.pmd_name.txt)];
                 atom ":"]
            in
            let layout =
              self#attach_std_item_attrs stdAttrs @@
              (self#module_type letPattern pmd.pmd_type)
            in
            self#attachDocAttrsToLayout
              ~stdAttrs
              ~docAttrs
              ~loc:pmd.pmd_name.loc
              ~layout
              ()
        | Psig_open od ->
          let {stdAttrs; docAttrs} =
            partitionAttributes ~partDoc:true od.popen_attributes
          in
          let layout =
            self#attach_std_item_attrs stdAttrs @@
            label ~space:true
              (atom ("open" ^ (override od.popen_override)))
              (self#longident_loc od.popen_lid)
          in
          self#attachDocAttrsToLayout
            ~stdAttrs
            ~docAttrs
            ~loc:od.popen_lid.loc
            ~layout
            ()
        | Psig_include incl ->
          let {stdAttrs; docAttrs} =
            partitionAttributes ~partDoc:true incl.pincl_attributes
          in
          let layout =
            self#attach_std_item_attrs stdAttrs @@
            (self#module_type (atom "include") incl.pincl_mod)
          in
          self#attachDocAttrsToLayout
            ~stdAttrs
            ~docAttrs
            ~loc:incl.pincl_mod.pmty_loc
            ~layout
            ()
        | Psig_modtype x ->
          let name = atom x.pmtd_name.txt in
          let letPattern = makeList ~postSpace:true [atom "module type"; name; atom "="] in
          let main = match x.pmtd_type with
            | None -> makeList ~postSpace:true [atom "module type"; name]
            | Some mt -> self#module_type letPattern mt
          in
          let {stdAttrs; docAttrs} =
            partitionAttributes ~partDoc:true x.pmtd_attributes
          in
          let layout =
            self#attach_std_item_attrs stdAttrs main
          in
          self#attachDocAttrsToLayout
            ~stdAttrs
            ~docAttrs
            ~loc:x.pmtd_name.loc
            ~layout
            ()
        | Psig_class_type l -> self#class_type_declaration_list l
        | Psig_recmodule decls ->
            let items = List.mapi (fun i xx ->
              let {stdAttrs; docAttrs} =
                partitionAttributes ~partDoc:true xx.pmd_attributes
              in
              let letPattern =
                makeList [
                  makeList ~postSpace:true [
                    atom (if i == 0 then "module rec" else "and");
                    atom xx.pmd_name.txt
                  ];
                 atom ":"
                ]
              in
              let layout =
                self#attach_std_item_attrs stdAttrs
                  (self#module_type ~space:true letPattern xx.pmd_type)
              in
              let layoutWithDocAttrs =
                self#attachDocAttrsToLayout
                 ~stdAttrs
                 ~docAttrs
                 ~loc:xx.pmd_name.loc
                 ~layout
                 ()
              in
              (extractLocModDecl xx, layoutWithDocAttrs)
            ) decls
            in
            makeNonIndentedBreakingList
              (groupAndPrint
                ~xf:(fun (_, layout) -> layout)
                ~getLoc:(fun (loc, _) -> loc)
                ~comments:self#comments
                items)

        | Psig_attribute a -> self#floating_attribute a
        | Psig_extension (({loc}, _) as ext, attrs) ->
          let {stdAttrs; docAttrs} =
            partitionAttributes ~partDoc:true attrs
          in
          let layout =
            self#attach_std_item_attrs stdAttrs (self#item_extension ext)
          in
          self#attachDocAttrsToLayout
            ~stdAttrs
            ~docAttrs
            ~loc
            ~layout
            ()
    in
    source_map ~loc:x.psig_loc item

  method non_arrowed_module_type ?(space=true) letPattern x =
    match x.pmty_desc with
      | Pmty_alias li ->
        label ~space
          letPattern
          (formatPrecedence (label ~space:true (atom "module") (self#longident_loc li)))
      | Pmty_typeof me ->
        let labelWithoutFinalWrap =
          label ~space:true
            (label ~space:true
               letPattern
               (makeList
                  ~inline:(false, false)
                  ~wrap:("(","")
                  ~postSpace:true
                  [atom "module type of"]))
            (self#module_expr me)
        in
        makeList ~wrap:("",")") [labelWithoutFinalWrap]
      | _ -> self#simple_module_type ~space letPattern x

  method simple_module_type ?(space=true) letPattern x =
    match x.pmty_desc with
      | Pmty_ident li -> label ~space letPattern (self#longident_loc li)
      | Pmty_signature s ->
        let items =
          groupAndPrint
          ~xf:self#signature_item
          ~getLoc:(fun x -> x.psig_loc)
          ~comments:self#comments
          s
        in
        let shouldBreakLabel = if List.length s > 1 then `Always else `Auto in
        label
          ~indent:0
          ~break:shouldBreakLabel
          (makeList
            [label
               ~break:shouldBreakLabel
                (makeList
                  ~postSpace:true
                  [letPattern; (atom "{")])
              (source_map
                 ~loc:x.pmty_loc
                 (makeList
                    ~break:(if List.length s > 1 then Always else IfNeed)
                    ~inline:(true, true)
                    ~postSpace:true
                    ~sep:(SepFinal (";", ";"))
                    items))])
          (atom "}")
      | Pmty_extension (s, e) -> label ~space letPattern (self#payload "%" s e)
      | _ ->
        makeList ~break:IfNeed ~wrap:("", ")")
          [self#module_type ~space:false (makeList ~pad:(false,true) ~wrap:("","(") [letPattern]) x]

  method module_type ?(space=true) letPattern x =
    let pmty = match x.pmty_desc with
      | Pmty_functor _ ->
        (* The segments that should be separated by arrows. *)
        let rec extract_args args xx = match xx.pmty_desc with
          | Pmty_functor (_, None, mt2) -> extract_args (`Unit :: args) mt2
          | Pmty_functor (s, Some mt1, mt2) ->
            let arg =
              if s.txt = "_"
              then self#module_type ~space:false (atom "") mt1
              else self#module_type ~space (makeList [(atom s.txt); atom ":"]) mt1
            in
            extract_args (`Arg arg :: args) mt2
          | _ ->
            let prepare_arg = function
              | `Unit -> atom "()"
              | `Arg x -> x
            in
            let args = match args with
              | [`Unit] -> []
              | _ -> List.rev_map prepare_arg args
            in
            (args, self#module_type (atom "") xx)
        in
        let args, ret = extract_args [] x in
        label ~space letPattern
          (makeList
             ~break:IfNeed
             ~sep:(Sep "=>")
             ~preSpace:true
             ~inline:(true, true)
             [makeTup args; ret])

      (* See comments in sugar_parser.mly about why WITH constraints aren't "non
       * arrowed" *)
      | Pmty_with (mt, l) ->
          let modSub atm li2 token = makeList ~postSpace:true [
            atom "module";
            atm;
            atom token;
            self#longident_loc li2
          ] in
          let typeAtom = atom "type" in
          let eqAtom = atom "=" in
          let destrAtom = atom ":=" in
          let with_constraint = function
            | Pwith_type (li, td) ->
                self#formatOneTypeDef
                  typeAtom
                  (makeList ~preSpace:true [(self#longident_loc li)])
                  eqAtom
                  td
            | Pwith_module (li, li2) ->
                modSub (self#longident_loc li) li2 "="
            | Pwith_typesubst td ->
                self#formatOneTypeDef
                  typeAtom
                  (atom ~loc:td.ptype_name.loc td.ptype_name.txt)
                  destrAtom
                  td
            | Pwith_modsubst (s, li2) -> modSub (atom s.txt) li2 ":="
          in
          (match l with
            | [] -> self#module_type ~space letPattern mt
            | _ ->
              label ~space letPattern
                (label ~space:true
                  (makeList ~preSpace:true [self#module_type ~space:false (atom "") mt; atom "with"])
                  (makeList
                     ~break:IfNeed
                     ~inline:(true, true)
                     ~sep:(Sep "and")
                     ~postSpace:true
                     ~preSpace:true
                     (List.map with_constraint l)))
          )
        (* Seems like an infinite loop just waiting to happen. *)
        | _ -> self#non_arrowed_module_type ~space letPattern x
    in
    source_map ~loc:x.pmty_loc pmty

  method simple_module_expr ?(hug=false) x = match x.pmod_desc with
    | Pmod_unpack e ->
        let exprLayout = match e.pexp_desc with
        | Pexp_constraint (e, {ptyp_desc = Ptyp_package(lid, cstrs)}) ->
          formatTypeConstraint
            (makeList ~postSpace:true [atom "val"; (self#unparseExpr e)])
            (self#typ_package ~mod_prefix:false lid cstrs)
        | _ -> makeList ~postSpace:true [atom "val"; (self#unparseExpr e)]
        in formatPrecedence exprLayout
    | Pmod_ident li ->
        ensureSingleTokenSticksToLabel (self#longident_loc li)
    | Pmod_constraint (unconstrainedRet, mt) ->
        let letPattern = makeList [(self#module_expr unconstrainedRet); atom ":"]
        in
        formatPrecedence (self#module_type letPattern mt)
    | Pmod_structure s ->
        let wrap = if hug then ("({", "})") else ("{", "}") in
        let items =
          groupAndPrint
            ~xf:self#structure_item
            ~getLoc:(fun x -> x.pstr_loc)
            ~comments:self#comments
            s
        in
        makeList
          ~break:Always_rec
          ~inline:(true, false)
          ~wrap
          ~postSpace:true
          ~sep:(SepFinal (";", ";"))
          items
    | _ ->
        (* For example, functor application will be wrapped. *)
        formatPrecedence (self#module_expr x)

  method module_expr x =
    match x.pmod_desc with
    | Pmod_functor _ ->
      let (argsList, return) = self#curriedFunctorPatternsAndReturnStruct x in
      (* See #19/20 in syntax.mls - cannot annotate return type at
               the moment. *)
      self#wrapCurriedFunctionBinding funToken ~sweet:true ~arrow:"=>" (makeTup argsList) []
        ([self#moduleExpressionToFormattedApplicationItems return], None)
    | Pmod_apply _ ->
      self#moduleExpressionToFormattedApplicationItems x
    | Pmod_extension (s, e) -> self#payload "%" s e
    | Pmod_unpack _
    | Pmod_ident _
    | Pmod_constraint _
    | Pmod_structure _ -> self#simple_module_expr x


  method structure structureItems =
    match structureItems with
    | [] -> atom ""
    | first::_ as structureItems ->
      let last = match (List.rev structureItems) with | last::_ -> last | [] -> assert false in
      let loc_start = first.pstr_loc.loc_start in
      let loc_end = last.pstr_loc.loc_end in
      let items =
        groupAndPrint
          ~xf:self#structure_item
          ~getLoc:(fun x -> x.pstr_loc)
          ~comments:self#comments
          structureItems
      in
      source_map ~loc:{loc_start; loc_end; loc_ghost = false}
        (makeList
           ~postSpace:true
           ~break:Always_rec
           ~indent:0
           ~inline:(true, false)
           ~sep:(SepFinal (";", ";"))
           items)

  (*
     How do modules become parsed?
     let module (X: sig) = blah;
       Will not parse! (Should just make it parse to let [X:sig =]).
     let module X: sig = blah;
       Becomes Pmod_constraint
     let module X: sig = (blah:sig);
       Becomes Pmod_constraint .. Pmod_constraint
     let module X = blah:typ;
       Becomes Pmod_constraint
     let module X (Y:y) (Z:z):r => Q
       Becomes Pmod_functor...=> Pmod_constraint

     let module X (Y:y) (Z:z):r => (Q:r2)
       Probably becomes Pmod_functor...=> (Pmod_constraint..
       Pmod_constraint)

    let (module X) =
      Is a *completely* different thing (unpacking/packing first class modules).
      We should make sure this is very well distinguished.
      - Just replace all "let module" with a new three letter keyword (mod)?
      - Reserve let (module X) for unpacking first class modules.

    See the notes about how Ppat_constraint become parsed and attempt to unify
    those as well.
  *)

  method let_module_binding prefixText bindingName moduleExpr =
    let (argsList, return) = self#curriedFunctorPatternsAndReturnStruct moduleExpr in (
      match (argsList, return.pmod_desc) with
        (* Simple module with type constraint, no functor args. *)
        | ([], Pmod_constraint (unconstrainedRetTerm, ct)) ->
            let letPattern =
              makeList
                [makeList ~postSpace:true [atom prefixText; bindingName];
                 atom ":"]
            in
            let typeConstraint = self#module_type letPattern ct in
            let includingEqual = makeList ~postSpace:true [typeConstraint; atom "="]
            in
            formatAttachmentApplication applicationFinalWrapping (Some (true, includingEqual))
              ([self#moduleExpressionToFormattedApplicationItems unconstrainedRetTerm], None)

        (* Simple module with type no constraint, no functor args. *)
        | ([], _) ->
          self#formatSimplePatternBinding prefixText bindingName None
            ([self#moduleExpressionToFormattedApplicationItems return], None)
        | (_, _) ->
            (* A functor *)
            let (argsWithConstraint, actualReturn) = (
              match return.pmod_desc with
                (* A functor with constrained return type:
                 *
                 * let module X = (A) (B) : Ret => ...
                 * *)
                | Pmod_constraint (me, ct) ->
                  ([makeTup argsList;
                    self#non_arrowed_module_type (atom ":") ct], me)
                | _ -> ([makeTup argsList], return)
            ) in
            self#wrapCurriedFunctionBinding prefixText ~arrow:"=>"
              (makeList [bindingName; atom " ="]) argsWithConstraint
              ([self#moduleExpressionToFormattedApplicationItems actualReturn], None)
    )

    method class_opening class_keyword name pci_virt ls =
      let firstToken = if class_keyword then "class" else "and" in
      match (pci_virt, ls) with
        (* When no class params, it's a very simple formatting for the
           opener - no breaking. *)
        | (Virtual, []) ->
          (firstToken, atom "virtual", [atom name])
        | (Concrete, []) ->
          (firstToken, atom name, [])
        | (Virtual, _::_) ->
          (firstToken, atom "virtual", [atom name; self#class_params_def ls])
        | (Concrete, _::_) ->
          (firstToken, atom name, [self#class_params_def ls])


  (* TODO: TODOATTRIBUTES: Structure items don't have attributes, but each
     pstr_desc *)
  method structure_item term =
    let item = (
      match term.pstr_desc with
        | Pstr_eval (e, attrs) ->
            let {stdAttrs; jsxAttrs; uncurried} = partitionAttributes attrs in
            if uncurried then Hashtbl.add uncurriedTable e.pexp_loc true;
            let layout = self#attach_std_item_attrs stdAttrs (self#unparseUnattributedExpr e) in
            (* If there was a JSX attribute BUT JSX component wasn't detected,
               that JSX attribute needs to be pretty printed so it doesn't get
               lost *)
            (match jsxAttrs with
            | [] -> layout
            | _::_ ->
              let jsxAttrNodes = List.map self#attribute jsxAttrs in
              makeList ~sep:(Sep " ") (jsxAttrNodes @ [layout]))
        | Pstr_type (_, []) -> assert false
        | Pstr_type (rf, l)  -> (self#type_def_list (rf, l))
        | Pstr_value (rf, l) -> (self#bindings (rf, l))
        | Pstr_typext te -> (self#type_extension te)
        | Pstr_exception ed -> (self#exception_declaration ed)
        | Pstr_module x ->
            let bindingName = atom ~loc:x.pmb_name.loc x.pmb_name.txt in
            self#attach_std_item_attrs x.pmb_attributes @@
            self#let_module_binding "module" bindingName x.pmb_expr
        | Pstr_open od ->
            self#attach_std_item_attrs od.popen_attributes @@
            makeList ~postSpace:true [
              atom ("open" ^ (override od.popen_override));
              self#longident_loc od.popen_lid;
            ]
        | Pstr_modtype x ->
            let name = atom x.pmtd_name.txt in
            let letPattern = makeList ~postSpace:true [atom "module type"; name; atom "="] in
            let main = match x.pmtd_type with
              | None -> makeList ~postSpace:true [atom "module type"; name]
              | Some mt -> self#module_type letPattern mt
            in
            self#attach_std_item_attrs x.pmtd_attributes main
        | Pstr_class l -> self#class_declaration_list l
        | Pstr_class_type l -> self#class_type_declaration_list l
        | Pstr_primitive vd -> self#primitive_declaration vd
        | Pstr_include incl ->
            self#attach_std_item_attrs incl.pincl_attributes @@
            (* Kind of a hack *)
            let moduleExpr = incl.pincl_mod in
            self#moduleExpressionToFormattedApplicationItems
              ~prefix:"include"
              moduleExpr

        | Pstr_recmodule decls -> (* 3.07 *)
            let items = List.mapi (fun i xx ->
              let {stdAttrs; docAttrs} =
                partitionAttributes ~partDoc:true xx.pmb_attributes
              in
              let layout =
                self#attach_std_item_attrs stdAttrs @@
                self#let_module_binding
                  (if i == 0 then "module rec" else "and")
                  (atom xx.pmb_name.txt)
                  xx.pmb_expr
              in
              let layoutWithDocAttrs =
                self#attachDocAttrsToLayout
                 ~stdAttrs
                 ~docAttrs
                 ~loc:xx.pmb_name.loc
                 ~layout
                 ()
              in
              (extractLocModuleBinding xx, layoutWithDocAttrs)
            ) decls
            in
            makeNonIndentedBreakingList
              (groupAndPrint
                ~xf:(fun (_, layout) -> layout)
                ~getLoc:(fun (loc, _) -> loc)
                ~comments:self#comments
                items)
        | Pstr_attribute a -> self#floating_attribute a
        | Pstr_extension ((extension, PStr [item]), a) ->
          begin match item.pstr_desc with
            | Pstr_value (rf, l) -> self#bindings ~extension (rf, l)
            | _ ->
                let {stdAttrs; docAttrs} =
                  partitionAttributes ~partDoc:true a
                in
                let layout =
                  self#attach_std_item_attrs ~extension stdAttrs
                     (self#structure_item item)
                in
                makeList ~inline:(true, true) ~break:Always
                  ((List.map self#attribute docAttrs)@[layout])
          end
        | Pstr_extension (e, a) ->
          (* Notice how extensions have attributes - but not every structure
             item does. *)
          self#attach_std_item_attrs a (self#item_extension e)
    ) in
    source_map ~loc:term.pstr_loc item

  method type_extension te =
    let formatOneTypeExtStandard prepend ({ptyext_path} as te) =
      let name = self#longident_loc ptyext_path in
      let item = self#formatOneTypeExt prepend name (atom "+=") te in
      let {stdAttrs; docAttrs} =
        partitionAttributes ~partDoc:true te.ptyext_attributes
      in
      let layout = self#attach_std_item_attrs stdAttrs item in
      self#attachDocAttrsToLayout
        ~stdAttrs
        ~docAttrs
        ~loc:ptyext_path.loc
        ~layout
        ()
    in
    formatOneTypeExtStandard (atom "type") te

  (* [allowUnguardedSequenceBodies] allows sequence expressions {} to the right of `=>` to not
     be guarded in `{}` braces. *)
  method case_list ?(allowUnguardedSequenceBodies=false) l =
    let rec appendLabelToLast items rhs =
      match items with
        | hd::[] -> (label ~indent:0 ~space:true hd rhs)::[]
        | hd::tl -> hd::(appendLabelToLast tl rhs)
        | [] -> raise (NotPossible "Cannot append to last of nothing")
    in

    let case_row {pc_lhs; pc_guard; pc_rhs} =
      let theOrs = orList pc_lhs in

      (* match x with *)
      (* | AnotherReallyLongVariantName (_, _, _)   *)
      (* | AnotherReallyLongVariantName2 (_, _, _)
           when true => {                           *)

      (*   }                                        *)

      (*<sbi><X>match x with</X>   *)
      (*     <Y>everythingElse</Y> *)
      (*</sbi>                     *)



      (*     ............................................................
             :    each or segment has a spaced list <> that ties its    :
             : bar "|" to its pattern                                   :
             ...:..........................................................:.....
             :  :  each or-patterned match is grouped in SpacedBreakableInline  :
             :  :                                                          :    :
             v  v                                                          v    v
             <sbi><>|<lb><A><>     FirstThingStandalone t =></A></><B>t</B></lb></></sbi>
             <sbi><>|<C>           AnotherReallyLongVariantName (_, _, _)</C></>
             ^    <>|<lb><><lb><D>AnotherReallyLongVariantNam2 (_, _, _)</D>             (label the last in or ptn for or and label it again for arrow)
             :        ^  ^   ^     <E>when true<E></lb> =></><F>{
             :        :  :   :    </F>}</lb></sbi> ^       ^
             :        :  :   :            ^     ^   :      :
             :        :  :   :            :     :   :      :
             :        :  :   :If there is :a WHERE  :      :
             :        :  :   :an extra    :label is :      :
             :        :  :   :inserted bef:ore the  :      :
             :        :  :   :arrow.      :     :   :      :
             :        :  :   :............:.....:...:      :
             :        :  :                :     :          :
             :        :  :                :     :          :
             :        :  :                :     :          :
             :        :  :The left side of:this final label:
             :        :  :uses a list to  :append the arrow:
             :        :  :................:.....:..........:
             :        :                   :     :
             :        :                   :     :
             :        :                   :     :
             :        :Final or segment is:     :
             :        :wrapped in lbl that:     :
             :        :partitions pattern :     :
             :        :and arrow from     :     :
             :        :expression.        :     :
             :        :                   :     :
             :        :...................:     :
             :     [orsWithWhereAndArrowOnLast] :
             :                                  :
             :..................................:
                         [row]

      *)
      let bar xx = makeList ~postSpace:true [atom "|"; xx] in
      let appendWhereAndArrow p = match pc_guard with
        | None -> makeList ~postSpace:true [p; atom "=>"]
        | Some g ->
          (* when x should break as a whole - extra list added around it to make it break as one *)
          let withWhen = label ~space:true p
              (makeList ~break:Layout.Never ~inline:(true, true) ~postSpace:true
                 [label ~space:true (atom "when") (self#unparseExpr g)])
          in
          makeList ~inline:(true, true) ~postSpace:true [withWhen; atom "=>"]
      in
      let rec appendWhereAndArrowToLastOr = function
        | [] -> []
        | hd::tl ->
          let formattedHd = self#pattern hd in
          let formattedHd =
            if tl == [] then appendWhereAndArrow formattedHd else formattedHd
          in
          (formattedHd :: appendWhereAndArrowToLastOr tl)
      in
      let orsWithWhereAndArrowOnLast = appendWhereAndArrowToLastOr theOrs in
      let rhs =
        if allowUnguardedSequenceBodies then
          match (self#under_pipe#letList pc_rhs) with
          (* TODO: Still render a list with located information here so that
               comments (eol) are interleaved *)
          | [hd] -> hd
          (* In this case, we don't need any additional indentation, because there aren't
             wrapping {} which would cause zero indentation to look strange. *)
          | lst -> makeUnguardedLetSequence lst
        else self#under_pipe#unparseExpr pc_rhs
      in
      source_map
        (* Fake shift the location to accommodate for the bar, to make sure
           * the wrong comments don't make their way past the next bar. *)
        ~loc:(expandLocation ~expand:(0, 0) {
            loc_start = pc_lhs.ppat_loc.loc_start;
            loc_end = pc_rhs.pexp_loc.loc_end;
            loc_ghost = false;
          })
        (makeList ~break:Always_rec ~inline:(true, true)
           (List.map bar (appendLabelToLast orsWithWhereAndArrowOnLast rhs)))
    in
    groupAndPrint
      ~xf:case_row
      ~getLoc:(fun {pc_lhs; pc_rhs} -> {pc_lhs.ppat_loc with loc_end = pc_rhs.pexp_loc.loc_end})
      ~comments:self#comments
      l

  (* Formats a list of a single expr param in such a way that the parens of the function or
   * (poly)-variant application and the wrapping of the param stick together when the layout breaks.
   *  Example: `foo({a: 1, b: 2})` needs to be formatted as
   *  foo({
   *    a: 1,
   *    b: 2
   *  })
   *  when the line length dictates breaking. Notice how `({` and `})` 'hug'.
   *  Also see "isSingleArgParenApplication" which determines if
   *  this kind of formatting should happen. *)
  method singleArgParenApplication ?(wrap=("", "")) ?(uncurried=false) es =
    let (lwrap, rwrap) = wrap in
    let lparen = lwrap ^ (if uncurried then  "(. " else "(") in
    let rparen = ")" ^ rwrap in
    match es with
    | [{pexp_attributes = []; pexp_desc = Pexp_record (l, eo)}] ->
      self#unparseRecord ~wrap:(lparen, rparen) l eo
    | [{pexp_attributes = []; pexp_desc = Pexp_tuple l}] ->
      self#unparseSequence ~wrap:(lparen, rparen) ~construct:`Tuple l
    | [{pexp_attributes = []; pexp_desc = Pexp_array l}] ->
      self#unparseSequence ~wrap:(lparen, rparen) ~construct:`Array l
    | [{pexp_attributes = []; pexp_desc = Pexp_object cs}] ->
      self#classStructure ~wrap:(lparen, rparen) cs
    | [{pexp_attributes = []; pexp_desc = Pexp_extension (s, p)}] when s.txt = "bs.obj" ->
      self#formatBsObjExtensionSugar ~wrap:(lparen, rparen) p
    | [({pexp_attributes = []} as exp)] when (is_simple_list_expr exp) ->
          (match view_expr exp with
          | `list xs ->
              self#unparseSequence ~construct:`List ~wrap:(lparen, rparen) xs
          | `cons xs ->
              self#unparseSequence ~construct:`ES6List ~wrap:(lparen, rparen) xs
          | _ -> assert false)
    | _ -> assert false


  method label_x_expression_param (l, e) =
    let term = self#unparseProtectedExpr e in
    let param = match (l, e) with
      | (Nolabel, _) -> term
      | (Labelled lbl, _) when is_punned_labelled_expression e lbl ->
        makeList [atom namedArgSym; term]
      | (Optional lbl, _) when is_punned_labelled_expression e lbl ->
        makeList [atom namedArgSym; label term (atom "?")]
      | (Labelled lbl, _) ->
        label (atom (namedArgSym ^ lbl ^ "=")) term
      | (Optional lbl, _) ->
        label (atom (namedArgSym ^ lbl ^ "=?")) term
    in
    source_map ~loc:e.pexp_loc param

  method label_x_expression_params ?wrap ?(uncurried=false) xs =
    match xs with
      (* function applications with unit as only argument should be printed differently
       * e.g. print_newline(()) should be printed as print_newline() *)
      | [(Nolabel, {pexp_attributes = []; pexp_desc = Pexp_construct ( {txt= Lident "()"}, None)})]
          -> makeList
              ~break:Never
              ?wrap
              [if uncurried then atom "(.)" else atom "()"]

      (* The following cases provide special formatting when there's only one expr_param that is a tuple/array/list/record etc.
       *  e.g. foo({a: 1, b: 2})
       *  becomes ->
       *  foo({
       *    a: 1,
       *    b: 2,
       *  })
       *  when the line-length indicates breaking.
       *)
      | [(Nolabel, exp)] when isSingleArgParenApplication [exp] ->
          self#singleArgParenApplication ?wrap ~uncurried [exp]
      | params ->
          makeTup ?wrap ~uncurried (List.map self#label_x_expression_param params)

  (*
   * Prefix represents an optional layout. When passed it will be "prefixed" to
   * the funExpr. Example, given `bar(x, y)` with prefix `foo`, we get
   * foobar(x,y). When the arguments break, the closing `)` is nicely aligned
   * on the height of the prefix:
   *  foobar(
   *    x,
   *    y,
   *  )  --> notice how `)` sits on the height of `foo` instead of `bar`
   *
   *  ~wrap -> represents optional "wrapping", might be useful in context of jsx
   *  where braces are required:
   * prop={bar(   -> `{` is formatted before the funExpr
   *   x,
   *   y,
   * )}      -> notice how the closing brace hugs: `)}`
   *)
  method formatFunAppl ?(prefix=(atom "")) ?(wrap=("", "")) ~jsxAttrs ~args ~funExpr ~applicationExpr ?(uncurried=false) () =
    let (leftWrap, rightWrap) = wrap in
    let uncurriedApplication = uncurried in
    (* If there was a JSX attribute BUT JSX component wasn't detected,
       that JSX attribute needs to be pretty printed so it doesn't get
       lost *)
    let maybeJSXAttr = List.map self#attribute jsxAttrs in
    let categorizeFunApplArgs args =
      let reverseArgs = List.rev args in
      match reverseArgs with
      | ((_, {pexp_desc = Pexp_fun _}) as callback)::args
          when
            [] == List.filter (fun (_, e) -> match e.pexp_desc with Pexp_fun _ -> true | _ -> false) args
          (* default to normal formatting if there's more than one callback *)
          -> `LastArgIsCallback(callback, List.rev args)
      | _ -> `NormalFunAppl args
    in
    let formattedFunExpr = match funExpr.pexp_desc with
      (* pipe first chain or sharpop chain as funExpr, no parens needed, we know how to parse *)
      | Pexp_apply ({pexp_desc = Pexp_ident {txt = Lident s}}, _)
        when requireNoSpaceFor s ->
        self#unparseExpr funExpr
      | Pexp_field _ -> self#unparseExpr funExpr
      | _ -> self#simplifyUnparseExpr funExpr
    in
    let formattedFunExpr = makeList [prefix; atom leftWrap; formattedFunExpr] in
    begin match categorizeFunApplArgs args with
    | `LastArgIsCallback(callbackArg, args) ->
        (* This is the following case:
         * Thing.map(foo, bar, baz, (abc, z) =>
         *   MyModuleBlah.toList(argument)
         *)
        let (argLbl, cb) = callbackArg in
        let {stdAttrs; uncurried} = partitionAttributes cb.pexp_attributes in
        let cbAttrs = stdAttrs in
        if uncurried then Hashtbl.add uncurriedTable cb.pexp_loc true;
        let (cbArgs, retCb) = self#curriedPatternsAndReturnVal {cb with pexp_attributes = []} in
        let cbArgs = if cbAttrs != [] then
            makeList ~break:IfNeed ~inline:(true, true) ~postSpace:true
              (List.map self#attribute cbAttrs @ cbArgs)
        else makeList cbArgs in
        let theCallbackArg = match argLbl with
          | Optional s -> makeList ([atom namedArgSym; atom s; atom "=?"]@[cbArgs])
          | Labelled s -> makeList ([atom namedArgSym; atom s; atom "="]@[cbArgs])
          | Nolabel -> cbArgs
        in
        let theFunc =
          source_map ~loc:funExpr.pexp_loc
            (makeList
               ~wrap:("", (if uncurriedApplication then "(." else "("))
               [formattedFunExpr])
        in
        let formattedFunAppl = begin match self#letList retCb with
        | [x] ->
          (* force breaks for test assertion style callbacks, e.g.
           *  describe("App", () => test("math", () => Expect.expect(1 + 2) |> toBe(3)));
           * should always break for readability of the tests:
           *  describe("App", () =>
           *    test("math", () =>
           *      Expect.expect(1 + 2) |> toBe(3)
           *    )
           *  );
           *)
          let forceBreak = match funExpr.pexp_desc with
          | Pexp_ident ident when
              let lastIdent = Longident.last ident.txt in
              List.mem lastIdent ["test"; "describe"; "it"; "expect"] -> true
          | _ -> false
          in
          let returnValueCallback =
            makeList
              ~break:(if forceBreak then Always else IfNeed)
              ~wrap:("=> ", ")" ^ rightWrap)
              [x]
          in
          let argsWithCallbackArgs = List.concat [(List.map self#label_x_expression_param args); [theCallbackArg]] in
          let left = label
            theFunc
            (makeList
               ~pad:(uncurriedApplication, false)
               ~wrap:("", " ") ~break:IfNeed ~inline:(true, true) ~sep:(Sep ",") ~postSpace:true
              argsWithCallbackArgs)
          in
          label left returnValueCallback
        | xs ->
          let printWidthExceeded = Reason_heuristics.funAppCallbackExceedsWidth ~printWidth:settings.width ~args ~funExpr () in
          if printWidthExceeded = false then
              (*
               * Thing.map(foo, bar, baz, (abc, z) =>
               *   MyModuleBlah.toList(argument)
               * )
               *
               * To get this kind of formatting we need to construct the following tree:
               * <Label>
               * <left>Thing.map(foo, bar, baz, (abc, z)</left><right>=>
               *   MyModuleBlah.toList(argument)
               * )</right>
               * </Label>
               *
               * where left is
               * <Label><left>Thing.map(</left></right>foo, bar, baz, (abc, z) </right></Label>
               *
               * The <right> part of that label could be a <List> with wrap:("", " ") break:IfNeed inline:(true, true)
               * with items: "foo", "bar", "baz", "(abc, z)", separated by commas.
               *
               * this is also necessary to achieve the following formatting where }) hugs :
               * test("my test", () => {
               *   let x = a + b;
               *   let y = z + c;
               *   x + y
               * });
               *)
            let right =
              source_map ~loc:retCb.pexp_loc
                (makeList ~break:Always_rec ~wrap:("=> {", "})" ^ rightWrap) ~sep:(SepFinal (";", ";")) xs)
            in
            let argsWithCallbackArgs =
              List.map self#label_x_expression_param args @ [theCallbackArg]
            in
            let left = label
                theFunc
                (makeList ~wrap:("", " ") ~break:IfNeed ~inline:(true, true) ~sep:(Sep ",") ~postSpace:true
                   argsWithCallbackArgs)
            in
            label left right
          else
            (* Since the heuristic says the line length is exceeded in this case,
             * we conveniently format everything as
             * <label><left>Thing.map(</left><right><list>
             *   foo,
             *   bar,
             *   baz,
             *   <label> <left>(abc) =></left> <right><list> {
             *     let x = 1;
             *     let y = 2;
             *     x + y
             *   }</list></right></label>
             * )</list></right></label>
            *)
            let args =
              makeList ~break:Always ~wrap:("", ")" ^ rightWrap) ~sep:commaTrail (
                (List.map self#label_x_expression_param args) @
                [label ~space:true (makeList ~wrap:("", " =>") [theCallbackArg])
                   (source_map ~loc:retCb.pexp_loc (makeLetSequence xs))]
              )
            in
            label theFunc args
        end in
        maybeJSXAttr @ [formattedFunAppl]
    | `NormalFunAppl args ->
      let theFunc =
        source_map ~loc:funExpr.pexp_loc formattedFunExpr
      in
      (* reset here only because [function,match,try,sequence] are lower priority *)
      (* The "expression location" might be different than the location of the actual
       * function application because things like surrounding { } expand the
       * parsed location (in body of while loop for example).
       * We recover the most meaningful function application location we can.*)
      let (syntheticApplicationLocation, syntheticArgLoc) = match args with
        | [] -> (funExpr.pexp_loc, funExpr.pexp_loc)
        | _::_ ->
          {funExpr.pexp_loc with loc_end = applicationExpr.pexp_loc.loc_end},
          {funExpr.pexp_loc with loc_start = funExpr.pexp_loc.loc_end; loc_end = applicationExpr.pexp_loc.loc_end}
      in
      let theArgs = self#reset#label_x_expression_params ~wrap:("", rightWrap) ~uncurried args in
      maybeJSXAttr @ [source_map ~loc:syntheticApplicationLocation
                        (label theFunc (source_map ~loc:syntheticArgLoc theArgs))]
    end
end;;

let toplevel_phrase ppf x =
  match x with
  | Ptop_def s -> format_layout ppf (printer#structure s)
  | Ptop_dir _ -> print_string "(* top directives not supported *)"

let case_list ppf x =
  List.iter (format_layout ppf) (printer#case_list x)

(* Convert a Longident to a list of strings.
   E.g. M.Constructor will be ["Constructor"; "M.Constructor"]
   Also support ".Constructor" to specify access without a path.
 *)
let longident_for_arity lid =
  let rec toplevel = function
    | Lident s ->
        [s]
    | Ldot (lid, s) ->
        let append_s x = x ^ "." ^ s in
        s :: (List.map append_s (toplevel lid))
    | Lapply (_,s) ->
        toplevel s in
   match lid with
    | Lident s ->
        ("." ^ s) :: toplevel lid
    | _ ->
        toplevel lid

(* add expilcit_arity to a list of attributes
 *)
let add_explicit_arity loc attributes =
  ({txt="explicit_arity"; loc}, PStr []) ::
  normalized_attributes "explicit_arity" attributes

(* explicit_arity_exists check if expilcit_arity exists
 *)
let explicit_arity_not_exists attributes =
  not (attribute_exists "explicit_arity" attributes)

(* wrap_expr_with_tuple wraps an expression
 * with tuple as a sole argument.
 *)
let wrap_expr_with_tuple exp =
  {exp with pexp_desc = Pexp_tuple [exp]}

(* wrap_pat_with_tuple wraps an pattern
 * with tuple as a sole argument.
 *)
let wrap_pat_with_tuple pat =
  {pat with ppat_desc = Ppat_tuple [pat]}



(* explicit_arity_constructors is a set of constructors that are known to have
 * multiple arguments
 *
 *)

module StringSet = Set.Make(String);;

let built_in_explicit_arity_constructors = ["Some"; "Assert_failure"; "Match_failure"]

let explicit_arity_constructors = StringSet.of_list(built_in_explicit_arity_constructors @ (!configuredSettings).constructorLists)

let add_explicit_arity_mapper super =
  let super_expr = super.Ast_mapper.expr in
  let super_pat = super.Ast_mapper.pat in
  let expr mapper expr =
    let expr =
      match expr with
      | {pexp_desc=Pexp_construct(lid, Some sp);
         pexp_loc;
         pexp_attributes} when
          List.exists
            (fun c -> StringSet.mem c explicit_arity_constructors)
            (longident_for_arity lid.txt) &&
          explicit_arity_not_exists pexp_attributes ->
        {pexp_desc=Pexp_construct(lid, Some (wrap_expr_with_tuple sp));
         pexp_loc;
         pexp_attributes=add_explicit_arity pexp_loc pexp_attributes}
      | x -> x
    in
    super_expr mapper expr
  and pat mapper pat =
    let pat =
      match pat with
      | {ppat_desc=Ppat_construct(lid, Some sp);
         ppat_loc;
         ppat_attributes} when
          List.exists
            (fun c -> StringSet.mem c explicit_arity_constructors)
            (longident_for_arity lid.txt) &&
          explicit_arity_not_exists ppat_attributes ->
        {ppat_desc=Ppat_construct(lid, Some (wrap_pat_with_tuple sp));
         ppat_loc;
         ppat_attributes=add_explicit_arity ppat_loc ppat_attributes}
      | x -> x
    in
    super_pat mapper pat
  in
  { super with Ast_mapper. expr; pat }

let preprocessing_mapper =
  ml_to_reason_swap_operator_mapper
    (escape_stars_slashes_mapper
      (add_explicit_arity_mapper Ast_mapper.default_mapper))

let core_type ppf x =
  format_layout ppf
    (printer#core_type (apply_mapper_to_type x preprocessing_mapper))

let pattern ppf x =
  format_layout ppf
    (printer#pattern (apply_mapper_to_pattern x preprocessing_mapper))

let signature (comments : Comment.t list) ppf x =
  List.iter (fun comment -> printer#trackComment comment) comments;
  format_layout ppf ~comments
    (printer#signature (apply_mapper_to_signature x preprocessing_mapper))

let structure (comments : Comment.t list) ppf x =
  List.iter (fun comment -> printer#trackComment comment) comments;
  format_layout ppf ~comments
    (printer#structure (apply_mapper_to_structure x preprocessing_mapper))

let expression ppf x =
  format_layout ppf
    (printer#unparseExpr (apply_mapper_to_expr x preprocessing_mapper))

let case_list = case_list

end
in
object
  method core_type = Formatter.core_type
  method pattern = Formatter.pattern
  method signature = Formatter.signature
  method structure = Formatter.structure
  (* For merlin-destruct *)
  method toplevel_phrase = Formatter.toplevel_phrase
  method expression = Formatter.expression
  method case_list = Formatter.case_list
end

end
module Reason_toolchain
= struct
#1 "reason_toolchain.ml"
(***********************************************************************)
(*                                                                     *)
(*                                Reason                               *)
(*                                                                     *)
(***********************************************************************)
(*
 * Copyright (c) 2015-present, Facebook, Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *)



(* Entry points in the parser *)

(**
 * Provides a simple interface to the most common parsing entrypoints required
 * by editor/IDE toolchains, preprocessors, and pretty printers.
 *
 * The form of this entrypoint includes more than what the standard OCaml
 * toolchain (oprof/ocamldoc) expects, but is still compatible.
 *
 * [implementation_with_comments] and [interface_with_comments] includes
 * additional information (about comments) suitable for building pretty
 * printers, editor, IDE and VCS integration.
 *
 * The comments include the full text of the comment (typically in between the
 * "(*" and the "*)", as well as location information for that comment.
 *
 * WARNING: The "end" location is one greater than the actual final position!
 * (for both [associatedTextLoc] and [commentLoc]).
 *
 * Currently, the location information for comments is of the form:
 *
 *  (associatedTextLoc)
 *
 * But we should quickly change it to be of the form:
 *
 *  (associatedTextLoc, commentLoc)
 *
 * Where the [commentLoc] is the actual original location of the comment,
 * and the [associatedTextLoc] records the location in the file that the
 * comment is attached to. If [associatedTextLoc] and [commentLoc] are the
 * same, then the comment is "free floating" in that it only attaches to itself.
 * The [Reason] pretty printer will try its best to interleave those comments
 * in the containing list etc. But if [associatedTextLoc] expands beyond
 * the [commentLoc] it means the comment and the AST that is captured by
 * the [associatedTextLoc] are related - where "related" is something
 * this [reason_toolchain] decides (but in short it handles "end of line
 * comments"). Various pretty printers can decide how to preserve this
 * relatedness. Ideally, it would preserve end of line comments, but in the
 * short term, it might merely use that relatedness to correctly attach
 * end of line comments to the "top" of the AST node.
 *
 *    let lst = [
 *
 *    ];   (*    Comment    *)
 *         ----commentLoc-----
 *    ---associatedTextLoc----
 *
 *
 * Ideally that would be formatted as:
 *
 *    let lst = [
 *
 *    ];   (*    Comment    *)
 *
 * Or:
 *
 *    let lst = [ ];   (*    Comment    *)
 *
 *
 * But a shorter term solution would use that [associatedTextLoc] to at least
 * correctly attach the comment to the correct node, even if not "end of line".
 *
 *   (*    Comment    *)
 *   let lst = [ ];
 *)

open Migrate_parsetree
open Ast_404

open Location
open Lexing

module From_current = Convert(OCaml_current)(OCaml_404)
module To_current = Convert(OCaml_404)(OCaml_current)

module S = MenhirLib.General (* Streams *)

module Comment = Reason_comment

let setup_lexbuf use_stdin filename =
  (* Use custom method of lexing from the channel to keep track of the input so that we can
     reformat tokens in the toolchain*)
  let lexbuf =
    match use_stdin with
      | true -> Lexing.from_channel
        stdin
      | false ->
        let file_chan = open_in filename in
        seek_in file_chan 0;
        Lexing.from_channel file_chan
  in
  Location.init lexbuf filename;
  lexbuf


module type Toolchain = sig
  (* Parsing *)
  val core_type_with_comments: Lexing.lexbuf -> (Parsetree.core_type * Reason_comment.t list)
  val implementation_with_comments: Lexing.lexbuf -> (Parsetree.structure * Reason_comment.t list)
  val interface_with_comments: Lexing.lexbuf -> (Parsetree.signature * Reason_comment.t list)

  val core_type: Lexing.lexbuf -> Parsetree.core_type
  val implementation: Lexing.lexbuf -> Parsetree.structure
  val interface: Lexing.lexbuf -> Parsetree.signature
  val toplevel_phrase: Lexing.lexbuf -> Parsetree.toplevel_phrase
  val use_file: Lexing.lexbuf -> Parsetree.toplevel_phrase list

  (* Printing *)
  val print_interface_with_comments: Format.formatter -> (Parsetree.signature * Reason_comment.t list) -> unit
  val print_implementation_with_comments: Format.formatter -> (Parsetree.structure * Reason_comment.t list) -> unit

end

module type Toolchain_spec = sig
  val safeguard_parsing: Lexing.lexbuf ->
    (unit -> ('a * Reason_comment.t list)) -> ('a * Reason_comment.t list)

  type token

  module Lexer_impl: sig
    val init: unit -> unit
    val token: Lexing.lexbuf -> token
    val comments: unit -> (String.t * Location.t) list
  end

  val core_type: Lexing.lexbuf -> Parsetree.core_type
  val implementation: Lexing.lexbuf -> Parsetree.structure
  val interface: Lexing.lexbuf -> Parsetree.signature
  val toplevel_phrase: Lexing.lexbuf -> Parsetree.toplevel_phrase
  val use_file: Lexing.lexbuf -> Parsetree.toplevel_phrase list

  val format_interface_with_comments: (Parsetree.signature * Reason_comment.t list) -> Format.formatter -> unit
  val format_implementation_with_comments: (Parsetree.structure * Reason_comment.t list) -> Format.formatter -> unit
end

let rec left_expand_comment should_scan_prev_line source loc_start =
  if loc_start = 0 then
    (String.unsafe_get source 0, true, 0)
  else
    let c = String.unsafe_get source (loc_start - 1) in
    match c with
    | '\t' | ' ' -> left_expand_comment should_scan_prev_line source (loc_start - 1)
    | '\n' when should_scan_prev_line -> left_expand_comment should_scan_prev_line source (loc_start - 1)
    | '\n' -> (c, true, loc_start)
    | _ -> (c, false, loc_start)

let rec right_expand_comment should_scan_next_line source loc_start =
  if loc_start = String.length source then
    (String.unsafe_get source (String.length source - 1), true, String.length source)
  else
    let c = String.unsafe_get source loc_start in
    match c with
    | '\t' | ' ' -> right_expand_comment should_scan_next_line source (loc_start + 1)
    | '\n' when should_scan_next_line -> right_expand_comment should_scan_next_line source (loc_start + 1)
    | '\n' -> (c, true, loc_start)
    | _ -> (c, false, loc_start)


module Create_parse_entrypoint (Toolchain_impl: Toolchain_spec) :Toolchain = struct

  let buffer_add_lexbuf buf skip lexbuf =
    let bytes = lexbuf.Lexing.lex_buffer in
    let start = lexbuf.Lexing.lex_start_pos + skip in
    let stop = lexbuf.Lexing.lex_buffer_len in
    Buffer.add_subbytes buf bytes start (stop - start)

  let refill_buff buf refill lb =
    let skip = lb.Lexing.lex_buffer_len - lb.Lexing.lex_start_pos in
    let result = refill lb in
    buffer_add_lexbuf buf skip lb;
    result

  (* replaces Lexing.from_channel so we can keep track of the input for comment modification *)
  let keep_from_lexbuf buffer lexbuf =
    buffer_add_lexbuf buffer 0 lexbuf;
    let refill_buff = refill_buff buffer lexbuf.Lexing.refill_buff in
    {lexbuf with refill_buff}

  let wrap_with_comments parsing_fun lexbuf =
    let input_copy = Buffer.create 0 in
    let lexbuf = keep_from_lexbuf input_copy lexbuf in
    Toolchain_impl.safeguard_parsing lexbuf (fun () ->
      let _ = Toolchain_impl.Lexer_impl.init () in
      let ast = parsing_fun lexbuf in
      let unmodified_comments = Toolchain_impl.Lexer_impl.comments() in
      let contents = Buffer.contents input_copy in
      Buffer.reset input_copy;
      if contents = "" then
        let _  = Parsing.clear_parser() in
        let make_regular (text, location) =
          Comment.make ~location Comment.Regular text in
        (ast, List.map make_regular unmodified_comments)
      else
        let rec classifyAndNormalizeComments unmodified_comments =
          match unmodified_comments with
          | [] -> []
          | hd :: tl -> (
              let classifiedTail = classifyAndNormalizeComments tl in
              let (txt, physical_loc) = hd in
              (* When searching for "^" regexp, returns location of newline + 1 *)
              let (stop_char, eol_start, virtual_start_pos) =
                left_expand_comment false contents physical_loc.loc_start.pos_cnum
              in
              if Reason_syntax_util.isLineComment txt then
                let comment = Comment.make
                  ~location:physical_loc
                  (if eol_start then SingleLine else EndOfLine)
                  txt
                in
                comment :: classifiedTail
              else
              let one_char_before_stop_char =
                if virtual_start_pos <= 1 then
                  ' '
                else
                  String.unsafe_get contents (virtual_start_pos - 2)
              in
              (*
               *
               * The following logic are designed for cases like:
               * | (* comment *)
               *   X => 1
               * we want to extend the comment to the next line so it can be
               * correctly attached to X
               *
               * But we don't want it to extend to next line in this case:
               *
               * true || (* comment *)
               *   false
               *
               *)
              let should_scan_next_line = stop_char = '|' &&
                                          (one_char_before_stop_char = ' ' ||
                                           one_char_before_stop_char = '\n' ||
                                           one_char_before_stop_char = '\t' ) in
              let (_, eol_end, virtual_end_pos) = right_expand_comment should_scan_next_line contents physical_loc.loc_end.pos_cnum in
              let end_pos_plus_one = physical_loc.loc_end.pos_cnum in
              let comment_length = (end_pos_plus_one - physical_loc.loc_start.pos_cnum - 4) in
              let original_comment_contents = String.sub contents (physical_loc.loc_start.pos_cnum + 2) comment_length in
              let location = {
                physical_loc with
                loc_start = {physical_loc.loc_start with pos_cnum = virtual_start_pos};
                loc_end = {physical_loc.loc_end with pos_cnum = virtual_end_pos}
              } in
              let just_after loc' =
                loc'.loc_start.pos_cnum == location.loc_end.pos_cnum - 1 &&
                loc'.loc_start.pos_lnum == location.loc_end.pos_lnum
              in
              let category = match (eol_start, eol_end, classifiedTail) with
                | (true, true, _) -> Comment.SingleLine
                | (false, true, _) -> Comment.EndOfLine
                | (false, false, comment :: _)
                  (* End of line comment is one that has nothing but newlines or
                   * other comments its right, and has some AST to the left of it.
                   * For example, there are two end of line comments in:
                   *
                   *    | Y(int, int); /* eol1 */ /* eol2 */
                   *)
                  when Comment.category comment = Comment.EndOfLine
                    && just_after (Comment.location comment) ->
                  Comment.EndOfLine
                | _ -> Comment.Regular
              in
              let comment =
                Comment.make ~location category original_comment_contents
              in
              comment :: classifiedTail
            )
        in
        let modified_and_comment_with_category = classifyAndNormalizeComments unmodified_comments in
        let _  = Parsing.clear_parser() in
        (ast, modified_and_comment_with_category)
    )

  let invalidLex = "invalidCharacter.orComment.orString"

  (*
   * The canonical interface/implementations (with comments) are used with
   * recovering mode for IDE integration. The parser itself likely
   * implements its own recovery, but we need to recover in the event
   * that the file couldn't even lex.
   * Note, the location reported here is broken for some lexing errors
   * (nested comments or unbalanced strings in comments) but at least we don't
   * crash the process. TODO: Report more accurate location in those cases.
   *)
  let implementation_with_comments lexbuf =
    try wrap_with_comments Toolchain_impl.implementation lexbuf
    with err when !Reason_config.recoverable ->
      let loc, msg = match err with
        | Location.Error err -> (err.loc, err.msg)
        | _ ->
          let loc = Location.curr lexbuf in
          match Reason_syntax_util.findMenhirErrorMessage loc with
          | Reason_syntax_util.MenhirMessagesError errMessage ->
            (errMessage.Reason_syntax_util.loc, errMessage.Reason_syntax_util.msg)
          | _ -> (loc, invalidLex)
      in
      let error = Reason_syntax_util.syntax_error_extension_node loc msg in
      ([Ast_helper.Str.mk ~loc (Parsetree.Pstr_extension (error, []))], [])

  let core_type_with_comments lexbuf =
    try wrap_with_comments Toolchain_impl.core_type lexbuf
    with err when !Reason_config.recoverable ->
      let loc, msg = match err with
        | Location.Error err -> (err.loc, err.msg)
        | _ -> (Location.curr lexbuf, invalidLex)
      in
      let error = Reason_syntax_util.syntax_error_extension_node loc msg in
      (Ast_helper.Typ.mk ~loc (Parsetree.Ptyp_extension error), [])

  let interface_with_comments lexbuf =
    try wrap_with_comments Toolchain_impl.interface lexbuf
    with err when !Reason_config.recoverable ->
      let loc, msg = match err with
        | Location.Error err -> (err.loc, err.msg)
        | _ -> (Location.curr lexbuf, invalidLex)
      in
      let error = Reason_syntax_util.syntax_error_extension_node loc msg in
      ([Ast_helper.Sig.mk ~loc (Parsetree.Psig_extension (error, []))], [])

  let toplevel_phrase_with_comments lexbuf =
    wrap_with_comments Toolchain_impl.toplevel_phrase lexbuf

  let use_file_with_comments lexbuf =
    wrap_with_comments Toolchain_impl.use_file lexbuf

  (** [ast_only] wraps a function to return only the ast component
   *)
  let ast_only f =
    (fun lexbuf -> lexbuf |> f |> fst)

  let implementation = ast_only implementation_with_comments

  let core_type = ast_only core_type_with_comments

  let interface = ast_only interface_with_comments

  let toplevel_phrase = ast_only toplevel_phrase_with_comments

  let use_file = ast_only use_file_with_comments

  (* Printing *)
  let print_interface_with_comments formatter interface =
    Toolchain_impl.format_interface_with_comments interface formatter

  let print_implementation_with_comments formatter implementation =
    Toolchain_impl.format_implementation_with_comments implementation formatter
end

module OCaml_syntax = struct
  (* The OCaml parser keep doc strings in the comment list.
     To avoid duplicating comments, we need to filter comments that appear
     as doc strings is the AST out of the comment list. *)
  let doc_comments_filter () =
    let open Ast_mapper in
    let open Parsetree in
    let seen = Hashtbl.create 7 in
    let attribute mapper = function
      | ({ Location. txt = ("ocaml.doc" | "ocaml.text")},
        PStr [{ pstr_desc = Pstr_eval ({ pexp_desc = Pexp_constant (Pconst_string(_text, None)) } , _);
                pstr_loc = loc }]) as attribute ->
        (* Workaround: OCaml 4.02.3 kept an initial '*' in docstrings.
         * For other versions, we have to put the '*' back. *)
        Hashtbl.add seen loc ();
        default_mapper.attribute mapper attribute
      | attribute -> default_mapper.attribute mapper attribute
    in
    let mapper = {default_mapper with attribute} in
    let filter (_text, loc) = not (Hashtbl.mem seen loc) in
    (mapper, filter)

  module Lexer_impl = struct
    let init = Lexer.init
    let token = Lexer.token

    let filtered_comments = ref []
    let filter_comments filter =
      filtered_comments := List.filter filter (Lexer.comments ())
    let comments () = !filtered_comments
  end
  module OCaml_parser = Parser
  type token = OCaml_parser.token

  (* OCaml parser parses into compiler-libs version of Ast.
     Parsetrees are converted to Reason version on the fly. *)

  let parse_and_filter_doc_comments iter fn lexbuf=
    let it, filter = doc_comments_filter () in
    let result = fn lexbuf in
    ignore (iter it result);
    Lexer_impl.filter_comments filter;
    result


  let implementation lexbuf =
    parse_and_filter_doc_comments
      (fun it -> it.Ast_mapper.structure it)
      (fun lexbuf -> From_current.copy_structure
                       (Parser.implementation Lexer.token lexbuf))
      lexbuf

  let core_type lexbuf =
    parse_and_filter_doc_comments
      (fun it -> it.Ast_mapper.typ it)
      (fun lexbuf -> From_current.copy_core_type
                       (Parser.parse_core_type Lexer.token lexbuf))
      lexbuf

  let interface lexbuf =
    parse_and_filter_doc_comments
      (fun it -> it.Ast_mapper.signature it)
      (fun lexbuf -> From_current.copy_signature
                       (Parser.interface Lexer.token lexbuf))
      lexbuf

  let filter_toplevel_phrase it = function
    | Parsetree.Ptop_def str -> ignore (it.Ast_mapper.structure it str)
    | Parsetree.Ptop_dir _ -> ()

  let toplevel_phrase lexbuf =
    parse_and_filter_doc_comments
      filter_toplevel_phrase
      (fun lexbuf -> From_current.copy_toplevel_phrase
          (Parser.toplevel_phrase Lexer.token lexbuf))
      lexbuf

  let use_file lexbuf =
    parse_and_filter_doc_comments
      (fun it result -> List.map (filter_toplevel_phrase it) result)
      (fun lexbuf ->
        List.map
          From_current.copy_toplevel_phrase
          (Parser.use_file Lexer.token lexbuf))
      lexbuf

  (* Skip tokens to the end of the phrase *)
  (* TODO: consolidate these copy-paste skip/trys into something that works for
   * every syntax (also see [Reason_syntax_util]). *)
  let rec skip_phrase lexbuf =
    try
      match Lexer.token lexbuf with
        OCaml_parser.SEMISEMI | OCaml_parser.EOF -> ()
      | _ -> skip_phrase lexbuf
    with
      | Lexer.Error (Lexer.Unterminated_comment _, _)
      | Lexer.Error (Lexer.Unterminated_string, _)
      | Lexer.Error (Lexer.Unterminated_string_in_comment _, _)
      | Lexer.Error (Lexer.Illegal_character _, _) ->
          skip_phrase lexbuf

  let maybe_skip_phrase lexbuf =
    if Parsing.is_current_lookahead OCaml_parser.SEMISEMI
    || Parsing.is_current_lookahead OCaml_parser.EOF
    then ()
    else skip_phrase lexbuf

  let safeguard_parsing lexbuf fn =
    try fn ()
    with
    | Lexer.Error(Lexer.Illegal_character _, _) as err
      when !Location.input_name = "//toplevel//"->
        skip_phrase lexbuf;
        raise err
    | Syntaxerr.Error _ as err
      when !Location.input_name = "//toplevel//" ->
        maybe_skip_phrase lexbuf;
        raise err
    (* Escape error is raised as a general catchall when a syntax_error() is
       thrown in the parser.
     *)
    | Parsing.Parse_error | Syntaxerr.Escape_error ->
        let loc = Location.curr lexbuf in
        if !Location.input_name = "//toplevel//"
        then maybe_skip_phrase lexbuf;
        raise(Syntaxerr.Error(Syntaxerr.Other loc))

  (* Unfortunately we drop the comments because there doesn't exist an ML
   * printer that formats comments *and* line wrapping! (yet) *)
  let format_interface_with_comments (signature, _) formatter =
    Pprintast.signature formatter
      (To_current.copy_signature signature)
  let format_implementation_with_comments (structure, _) formatter =
    let structure =
      Reason_syntax_util.(apply_mapper_to_structure structure remove_stylistic_attrs_mapper)
    in
    Pprintast.structure formatter
      (To_current.copy_structure structure)
end

let insert_completion_ident : Lexing.position option ref = ref None

module Reason_syntax = struct
  module I = Reason_parser.MenhirInterpreter
  module Lexer_impl = struct
    include Reason_lexer
    let init () = init ?insert_completion_ident:!insert_completion_ident ()
  end
  type token = Reason_parser.token

  (* [tracking_supplier] is a supplier that tracks the last token read *)
  type tracking_supplier = {
    (* The last token that was obtained from the lexer, together with its start
       and end positions. Warning: before the first call to the lexer has taken
       place, a None value is stored here. *)

    mutable last_token: (token * Lexing.position * Lexing.position) option;

    (* A supplier function that returns one token at a time*)
    get_token: unit -> (token * Lexing.position * Lexing.position)
  }

  (* [lexbuf_to_supplier] returns a supplier to be feed into Menhir's incremental API.
   * Each time the supplier is called, a new token in the lexbuf is returned.
   * If the supplier is called after an EOF is already returned, a syntax error will be raised.
   *
   * This makes sure at most one EOF token is returned by supplier, which
   * is the default behavior of ocamlyacc.
  *)
  let lexbuf_to_supplier lexbuf =
    let s = I.lexer_lexbuf_to_supplier Reason_lexer.token lexbuf in
    let eof_met = ref false in
    let get_token = fun () ->
      let (token, s, e) = s () in
      if token = Reason_parser.EOF then
        if not !eof_met then
          let _ = eof_met := true in
          (token, s, e)
        else
          raise(Syntaxerr.Error(Syntaxerr.Other (Location.curr lexbuf)))
      else
        (token, s, e)
    in
    let last_token = None in
    {last_token; get_token}

  let read supplier =
    let t = supplier.get_token () in
    supplier.last_token <- Some t;
    t

  let last_token supplier =
    match supplier.last_token with
    | Some (t, _, _) -> t
    | None -> assert false

  (* read last token's location from a supplier *)
  let last_token_loc supplier =
    match supplier.last_token with
    | Some (_, s, e) ->
      {
        loc_start = s;
        loc_end = e;
        loc_ghost = false;
      }
    | None -> assert false

  (* get the stack of a checkpoint *)
  let stack checkpoint =
    match checkpoint with
    | I.HandlingError env ->
      I.stack env
    | _ ->
      assert false

  (* get state number of a checkpoint *)
  let state checkpoint : int =
    match Lazy.force (stack checkpoint) with
    | S.Nil ->
      0
    | S.Cons (I.Element (s, _, _, _), _) ->
      I.number s

  (* [loop_handle_yacc] mimic yacc's error handling mechanism in menhir.
     When it hits an error state, it pops up the stack until it finds a
     state when the error can be shifted or reduced.

     This is similar to Menhir's default behavior for error handling, with
     one subtle difference:
     When loop_handle_yacc recovers from the error, unlike Menhir, it doesn't
     discard the input token immediately. Instead, it restarts the parsing
     from recovered state with the original lookahead token that caused the
     error. If there is still an error, the look ahead token is then discarded.

     yacc's behavior gives us a chance to recover the following code :
     ```
     {
       let a = 1;
       Js.
     }
     ```
     , where "}" is the lookahead token that triggers an error state. With
     yacc's behavior, "}" will still be shifted once we recover from "Js.",
     giving the parser the ability to reduce the whole program to a sequence
     expression.
  *)

  let rec normalize_checkpoint = function
    | I.Shifting _ | I.AboutToReduce _ as checkpoint ->
      normalize_checkpoint (I.resume checkpoint)
    | checkpoint -> checkpoint

  (* Simply submit a token to the parser *)
  let offer_normalize checkpoint triple =
    normalize_checkpoint (I.offer checkpoint triple)

  let offer_normalize_many checkpoint triples =
    let rec loop acc xs = match xs with
    | [] -> Some acc
    | triple :: xs ->
      begin match normalize_checkpoint (I.offer acc triple) with
      | I.InputNeeded _ as checkpoint' -> loop checkpoint' xs
      | _ -> None
      end
    in
    loop checkpoint triples

  (* Insert a semicolon before submitting a token to the parser *)
  let try_inserting_semi_on = function
    | Reason_parser.LET
    | Reason_parser.TYPE
    | Reason_parser.MODULE
    | Reason_parser.OPEN
    | Reason_parser.EXCEPTION
    | Reason_parser.INCLUDE
    | Reason_parser.DOCSTRING _
    | Reason_parser.LIDENT _
    | Reason_parser.UIDENT _
    | Reason_parser.IF
    | Reason_parser.WHILE
    | Reason_parser.FOR
    | Reason_parser.SWITCH
    | Reason_parser.TRY
    | Reason_parser.ASSERT
    | Reason_parser.LAZY
    | Reason_parser.LBRACKETAT -> true
    | _ -> false

  let try_inserting_semi checkpoint ((_, pos, _) as triple) =
    match offer_normalize checkpoint (Reason_parser.SEMI, pos, pos) with
    | I.InputNeeded _ as checkpoint' ->
      Some (offer_normalize checkpoint' triple)
    | _ -> None

  let try_inserting_label_on = function
    | Reason_parser.INFIXOP0 s when s.[0] == '=' ->
        let is_optional = String.length s > 1 && s.[1] == '?' in
        let idx = if is_optional then 2 else 1 in
        let operator = String.sub s idx (String.length s - idx) in
        let token = match operator with
        | "-" -> Some Reason_parser.MINUS
        | "-." -> Some Reason_parser.MINUSDOT
        | "+" -> Some Reason_parser.PLUS
        | "+." -> Some Reason_parser.PLUSDOT
        | "!" -> Some Reason_parser.BANG
        | _ -> None
        in
        token, is_optional
    | _ -> None, false

  let try_inserting_equal_unary checkpoint (_, pos, _) ~optional token =
    match offer_normalize checkpoint (Reason_parser.EQUAL, pos, pos) with
    | I.InputNeeded _ as checkpoint' ->
        if optional then
          match offer_normalize checkpoint' (Reason_parser.QUESTION, pos, pos) with
          | I.InputNeeded _ as checkpoint'' ->
            Some (offer_normalize checkpoint'' (token, pos, pos))
          | _ -> None
        else
          Some (offer_normalize checkpoint' (token, pos, pos))
    | _ -> None

  let try_inserting_postfix checkpoint infix ((_, pos, _) as triple) =
    (* we know that the infix was exclusively composed of '^' *)
    let rec mk_postfixes acc i =
      if i < 0 then
        acc
      else
        let triple = (Reason_parser.POSTFIXOP "^", pos, pos) in
        mk_postfixes (triple :: acc) (i - 1)
    in
    let infixes = mk_postfixes [] (String.length infix - 1) in
    match offer_normalize_many checkpoint infixes with
    | Some (I.InputNeeded _ as checkpoint') ->
        Some (offer_normalize checkpoint' triple)
    | _ -> None

  (* Offer and insert a semicolon in case of failure *)
  let offer_normalize checkpoint triple =
    match offer_normalize checkpoint triple with
    | I.HandlingError _ as error_checkpoint ->
      (* About to enter error state:
         if the token is the beginning of an item (LET, TYPE, ...), try
         inserting a SEMICOLON, otherwise return the checkpoint to the caller.
      *)
      let (token, _, _) = triple in
      if try_inserting_semi_on token then
        match try_inserting_semi checkpoint triple with
          | Some (I.InputNeeded _ as checkpoint') -> checkpoint'
          | Some _ | None -> error_checkpoint
      else begin match try_inserting_label_on token with
        | Some tokn, optional ->
          begin match try_inserting_equal_unary ~optional checkpoint triple tokn with
            | Some (I.InputNeeded _ as checkpoint') -> checkpoint'
            | Some _ | None -> error_checkpoint
          end
        | None, _ -> error_checkpoint
      end
    | checkpoint -> checkpoint

  let commit_invalid_docstrings = function
    | [] -> ()
    | docstrings ->
      let process_invalid_docstring (text, loc) = Reason_lexer.add_invalid_docstring text loc in
      List.iter process_invalid_docstring (List.rev docstrings)

  let custom_error supplier env =
    let loc = last_token_loc supplier in
    let token = match supplier.last_token with
      | Some token -> token
      | None -> assert false
    in
    let state = I.current_state_number env in
    (* Check the error database to see what's the error message
    associated with the current parser state  *)
    let msg = Reason_parser_explain.message env token in
    let msg_with_state = Printf.sprintf "%d: %s" state msg in
    raise (Reason_syntax_util.Error (loc, (Reason_syntax_util.Syntax_error msg_with_state)))

  let rec handle_other supplier checkpoint =
    match checkpoint with
    | I.InputNeeded env ->
      (* An input needed in the "other" case means we are recovering from an error *)
      begin match supplier.last_token with
        | None -> assert false
        | Some triple ->
          (* We just recovered from the error state, try the original token again *)
          let checkpoint_with_previous_token = I.offer checkpoint triple in
          let checkpoint = try match I.shifts checkpoint_with_previous_token with
            | None -> checkpoint
              (* The original token still fail to be parsed, discard *)
            | Some _ -> normalize_checkpoint checkpoint_with_previous_token
          with
          | Syntaxerr.Error _ as exn -> raise exn
          | Syntaxerr.Escape_error -> custom_error supplier env
          in
          handle_inputs_needed supplier [([], checkpoint)]
      end

    | I.HandlingError env when !Reason_config.recoverable ->
      let loc = last_token_loc supplier in
      begin match Reason_syntax_util.findMenhirErrorMessage loc with
        | Reason_syntax_util.MenhirMessagesError _ -> ()
        | Reason_syntax_util.NoMenhirMessagesError ->
          let token = match supplier.last_token with
            | Some token -> token
            | None -> assert false
          in
          let msg = Reason_parser_explain.message env token in
          Reason_syntax_util.add_error_message Reason_syntax_util.{loc = loc; msg = msg};
      end;
      let checkpoint = I.resume checkpoint in
      (* Enter error recovery state *)
      handle_other supplier checkpoint

    | I.HandlingError env as error_checkpoint ->
      (* If not in a recoverable state, resume just enough to be able to
       * catch a nice error message above. *)
      let token = last_token supplier in
      if Hashtbl.mem Reason_lexer.reverse_keyword_table token then
        custom_error supplier env
      else
        let cp = I.resume error_checkpoint in
        handle_other supplier (normalize_checkpoint cp)
    | I.Rejected ->
      let loc = last_token_loc supplier in
      raise Syntaxerr.(Error(Syntaxerr.Other loc))

    | I.Accepted v ->
      (* The parser has succeeded and produced a semantic value. *)
      v

    | I.Shifting _ | I.AboutToReduce _ ->
      handle_other supplier (normalize_checkpoint checkpoint)

  and handle_inputs_needed supplier checkpoints =
    match read supplier with
    (* ES6_FUN token marks a possible fork point *)
    | Reason_parser.ES6_FUN, _, _ as triple ->
      let process_checkpoint (invalid_docstrings, checkpoint as x) tl =
        match offer_normalize checkpoint triple with
        | I.HandlingError _ -> x :: tl
        | checkpoint' -> x :: (invalid_docstrings, checkpoint') :: tl
      in
      handle_inputs_needed supplier (List.fold_right process_checkpoint checkpoints [])

    | Reason_parser.DOCSTRING text, loc_start, loc_end as triple ->
      let process_checkpoint (invalid_docstrings, checkpoint) =
        match offer_normalize checkpoint triple with
        | I.HandlingError _ ->
          (* DOCSTRING at an invalid position: store it and add it back to
           * comments if this checkpoint is "committed"
           * TODO: print warning? *)
          let invalid_docstring = (text, { Location. loc_ghost = false; loc_start; loc_end }) in
          (invalid_docstring :: invalid_docstrings, checkpoint)
        | checkpoint' -> (invalid_docstrings, checkpoint')
      in
      handle_inputs_needed supplier (List.map process_checkpoint checkpoints)

    (*
     * This catches the `foo^^` case (which the parser thinks is an error – infix
     * without 2nd operand) and inserts as many postfix ops as there are carets
     * in the operator. We catch the token here and don't actually fork checkpoints
     * because catching this in `handle_other` would be too late – we would only
     * see the token where the error was (e.g. semicolon).
     *)
    | Reason_parser.INFIXOP1 op, _, _ as triple
      when List.for_all (fun x -> x == '^') (Reason_syntax_util.explode_str op) ->
      let rec process_checkpoints inputs_needed checkpoints =
        match checkpoints with
        | [] -> handle_inputs_needed supplier inputs_needed
        | (invalid_docstrings, checkpoint) :: tl ->
          begin match offer_normalize checkpoint triple with
          | I.InputNeeded _ as checkpoint' ->
            let next_triple = read supplier in
            begin match offer_normalize checkpoint' next_triple with
            | I.HandlingError _ ->
              begin match try_inserting_postfix checkpoint op next_triple with
              | Some (I.Accepted _ as cp) -> handle_other supplier cp
              | Some cp ->
                process_checkpoints ((invalid_docstrings, cp) :: inputs_needed) tl
              | None ->
                process_checkpoints ((invalid_docstrings, checkpoint') :: inputs_needed) tl
              end
            | checkpoint'' ->
              process_checkpoints ((invalid_docstrings, checkpoint'') :: inputs_needed) tl
            end
          | checkpoint' ->
              process_checkpoints ((invalid_docstrings, checkpoint') :: inputs_needed) tl
          end
      in
      process_checkpoints [] checkpoints

    | triple ->
      begin match checkpoints with
        | [] -> assert false
        | [docstrings, checkpoint] ->
          begin match offer_normalize checkpoint triple with
            | I.InputNeeded _ as checkpoint' ->
              handle_inputs_needed supplier [docstrings, checkpoint']
            | checkpoint ->
              commit_invalid_docstrings docstrings;
              handle_other supplier checkpoint
          end
        | checkpoints ->
          let rec process_checkpoints inputs_needed others = function
            |  (docstrings, checkpoint) :: xs ->
              begin match offer_normalize checkpoint triple with
                | I.Accepted _ as other ->
                  commit_invalid_docstrings docstrings;
                  handle_other supplier other
                | I.InputNeeded _ as checkpoint' ->
                  process_checkpoints ((docstrings, checkpoint') :: inputs_needed) others xs
                | other -> process_checkpoints inputs_needed ((docstrings, other) :: others) xs
              end
            | [] ->
              match List.rev inputs_needed with
              | [] ->
                begin match List.rev others with
                  | (docstrings, checkpoint) :: _ ->
                    commit_invalid_docstrings docstrings;
                    handle_other supplier checkpoint
                  | [] -> assert false
                end
              | inputs_needed -> handle_inputs_needed supplier inputs_needed
          in
          process_checkpoints [] [] checkpoints
      end

  let initial_run constructor lexbuf =
    let checkpoint = constructor lexbuf.lex_curr_p in
    let supplier = lexbuf_to_supplier lexbuf in
    match normalize_checkpoint checkpoint with
    | I.InputNeeded _ as checkpoint ->
      handle_inputs_needed supplier [[], checkpoint]
    | other -> handle_other supplier other

  let implementation lexbuf =
    initial_run Reason_parser.Incremental.implementation lexbuf

  let interface lexbuf =
    initial_run Reason_parser.Incremental.interface lexbuf

  let core_type lexbuf =
    initial_run Reason_parser.Incremental.parse_core_type lexbuf

  let toplevel_phrase lexbuf =
    initial_run Reason_parser.Incremental.toplevel_phrase lexbuf

  let use_file lexbuf =
    initial_run Reason_parser.Incremental.use_file lexbuf

  (* Skip tokens to the end of the phrase *)
  let rec skip_phrase lexbuf =
    try
      match Lexer_impl.token lexbuf with
        Reason_parser.SEMI | Reason_parser.EOF -> ()
      | _ -> skip_phrase lexbuf
    with
    | Lexer_impl.Error (Lexer_impl.Unterminated_comment _, _)
    | Lexer_impl.Error (Lexer_impl.Unterminated_string, _)
    | Lexer_impl.Error (Lexer_impl.Unterminated_string_in_comment _, _)
    | Lexer_impl.Error (Lexer_impl.Illegal_character _, _) -> skip_phrase lexbuf

  let maybe_skip_phrase lexbuf =
    if Parsing.is_current_lookahead Reason_parser.SEMI
    || Parsing.is_current_lookahead Reason_parser.EOF
    then ()
    else skip_phrase lexbuf

  let safeguard_parsing lexbuf fn =
    try fn ()
    with
    | Lexer_impl.Error(Lexer_impl.Illegal_character _, _) as err
      when !Location.input_name = "//toplevel//"->
      skip_phrase lexbuf;
      raise err
    | Syntaxerr.Error _ as err
      when !Location.input_name = "//toplevel//" ->
      maybe_skip_phrase lexbuf;
      raise err
    | Parsing.Parse_error | Syntaxerr.Escape_error ->
      let loc = Location.curr lexbuf in
      if !Location.input_name = "//toplevel//"
      then maybe_skip_phrase lexbuf;
      raise(Syntaxerr.Error(Syntaxerr.Other loc))
    | Error _ as x ->
      let loc = Location.curr lexbuf in
      if !Location.input_name = "//toplevel//"
      then
        let _ = maybe_skip_phrase lexbuf in
        raise(Syntaxerr.Error(Syntaxerr.Other loc))
      else
        raise x
    | x -> raise x

  let format_interface_with_comments (signature, comments) formatter =
    let reason_formatter = Reason_pprint_ast.createFormatter () in
    reason_formatter#signature comments formatter signature
  let format_implementation_with_comments (implementation, comments) formatter =
    let reason_formatter = Reason_pprint_ast.createFormatter () in
    reason_formatter#structure comments formatter implementation
end

module ML = Create_parse_entrypoint (OCaml_syntax)
module RE = Create_parse_entrypoint (Reason_syntax)

end
module Reason_implementation_printer : sig 
#1 "reason_implementation_printer.mli"
include Printer_maker.PRINTER

end = struct
#1 "reason_implementation_printer.ml"
open Migrate_parsetree
open Ast_404

type t = Parsetree.structure
let err = Printer_maker.err

(* Note: filename should only be used with .ml files. See reason_toolchain. *)
let defaultImplementationParserFor use_stdin filename =
  let open Reason_toolchain in
  let (theParser, parsedAsML) =
    if Filename.check_suffix filename ".re"
    then (RE.implementation_with_comments, false)
    else if Filename.check_suffix filename ".ml"
    then (ML.implementation_with_comments, true)
    else err ("Cannot determine default implementation parser for filename '" ^ filename ^ "'.")
  in
  theParser (setup_lexbuf use_stdin filename), parsedAsML, false

let parse ~use_stdin filetype filename =
  let ((ast, comments), parsedAsML, parsedAsInterface) =
  (match filetype with
  | `Auto -> defaultImplementationParserFor use_stdin filename
  | `BinaryReason -> Printer_maker.reasonBinaryParser use_stdin filename
  | `Binary -> Printer_maker.ocamlBinaryParser use_stdin filename
  | `ML ->
          let lexbuf = Reason_toolchain.setup_lexbuf use_stdin filename in
          let impl = Reason_toolchain.ML.implementation_with_comments in
          (impl lexbuf, true, false)
  | `Reason ->
          let lexbuf = Reason_toolchain.setup_lexbuf use_stdin filename in
          let impl = Reason_toolchain.RE.implementation_with_comments in
          (impl lexbuf, false, false))
  in
  if parsedAsInterface then
    err "The file parsed does not appear to be an implementation file."
  else
    ((ast, comments), parsedAsML)

let print printtype filename parsedAsML output_chan output_formatter =
  match printtype with
  | `BinaryReason -> fun (ast, comments) -> (
    (* Our special format for interchange between reason should keep the
     * comments separate.  This is not compatible for input into the
     * ocaml compiler - only for input into another version of Reason. We
     * also store whether or not the binary was originally *parsed* as an
     * interface file.
     *)
    output_value output_chan (
      Config.ast_impl_magic_number, filename, ast, comments, parsedAsML, false
    );
  )
  | `Binary -> fun (ast, _) ->
    let ast =
      Reason_syntax_util.(apply_mapper_to_structure ast remove_stylistic_attrs_mapper)
    in
    Ast_io.to_channel output_chan filename
      (Ast_io.Impl ((module OCaml_current),
                    Reason_toolchain.To_current.copy_structure ast))
  | `AST -> fun (ast, _) -> (
    Printast.implementation output_formatter
      (Reason_toolchain.To_current.copy_structure ast)
  )
  (* If you don't wrap the function in parens, it's a totally different
   * meaning #thanksOCaml *)
  | `None -> (fun _ -> ())
  | `ML -> Reason_toolchain.ML.print_implementation_with_comments output_formatter
  | `Reason -> Reason_toolchain.RE.print_implementation_with_comments output_formatter

end
module Reason_interface_printer : sig 
#1 "reason_interface_printer.mli"
include Printer_maker.PRINTER

end = struct
#1 "reason_interface_printer.ml"
open Migrate_parsetree
open Ast_404

type t = Parsetree.signature
let err = Printer_maker.err

(* Note: filename should only be used with .mli files. See reason_toolchain. *)
let defaultInterfaceParserFor use_stdin filename =
  let open Reason_toolchain in
  let (theParser, parsedAsML) =
    if Filename.check_suffix filename ".rei"
    then (RE.interface_with_comments, false)
    else if Filename.check_suffix filename ".mli"
    then (ML.interface_with_comments, true)
    else err ("Cannot determine default interface parser for filename '" ^ filename ^ "'.")
  in
  theParser (setup_lexbuf use_stdin filename), parsedAsML, true

let parse ~use_stdin filetype filename =
  let ((ast, comments), parsedAsML, parsedAsInterface) =
  (match filetype with
  | `Auto -> defaultInterfaceParserFor use_stdin filename
  | `BinaryReason -> Printer_maker.reasonBinaryParser use_stdin filename
  | `Binary -> Printer_maker.ocamlBinaryParser use_stdin filename
  | `ML ->
          let lexbuf = Reason_toolchain.setup_lexbuf use_stdin filename in
          let intf = Reason_toolchain.ML.interface_with_comments in
          ((intf lexbuf), true, true)
  | `Reason ->
          let lexbuf = Reason_toolchain.setup_lexbuf use_stdin filename in
          let intf = Reason_toolchain.RE.interface_with_comments in
          ((intf lexbuf), false, true))
  in
  if not parsedAsInterface then
    err "The file parsed does not appear to be an interface file."
  else ((ast, comments), parsedAsML)

let print printtype filename parsedAsML output_chan output_formatter =
  match printtype with
  | `BinaryReason -> fun (ast, comments) -> (
    (* Our special format for interchange between reason should keep the
     * comments separate.  This is not compatible for input into the
     * ocaml compiler - only for input into another version of Reason. We
     * also store whether or not the binary was originally *parsed* as an
     * interface file.
     *)
    output_value output_chan (
      Config.ast_intf_magic_number, filename, ast, comments, parsedAsML, true
    );
  )
  | `Binary -> fun (ast, _) -> (
      Ast_io.to_channel output_chan filename
        (Ast_io.Intf ((module OCaml_current),
                      Reason_toolchain.To_current.copy_signature ast))
  )
  | `AST -> fun (ast, _) -> (
      Printast.interface output_formatter
        (Reason_toolchain.To_current.copy_signature ast)
  )
  (* If you don't wrap the function in parens, it's a totally different
   * meaning #thanksOCaml *)
  | `None -> (fun _ -> ())
  | `ML -> Reason_toolchain.ML.print_interface_with_comments output_formatter
  | `Reason -> Reason_toolchain.RE.print_interface_with_comments output_formatter

end
module Vendored_cmdliner : sig 
#1 "vendored_cmdliner.mli"
(*---------------------------------------------------------------------------
   Copyright (c) 2011 Daniel C. Bünzli. All rights reserved.
   Distributed under a BSD3 license, see license at the end of the file.
   cmdliner release 0.9.8
  ---------------------------------------------------------------------------*)

(** Declarative definition of command line interfaces.

    [Cmdliner] provides a simple and compositional mechanism
    to convert command line arguments to OCaml values and pass them to
    your functions. The module automatically handles syntax errors,
    help messages and UNIX man page generation. It supports programs
    with single or multiple commands
    (like [darcs] or [git]) and respect most of the
    {{:http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.html}
    POSIX} and
    {{:http://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html}
    GNU} conventions.

    Consult the {{!basics}basics}, details about the supported
    {{!cmdline}command line syntax} and {{!examples} examples} of
    use. Open the module to use it, it defines only three modules in
    your scope.

    {e Release 0.9.8 - Daniel Bünzli <daniel.buenzl i\@erratique.ch> } *)

(** {1:top Interface} *)

(** Man page specification.

    Man page generation is automatically handled by [Cmdliner]. The
    {!block} type is used to define a man page's content.

    The {!print} function can be useful if the client wants to define
    other man pages (e.g. to implement a help command). *)
module Manpage : sig

  (** {1:man Man pages} *)

  type block =
    [ `S of string | `P of string | `Pre of string | `I of string * string
    | `Noblank ]
  (** The type for a block of man page text.

      {ul
      {- [`S s] introduces a new section [s].}
      {- [`P t] is a new paragraph with text [t].}
      {- [`Pre t] is a new preformatted paragraph with text [t].}
      {- [`I (l,t)] is an indented paragraph with label
      [l] and text [t].}
      {- [`Noblank] suppresses the blank line introduced between two blocks.}}

      Except in [`Pre], whitespace and newlines are not significant
      and are all collapsed to a single space. In labels [l] and text
      strings [t], the syntax ["$(i,italic text)"] and ["$(b,bold
      text)"] can be used to respectively produce italic and bold
      text. *)

  type title = string * int * string * string * string
  (** The type for man page titles. Describes the man page
      [title], [section], [center_footer], [left_footer], [center_header]. *)

  type t = title * block list
  (** The type for a man page. A title and the page text as a list of blocks. *)

  val print : ?subst:(string -> string) ->
    [`Pager | `Plain | `Groff ] -> Format.formatter -> t -> unit
  (** [print ~subst fmt ppf page] prints [page] on [ppf] in the format [fmt].
      If [fmt] is [`Pager] the function tries to write the formatted
      result in a pager, if that fails the format [`Plain] is written
      on [ppf]. [subst] can be used to perform variable substitution,
      see {!Buffer.add_substitute} (defaults to the identity). *)
end

(** Terms.

    A term is evaluated by a program to produce a {{!result}result}.
    A term made of terms referring to {{!Arg}command line arguments}
    implicitly defines a command line syntax. *)
module Term : sig

  (** {1:terms Terms} *)

  type +'a t
  (** The type for terms evaluating to values of type 'a. *)

  val const : 'a -> 'a t
  (** [const v] is a term that evaluates to [v]. *)

  (**/**)
  val pure : 'a -> 'a t
  (** @deprecated use {!const} instead. *)
  (**/**)

  val ( $ ) : ('a -> 'b) t -> 'a t -> 'b t
  (** [f $ v] is a term that evaluates to the result of applying
      the evaluation of [v] to the one of [f]. *)

  val app : ('a -> 'b) t -> 'a t -> 'b t
  (** [app] is {!($)}. *)

  type 'a ret =
    [ `Help of [`Pager | `Plain | `Groff] * string option
    | `Error of (bool * string)
    | `Ok of 'a ]
  (** The type for command return values. See {!ret}. *)

  val ret : 'a ret t -> 'a t
  (** [ret v] is a term whose evaluation depends on the case
      to which [v] evaluates. With :
      {ul
      {- [`Ok r], it evaluates to [r].}
      {- [`Error (usage,e)], the evaluation fails and [Cmdliner] prints
         the error [e] and the term's usage if [usage] is [true].}
      {- [`Help (format, name)], the evaluation fails and [Cmdliner] prints the
         term's man page in the given [format] (or the man page for a
         specific [name] term in case of multiple term evaluation).}}   *)

  val main_name : string t
  (** [main_name] is a term that evaluates to the "main" term's name. *)

  val choice_names : string list t
  (** [choice_names] is a term that evaluates to the names of the terms
      to choose from. *)

  val man_format : [`Pager | `Plain | `Groff] t
  (** [man_format] is a term that defines a [--man-format] option and
      evaluates to a value that can be used with {!Manpage.print}. *)

  (** {1:tinfo Term information}

      Term information defines the name and man page of a term.
      For simple evaluation this is the name of the program and its
      man page. For multiple term evaluation, this is
      the name of a command and its man page. *)

  type info
  (** The type for term information. *)

  val info : ?sdocs:string -> ?man:Manpage.block list ->
    ?docs:string -> ?doc:string -> ?version:string -> string -> info
  (** [info sdocs man docs doc version name] is a term information
      such that:
      {ul
      {- [name] is the name of the program or the command.}
      {- [version] is the version string of the program, ignored
         for commands.}
      {- [doc] is a one line description of the program or command used
         for the [NAME] section of the term's man page. For commands this
         description is also used in the list of commands of the main
         term's man page.}
      {- [docs], only for commands, the title of the section of the main
         term's man page where it should be listed (defaults to ["COMMANDS"]).}
      {- [man] is the text of the man page for the term. In the text,
         the variables ["$(tname)"] and ["$(mname)"] can respectively be
         used to refer to the value of [name] and the main term's name.
      }
      {- [sdocs] defines the title of the section in which the
         standard [--help] and [--version] arguments are listed.}} *)

  val name : info -> string
  (** [name ti] is the name of the term information. *)

 (** {1:evaluation Evaluation} *)

  type 'a result = [
    | `Ok of 'a | `Error of [`Parse | `Term | `Exn ] | `Version | `Help ]
  (** The type for evaluation results.
      {ul
      {- [`Ok v], the term evaluated successfully and [v] is the result.}
      {- [`Version], the version string of the main term was printed
       on the help formatter.}
      {- [`Help], man page about the term was printed on the help formatter.}
      {- [`Error `Parse], a command line parse error occured and was
         reported on the error formatter.}
      {- [`Error `Term], a term evaluation error occured and was reported
         on the error formatter (see {!Term.ret}).}
      {- [`Error `Exn], an exception [e] was caught and reported
         on the error formatter (see the [~catch] parameter of {!eval}).}} *)

  val eval : ?help:Format.formatter ->
    ?err:Format.formatter -> ?catch:bool ->
    ?env:(string -> string option) ->
    ?argv:string array -> ('a t * info) -> 'a result
  (** [eval help err catch argv (t,i)]  is the evaluation result
      of [t] with command line arguments [argv] (defaults to {!Sys.argv}).

      If [catch] is [true] (default) uncaught exeptions
      are intercepted and their stack trace is written to the [err]
      formatter.

      [help] is the formatter used to print help or version messages
      (defaults to {!Format.std_formatter}). [err] is the formatter
      used to print error messages (defaults to {!Format.err_formatter}).

      [env] is used for environment variable lookup, the default
      uses {!Sys.getenv}. *)

  val eval_choice : ?help:Format.formatter ->
    ?err:Format.formatter -> ?catch:bool ->
    ?env:(string -> string option) ->
    ?argv:string array -> 'a t * info -> ('a t * info) list ->
    'a result
  (** [eval_choice help err catch argv default (t,i) choices] is like {!eval}
      except that if the first argument on the command line is not an option
      name it will look in [choices] for a term whose information has this
      name and evaluate it.

      If the command name is unknown an error is reported. If the name
      is unspecified the "main" term [t] is evaluated. [i] defines the
      name and man page of the program. *)

  val eval_peek_opts : ?version_opt:bool ->
    ?env:(string -> string option) ->
    ?argv:string array -> 'a t ->
    'a option * 'a result
  (** [eval_peek_opts version_opt argv t] evaluates [t], a term made
      of optional arguments only, with the command line [argv]
      (defaults to {!Sys.argv}). In this evaluation, unknown optional
      arguments and positional arguments are ignored.

      The evaluation returns a pair. The first component is
      the result of parsing the command line [argv] stripped from
      any help and version option if [version_opt] is [true] (defaults
      to [false]). It results in:
      {ul
      {- [Some _] if the command line would be parsed correctly given the
         {e partial} knowledge in [t].}
      {- [None] if a parse error would occur on the options of [t]}}

      The second component is the result of parsing the command line
      [argv] without stripping the help and version options. It
      indicates what the evaluation would result in on [argv] given
      the partial knowledge in [t] (for example it would return
      [`Help] if there's a help option in [argv]). However in
      contrasts to {!eval} and {!eval_choice} no side effects like
      error reporting or help output occurs.

      {b Note.} Positional arguments can't be peeked without the full
      specification of the command line: we can't tell apart a
      positional argument from the value of an unknown optional
      argument.  *)
end

(** Terms for command line arguments.

    This module provides functions to define terms that evaluate
    to the arguments provided on the command line.

    Basic constraints, like the argument type or repeatability, are
    specified by defining a value of type {!t}. Further contraints can
    be specified during the {{!argterms}conversion} to a term. *)
module Arg : sig

(** {1:argconv Argument converters}

    An argument converter transforms a string argument of the command
    line to an OCaml value. {{!converters}Predefined converters}
    are provided for many types of the standard library. *)

  type 'a parser = string -> [ `Ok of 'a | `Error of string ]
  (** The type for argument parsers. *)

  type 'a printer = Format.formatter -> 'a -> unit
  (** The type for converted argument printers. *)

  type 'a converter = 'a parser * 'a printer
  (** The type for argument converters. *)

  val some : ?none:string -> 'a converter -> 'a option converter
  (** [some none c] is like the converter [c] except it returns
      [Some] value. It is used for command line arguments
      that default to [None] when absent. [none] is what to print to
      document the absence (defaults to [""]). *)

(** {1:arginfo Arguments and their information}

    Argument information defines the man page information of an
    argument and, for optional arguments, its names. An environment
    variable can also be specified to read the argument value from
    if the argument is absent from the command line and the variable
    is defined. *)

  type env
  (** The type for environment variables and their documentation. *)

  val env_var : ?docs:string -> ?doc:string -> string -> env
  (** [env_var docs doc var] is an environment variables [var]. [doc]
      is the man page information of the environment variable; the
      variables mentioned in {!info} can be used in this documentation
      string. [doc] defaults to ["See option $(opt)."]. [docs] is the
      title of the man page section in which the environment variable
      will be listed, it defaults to ["ENVIRONMENT VARIABLES"]. *)

  type 'a t
  (** The type for arguments holding data of type ['a]. *)

  type info
  (** The type for information about command line arguments. *)

  val info : ?docs:string -> ?docv:string -> ?doc:string -> ?env:env ->
    string list -> info
  (** [info docs docv doc env names] defines information for
      an argument.

      [names] defines the names under which an optional argument
      can be referred to. Strings of length [1] (["c"]) define short
      option names (["-c"]), longer strings (["count"]) define long
      option names (["--count"]). [names] must be empty for positional
      arguments.

      [env] defines the name of an environment variable which is
      looked up for defining the argument if it is absent from the
      command line. See {{!envlookup}environment variables} for
      details.
      {ul
      {- [doc] is the man page information of the argument. The
         variable ["$(docv)"] can be used to refer to the value of
         [docv] (see below). The variable ["$(opt)"] will refer to a
         long option of [names] or a short one if there is no long
         option. The variable ["$(env)"] will refer to the environment
         variable specified by [env] (if any).  {{!doc_helpers}These
         functions} can help with formatting argument values.}
      {- [docv] is for positional and non-flag optional arguments.
         It is a variable name used in the man page to stand for their value.}
      {- [docs] is the title of the man page section in which the argument
         will be listed. For optional arguments this defaults
         to ["OPTIONS"]. For positional arguments this defaults
         to ["ARGUMENTS"]. However a positional argument is only listed
         if it has both a [doc] and [docv] specified.}} *)

  val ( & ) : ('a -> 'b) -> 'a -> 'b
  (** [f & v] is [f v], a right associative composition operator for
      specifying argument terms. *)

(** {1:optargs Optional arguments}

    The information of an optional argument must have at least
    one name or [Invalid_argument] is raised. *)

  val flag : info -> bool t
  (** [flag i] is a [bool] argument defined by an optional flag
      that may appear {e at most} once on the command line under one of
      the names specified by [i]. The argument holds [true] if the
      flag is present on the command line and [false] otherwise. *)

  val flag_all : info -> bool list t
  (** [flag_all] is like {!flag} except the flag may appear more than
      once. The argument holds a list that contains one [true] value per
      occurence of the flag. It holds the empty list if the flag
      is absent from the command line. *)

  val vflag : 'a -> ('a * info) list -> 'a t
  (** [vflag v \[v]{_0}[,i]{_0}[;...\]] is an ['a] argument defined
      by an optional flag that may appear {e at most} once on
      the command line under one of the names specified in the [i]{_k}
      values. The argument holds [v] if the flag is absent from the
      command line and the value [v]{_k} if the name under which it appears
      is in [i]{_k}.

      {b Note.} Environment variable lookup is unsupported for
      for these arguments. *)

  val vflag_all : 'a list -> ('a * info) list -> 'a list t
  (** [vflag_all v l] is like {!vflag} except the flag may appear more
      than once. The argument holds the list [v] if the flag is absent
      from the command line. Otherwise it holds a list that contains one
      corresponding value per occurence of the flag, in the order found on
      the command line.

      {b Note.} Environment variable lookup is unsupported for
      for these arguments. *)

  val opt : ?vopt:'a -> 'a converter -> 'a -> info -> 'a t
  (** [opt vopt c v i] is an ['a] argument defined by the value of
      an optional argument that may appear {e at most} once on the command
      line under one of the names specified by [i]. The argument holds
      [v] if the option is absent from the command line. Otherwise
      it has the value of the option as converted by [c].

      If [vopt] is provided the value of the optional argument is itself
      optional, taking the value [vopt] if unspecified on the command line. *)

  val opt_all : ?vopt:'a -> 'a converter -> 'a list -> info -> 'a list t
  (** [opt_all vopt c v i] is like {!opt} except the optional argument may
      appear more than once. The argument holds a list that contains one value
      per occurence of the flag in the order found on the command line.
      It holds the list [v] if the flag is absent from the command line. *)

  (** {1:posargs Positional arguments}

      The information of a positional argument must have no name
      or [Invalid_argument] is raised. Positional arguments indexing
      is zero-based. *)

  val pos : ?rev:bool -> int -> 'a converter -> 'a -> info -> 'a t
  (** [pos rev n c v i] is an ['a] argument defined by the [n]th
      positional argument of the command line as converted by [c].
      If the positional argument is absent from the command line
      the argument is [v].

      If [rev] is [true] (defaults to [false]), the computed
      position is [max-n] where [max] is the position of
      the last positional argument present on the command line. *)

  val pos_all : 'a converter -> 'a list -> info -> 'a list t
  (** [pos_all c v i] is an ['a list] argument that holds
      all the positional arguments of the command line as converted
      by [c] or [v] if there are none. *)

  val pos_left : ?rev:bool -> int -> 'a converter -> 'a list -> info ->
    'a list t
  (** [pos_left rev n c v i] is an ['a list] argument that holds
      all the positional arguments as converted by [c] found on the left
      of the [n]th positional argument or [v] if there are none.

      If [rev] is [true] (defaults to [false]), the computed
      position is [max-n] where [max] is the position of
      the last positional argument present on the command line. *)

  val pos_right : ?rev:bool -> int -> 'a converter -> 'a list -> info ->
    'a list t
  (** [pos_right] is like {!pos_left} except it holds all the positional
      arguments found on the right of the specified positional argument. *)

  (** {1:argterms Arguments as terms} *)

  val value : 'a t -> 'a Term.t
  (** [value a] is a term that evaluates to [a]'s value. *)

  val required : 'a option t -> 'a Term.t
  (** [required a] is a term that fails if [a]'s value is [None] and
      evaluates to the value of [Some] otherwise. Use this for required
      positional arguments (it can also be used for defining required
      optional arguments, but from a user interface perspective this
      shouldn't be done, it is a contradiction in terms). *)

  val non_empty : 'a list t -> 'a list Term.t
  (** [non_empty a] is term that fails if [a]'s list is empty and
      evaluates to [a]'s list otherwise. Use this for non empty lists
      of positional arguments. *)

  val last : 'a list t -> 'a Term.t
  (** [last a] is a term that fails if [a]'s list is empty and evaluates
      to the value of the last element of the list otherwise. Use this
      for lists of flags or options where the last occurence takes precedence
      over the others. *)

  (** {1:converters Predefined converters} *)

  val bool : bool converter
  (** [bool] converts values with {!bool_of_string}. *)

  val char : char converter
  (** [char] converts values by ensuring the argument has a single char. *)

  val int : int converter
  (** [int] converts values with {!int_of_string}. *)

  val nativeint : nativeint converter
  (** [nativeint] converts values with {!Nativeint.of_string}. *)

  val int32 : int32 converter
  (** [int32] converts values with {!Int32.of_string}. *)

  val int64 : int64 converter
  (** [int64] converts values with {!Int64.of_string}. *)

  val float : float converter
  (** [float] converts values with {!float_of_string}. *)

  val string : string converter
  (** [string] converts values with the identity function. *)

  val enum : (string * 'a) list -> 'a converter
  (** [enum l p] converts values such that unambiguous prefixes of string names
      in [l] map to the corresponding value of type ['a].

      {b Warning.} The type ['a] must be comparable with {!Pervasives.compare}.

      @raise Invalid_argument if [l] is empty. *)

  val file : string converter
  (** [file] converts a value with the identity function and
      checks with {!Sys.file_exists} that a file with that name exists. *)

  val dir : string converter
  (** [dir] converts a value with the identity function and checks
      with {!Sys.file_exists} and {!Sys.is_directory}
      that a directory with that name exists. *)

  val non_dir_file : string converter
  (** [non_dir_file] converts a value with the identity function and checks
      with {!Sys.file_exists} and {!Sys.is_directory}
      that a non directory file with that name exists. *)

  val list : ?sep:char -> 'a converter -> 'a list converter
  (** [list sep c] splits the argument at each [sep] (defaults to [','])
      character and converts each substrings with [c]. *)

  val array : ?sep:char -> 'a converter -> 'a array converter
  (** [array sep c] splits the argument at each [sep] (defaults to [','])
      character and converts each substring with [c]. *)

  val pair : ?sep:char -> 'a converter -> 'b converter -> ('a * 'b) converter
  (** [pair sep c0 c1] splits the argument at the {e first} [sep] character
      (defaults to [',']) and respectively converts the substrings with
      [c0] and [c1]. *)

  val t2 : ?sep:char -> 'a converter -> 'b converter -> ('a * 'b) converter
  (** {!t2} is {!pair}. *)

  val t3 : ?sep:char -> 'a converter ->'b converter -> 'c converter ->
    ('a * 'b * 'c) converter
  (** [t3 sep c0 c1 c2] splits the argument at the {e first} two [sep]
      characters (defaults to [',']) and respectively converts the
      substrings with [c0], [c1] and [c2]. *)

  val t4 : ?sep:char -> 'a converter ->'b converter -> 'c converter ->
    'd converter -> ('a * 'b * 'c * 'd) converter
  (** [t4 sep c0 c1 c2 c3] splits the argument at the {e first} three [sep]
      characters (defaults to [',']) respectively converts the substrings
      with [c0], [c1], [c2] and [c3]. *)

  (** {1:doc_helpers Documentation formatting helpers} *)

  val doc_quote : string -> string
  (** [doc_quote s] quotes the string [s]. *)

  val doc_alts : ?quoted:bool -> string list -> string
  (** [doc_alts alts] documents the alternative tokens [alts] according
      the number of alternatives. If [quoted] is [true] (default)
      the tokens are quoted. The resulting string can be used in
      sentences of the form ["$(docv) must be %s"].

      @raise Invalid_argument if [alts] is the empty string.  *)

  val doc_alts_enum : ?quoted:bool -> (string * 'a) list -> string
  (** [doc_alts_enum quoted alts] is [doc_alts quoted (List.map fst alts)]. *)
end

(**
    {1:basics Basics}

    With [Cmdliner] your program evaluates a term. A {e term}
    is a value of type {!Term.t}. The type parameter indicates
    the type of the result of the evaluation.

    One way to create terms is by lifting regular OCaml values with
    {!Term.const}. Terms can be applied to terms evaluating to
    functional values with {!Term.( $ )}. For example for the function:
{[let revolt () = print_endline "Revolt!"]}
    the term :
{[
open Cmdliner;;

let revolt_t = Term.(const revolt $ const ())]}
    is a term that evaluates to the result (and effect) of the [revolt]
    function.
    Terms are evaluated with {!Term.eval}:
{[let () = match Term.eval (revolt_t, Term.info "revolt") with
| `Error _ -> exit 1 | _ -> exit 0]}
    This defines a command line program named ["revolt"], without command line
    arguments arguments, that just prints ["Revolt!"] on [stdout].
{[> ./revolt
Revolt!]}
    The combinators in the {!Arg} module allow to extract command
    line argument data as terms. These terms can then be applied to
    lifted OCaml functions to be evaluated by the program.

    Terms corresponding to command line argument data that are part of
    a term evaluation implicitly define a command line syntax.  We
    show this on an concrete example.

    Consider the [chorus] function that prints repeatedly a
    given message :
{[let chorus count msg =
  for i = 1 to count do print_endline msg done]}
    we want to make it available from the command line
    with the synopsis:
{[chorus [-c COUNT | --count=COUNT] [MSG]]}
    where [COUNT] defaults to [10] and [MSG] defaults to ["Revolt!"].
    We first define a term corresponding to the [--count]
    option:
{[
let count =
  let doc = "Repeat the message $(docv) times." in
  Arg.(value & opt int 10 & info ["c"; "count"] ~docv:"COUNT" ~doc)
]}
    This says that [count] is a term that evaluates to the
    value of an optional argument of type [int] that
    defaults to [10] if unspecified and whose option name is
    either [-c] or [--count]. The arguments [doc] and [docv] are used to
    generate the option's man page information.

    The term for the positional argument [MSG] is:
{[
let msg =
  let doc = "Overrides the default message to print."
  let env = Arg.env "CHORUS_MSG" ~doc in
  let doc = "The message to print." in
  Arg.(value & pos 0 string "Revolt!" & info [] ~env ~docv:"MSG" ~doc)
]}
    which says that [msg] is a term whose value is the positional
    argument at index [0] of type [string] and defaults to ["Revolt!"]
    or the value of the environment variable [CHORUS_MSG] if the
    argument is unspecified on the command line. Here again [doc] and
    [docv] are used for the man page information.

    The term for executing [chorus] with these command line arguments
    is :
{[
let chorus_t = Term.(const chorus $ count $ msg)
]}
    and we are now ready to define our program:
{[
let info =
  let doc = "print a customizable message repeatedly" in
  let man = [ `S "BUGS"; `P "Email bug reports to <hehey at example.org>.";] in
  Term.info "chorus" ~version:"1.6.1" ~doc ~man

let () = match Term.eval (chorus_t, info) with `Error _ -> exit 1 | _ -> exit 0
]}
    The [info] value created with {!Term.info} gives more information
    about the term we execute and is used to generate the program's
    man page. Since we provided a [~version] string, the program will
    automatically respond to the [--version] option by printing this
    string.

    A program using {!Term.eval} always responds to the
    [--help] option by showing the man page about the program generated
    using the information you provided with {!Term.info} and {!Arg.info}.
    Here is the output generated by our example :
{v > ./chorus --help
NAME
       chorus - print a customizable message repeatedly

SYNOPSIS
       chorus [OPTION]... [MSG]

ARGUMENTS
       MSG (absent=Revolt! or CHORUS_MSG env)
           The message to print.

OPTIONS
       -c COUNT, --count=COUNT (absent=10)
           Repeat the message COUNT times.

       --help[=FMT] (default=pager)
           Show this help in format FMT (pager, plain or groff).

       --version
           Show version information.

BUGS
       Email bug reports to <hehey at example.org>.
v}

    If a pager is available, this output is written to a pager.
    This help is also available in plain text or in the
    {{:http://www.gnu.org/software/groff/groff.html}groff} man page format by
    invoking the program with the option [--help=plain] or [--help=groff].

    For examples of more complex command line definitions look and
    run the {{!examples}examples}.

    {2:multiterms Multiple terms}

    [Cmdliner] also provides support for programs like [darcs] or
    [git] that have multiple commands each with their own syntax:
    {[prog COMMAND [OPTION]... ARG...]}
    A command is defined by coupling a term with
    {{!Term.tinfo}term information}. The term information defines the
    command name and its man page. Given a list of commands the function
    {!Term.eval_choice} will execute the term corresponding to the
    [COMMAND] argument or or a specific "main" term if there is
    no [COMMAND] argument.

    {2:manual Manual}

    Man page sections are printed in the order specified by
    {!Term.info}. The man page information of an argument is listed in
    alphabetical order at the end of the text of the section specified
    by its {{!Arg.info}argument information}. Positional arguments are
    also listed iff both the [docv] and [doc] string is specified in
    their argument information.

    If an argument information mentions a section not specified in
    {!Term.info}, an empty section is created for it. This section is
    inserted just after the ["SYNOPSIS"] section or after a section
    named ["DESCRIPTION"] if there is one.

    The ["SYNOPSIS"] section of a man page is generated automatically
    from a term's information and its arguments. To substitute your
    own instead, start the term's information man page with
    a ["SYNOPSIS"] section.

    Ideally all manual strings should be UTF-8 encoded. However at the
    moment Groff (at least [1.19.2]) doesn't seem to cope with UTF-8
    input and UTF-8 characters beyond the ASCII set will look garbled.
    Regarding UTF-8 output, generating the man page with [-Tutf8] maps
    the hyphen-minus [U+002D] to the minus sign [U+2212] which makes it
    difficult to search it in the pager, so [-Tascii] is used for now.
    Conclusion is that it may be better to stick to the ASCII set for now.
    Please contact the author if something seems wrong in this reasoning
    or if you know a work around this.

    {2:misc Miscellaneous}

    {ul
    {- The option name [--help], (and [--version] if you specify a
       version string) is reserved by the module. Using it as a term or
       option name may result in undefined behaviour.}
    {- The evaluation of a term in which the same option name is defined
       by more than one argument is undefined.}}

    {1:cmdline Command line syntax}

    For programs evaluating a single term the most general form of invocation
    is:
    {ul{- [prog [OPTION]... [ARG]...]}}
    The program automatically reponds to the [--help] option by
    printing the help. If a version string is provided in
    the {{!Term.tinfo}term information}, it also automatically responds
    to the [--version] option by printing this string.

    Command line arguments are either {{!optargs}{e optional}} or
    {{!posargs}{e positional}}. Both can be freely interleaved but
    since [Cmdliner] accepts many optional forms this may result in
    ambiguities. The special {{!posargs} token [--]} can be used to resolve
    them.

    Programs evaluating multiple terms also add this form of invocation:
    {ul{- [prog COMMAND [OPTION]... [ARG]...]}}
    Commands automatically respond to the [--help] option
    by printing their help. The [COMMAND] string must
    be the first string following the program name and may be specified
    by a prefix as long as it is not ambiguous.

    {2:optargs Optional arguments}

    An optional argument is specified on the command line by a {e
    name} possibly followed by a {e value}.

    The name of an option can be short or long.
    {ul
    {- A {e short} name is a dash followed by a single alphanumeric
       character: ["-h"], ["-q"], ["-I"].}
    {- A {e long} name is two dashes followed by alphanumeric
       characters and dashes: ["--help"], ["--silent"], ["--ignore-case"].}}

    More than one name may refer to the same optional argument.  For
    example in a given program the names ["-q"], ["--quiet"] and
    ["--silent"] may all stand for the same boolean argument
    indicating the program to be quiet.  Long names
    can be specified by any non ambiguous prefix.

    The value of an option can be specified in three different ways.
    {ul
    {- As the next token on the command line: ["-o a.out"],
       ["--output a.out"].}
    {- Glued to a short name: ["-oa.out"].}
    {- Glued to a long name after an equal character:
    ["--output=a.out"].}}
    Glued forms are especially useful if
    the value itself starts with a dash as is the case for negative numbers,
    ["--min=-10"].

    An optional argument without a value is either a {e flag}
    (see {!Arg.flag}, {!Arg.vflag}) or an optional argument with an optional
    value (see the [~vopt] argument of {!Arg.opt}).

    Short flags can be grouped together to share a single dash and the group
    can end with a short option. For example assuming ["-v"] and ["-x"]
    are flags and ["-f"] is a short option:
    {ul
      {- ["-vx"] will be parsed as ["-v -x"].}
      {- ["-vxfopt"] will be parsed as ["-v -x -fopt"].}
      {- ["-vxf opt"] will be parsed as ["-v -x -fopt"].}
      {- ["-fvx"] will be parsed as ["-f=vx"].}}

    {2:posargs Positional arguments}

    Positional arguments are tokens on the command line that are not
    option names and are not the value of an optional argument. They
    are numbered from left to right starting with zero.

    Since positional arguments may be mistaken as the optional value
    of an optional argument or they may need to look like option
    names, anything that follows the special token ["--"] on the command
    line is considered to be a positional argument.

    {2:envlookup Environment variables}

    Non-required command line arguments can be backed up by an environment
    variable.  If the argument is absent from the command line and
    that the environment variable is defined, its value is parsed
    using the argument converter and defines the value of the
    argument.

    For {!Arg.flag} and {!Arg.flag_all} that do not have an argument
    converter a boolean is parsed from the lowercased variable value
    as follows:
    {ul
    {- [""], ["false"], ["no"], ["n"] or ["0"] is [false].}
    {- ["true"], ["yes"], ["y"] or ["1"] is [true].}
    {- Any other string is an error.}}

    Note that environment variables are not supported for {!Arg.vflag}
    and {!Arg.vflag_all}.

    {1:examples Examples}

    These examples are in the [test] directory of the distribution.

 {2:exrm A [rm] command}

    We define the command line interface of a
    [rm] command with the synopsis:
{[
rm [OPTION]... FILE...
]}
    The [-f], [-i] and [-I] flags define the prompt behaviour of [rm],
    represented in our program by the [prompt] type. If more than one
    of these flags is present on the command line the last one takes
    precedence.

    To implement this behaviour we map the presence of these flags
    to values of the [prompt] type by using {!Arg.vflag_all}.  This
    argument will contain all occurences of the flag on the command
    line and we just take the {!Arg.last} one to define our term value
    (if there's no occurence the last value of the default list [[Always]] is
    taken, i.e. the default is [Always]).
{[
(* Implementation of the command, we just print the args. *)

type prompt = Always | Once | Never
let prompt_str = function
| Always -> "always" | Once -> "once" | Never -> "never"

let rm prompt recurse files =
  Printf.printf "prompt = %s\nrecurse = %b\nfiles = %s\n"
    (prompt_str prompt) recurse (String.concat ", " files)

(* Command line interface *)

open Cmdliner;;

let files = Arg.(non_empty & pos_all file [] & info [] ~docv:"FILE")
let prompt =
  let doc = "Prompt before every removal." in
  let always = Always, Arg.info ["i"] ~doc in
  let doc = "Ignore nonexistent files and never prompt." in
  let never = Never, Arg.info ["f"; "force"] ~doc in
  let doc = "Prompt once before removing more than three files, or when
             removing recursively. Less intrusive than $(b,-i), while
             still giving protection against most mistakes."
  in
  let once = Once, Arg.info ["I"] ~doc in
  Arg.(last & vflag_all [Always] [always; never; once])

let recursive =
  let doc = "Remove directories and their contents recursively." in
  Arg.(value & flag & info ["r"; "R"; "recursive"] ~doc)

let cmd =
  let doc = "remove files or directories" in
  let man = [
    `S "DESCRIPTION";
    `P "$(tname) removes each specified $(i,FILE). By default it does not
        remove directories, to also remove them and their contents, use the
        option $(b,--recursive) ($(b,-r) or $(b,-R)).";
    `P "To remove a file whose name starts with a `-', for example
        `-foo', use one of these commands:";
    `P "rm -- -foo"; `Noblank;
    `P "rm ./-foo";
    `P "$(tname) removes symbolic links, not the files referenced by the
        links.";
    `S "BUGS"; `P "Report bugs to <hehey at example.org>.";
    `S "SEE ALSO"; `P "$(b,rmdir)(1), $(b,unlink)(2)" ]
  in
  Term.(const rm $ prompt $ recursive $ files),
  Term.info "rm" ~version:"1.6.1" ~doc ~man

let () = match Term.eval cmd with `Error _ -> exit 1 | _ -> exit 0
]}
    {2:excp A [cp] command}

    We define the command line interface of a
    [cp] command with the synopsis:
{[cp [OPTION]... SOURCE... DEST ]}
    The [DEST] argument must be a directory if there is more than
    one [SOURCE]. This constraint is too complex to be expressed by the
    combinators of {!Arg}. Hence we just give it the {!Arg.string} type
    and verify the constraint at the beginning of the [cp]
    implementation. If unsatisfied we return an [`Error] and
    by using {!Term.ret} on the lifted result [cp_t] of [cp],
    [Cmdliner] handles the error reporting.
{[
(* Implementation, we check the dest argument and print the args *)

let cp verbose recurse force srcs dest =
  if List.length srcs > 1 &&
  (not (Sys.file_exists dest) || not (Sys.is_directory dest))
  then
    `Error (false, dest ^ " is not a directory")
  else
    `Ok (Printf.printf
     "verbose = %b\nrecurse = %b\nforce = %b\nsrcs = %s\ndest = %s\n"
      verbose recurse force (String.concat ", " srcs) dest)

(* Command line interface *)

open Cmdliner;;

let verbose =
  let doc = "Print file names as they are copied." in
  Arg.(value & flag & info ["v"; "verbose"] ~doc)

let recurse =
  let doc = "Copy directories recursively." in
  Arg.(value & flag & info ["r"; "R"; "recursive"] ~doc)

let force =
  let doc = "If a destination file cannot be opened, remove it and try again."in
  Arg.(value & flag & info ["f"; "force"] ~doc)

let srcs =
  let doc = "Source file(s) to copy." in
  Arg.(non_empty & pos_left ~rev:true 0 file [] & info [] ~docv:"SOURCE" ~doc)

let dest =
  let doc = "Destination of the copy. Must be a directory if there is more
             than one $(i,SOURCE)." in
  Arg.(required & pos ~rev:true 0 (some string) None & info [] ~docv:"DEST"
         ~doc)

let cmd =
  let doc = "copy files" in
  let man = [
    `S "BUGS";
    `P "Email them to <hehey at example.org>.";
    `S "SEE ALSO";
    `P "$(b,mv)(1), $(b,scp)(1), $(b,umask)(2), $(b,symlink)(7)" ]
  in
  Term.(ret (const cp $ verbose $ recurse $ force $ srcs $ dest)),
  Term.info "cp" ~version:"1.6.1" ~doc ~man

let () = match Term.eval cmd with `Error _ -> exit 1 | _ -> exit 0
]}

{2:extail A [tail] command}

We define the command line interface of a [tail] command with the
synopsis:
{[tail [OPTION]... [FILE]...]}

The [--lines] option whose value specifies the number of last lines to
print has a special syntax where a [+] prefix indicates to start
printing from that line number. In the program this is represented by
the [loc] type. We define a custom [loc] {{!Arg.argconv}argument converter}
for this option.

The [--follow] option has an optional enumerated value. The argument
converter [follow], created with {!Arg.enum} parses the option value
into the enumeration. By using {!Arg.some} and the [~vopt] argument of
{!Arg.opt}, the term corresponding to the option [--follow] evaluates to
[None] if [--follow] is absent from the command line, to [Some Descriptor]
if present but without a value and to [Some v] if present with a value
[v] specified.

{[
(* Implementation of the command, we just print the args. *)

type loc = bool * int
type verb = Verbose | Quiet
type follow = Name | Descriptor

let str = Printf.sprintf
let opt_str sv = function None -> "None" | Some v -> str "Some(%s)" (sv v)
let loc_str (rev, k) = if rev then str "%d" k else str "+%d" k
let follow_str = function Name -> "name" | Descriptor -> "descriptor"
let verb_str = function Verbose -> "verbose" | Quiet -> "quiet"

let tail lines follow verb pid files =
  Printf.printf "lines = %s\nfollow = %s\nverb = %s\npid = %s\nfiles = %s\n"
    (loc_str lines) (opt_str follow_str follow) (verb_str verb)
    (opt_str string_of_int pid) (String.concat ", " files)

(* Command line interface *)

open Cmdliner;;

let lines =
  let loc =
    let parse s = try
      if s <> "" && s.[0] <> '+' then `Ok (true, int_of_string s) else
      `Ok (false, int_of_string (String.sub s 1 (String.length s - 1)))
    with Failure _ -> `Error "unable to parse integer"
    in
    parse, fun ppf p -> Format.fprintf ppf "%s" (loc_str p)
  in
  Arg.(value & opt loc (true, 10) & info ["n"; "lines"] ~docv:"N"
   ~doc:"Output the last $(docv) lines or use $(i,+)$(docv) to start
         output after the $(i,N)-1th line.")
let follow =
  let doc = "Output appended data as the file grows. $(docv) specifies how the
             file should be tracked, by its `name' or by its `descriptor'." in
  let follow = Arg.enum ["name", Name; "descriptor", Descriptor] in
  Arg.(value & opt (some follow) ~vopt:(Some Descriptor) None &
       info ["f"; "follow"] ~docv:"ID" ~doc)

let verb =
  let doc = "Never output headers giving file names." in
  let quiet = Quiet, Arg.info ["q"; "quiet"; "silent"] ~doc in
  let doc = "Always output headers giving file names." in
  let verbose = Verbose, Arg.info ["v"; "verbose"] ~doc in
  Arg.(last & vflag_all [Quiet] [quiet; verbose])

let pid =
  let doc = "With -f, terminate after process $(docv) dies." in
  Arg.(value & opt (some int) None & info ["pid"] ~docv:"PID" ~doc)

let files = Arg.(value & (pos_all non_dir_file []) & info [] ~docv:"FILE")

let cmd =
  let doc = "display the last part of a file" in
  let man = [
    `S "DESCRIPTION";
    `P "$(tname) prints the last lines of each $(i,FILE) to standard output. If
        no file is specified reads standard input. The number of printed
        lines can be  specified with the $(b,-n) option.";
    `S "BUGS";
    `P "Report them to <hehey at example.org>.";
    `S "SEE ALSO";
    `P "$(b,cat)(1), $(b,head)(1)" ]
  in
  Term.(const tail $ lines $ follow $ verb $ pid $ files),
  Term.info "tail" ~version:"1.6.1" ~doc ~man

let () = match Term.eval cmd with `Error _ -> exit 1 | _ -> exit 0
]}

{2:exdarcs A [darcs] command}

We define the command line interface of a [darcs] command with the synopsis:
{[darcs [COMMAND] ...]}

The [--debug], [-q], [-v] and [--prehook] options are available in
each command.  To avoid having to pass them individually to each
command we gather them in a record of type [copts]. By lifting the
record constructor [copts] into the term [copts_t] we now have a term
that we can pass to the commands to stand for an argument of type
[copts]. These options are documented in a section called [COMMON
OPTIONS], since we also want to put [--help] and [--version] in this
section, the term information of commands makes a judicious use of the
[sdocs] parameter of {!Term.info}.

The [help] command shows help about commands or other topics. The help
shown for commands is generated by [Cmdliner] by making an approriate
use of {!Term.ret} on the lifted [help] function.

If the program is invoked without a command we just want to show the
help of the program as printed by [Cmdliner] with [--help]. This is
done by the [no_cmd] term.

{[
(* Implementations, just print the args. *)

type verb = Normal | Quiet | Verbose
type copts = { debug : bool; verb : verb; prehook : string option }

let str = Printf.sprintf
let opt_str sv = function None -> "None" | Some v -> str "Some(%s)" (sv v)
let opt_str_str = opt_str (fun s -> s)
let verb_str = function
  | Normal -> "normal" | Quiet -> "quiet" | Verbose -> "verbose"

let pr_copts oc copts = Printf.fprintf oc
    "debug = %b\nverbosity = %s\nprehook = %s\n"
    copts.debug (verb_str copts.verb) (opt_str_str copts.prehook)

let initialize copts repodir = Printf.printf
    "%arepodir = %s\n" pr_copts copts repodir

let record copts name email all ask_deps files = Printf.printf
    "%aname = %s\nemail = %s\nall = %b\nask-deps = %b\nfiles = %s\n"
    pr_copts copts (opt_str_str name) (opt_str_str email) all ask_deps
    (String.concat ", " files)

let help copts man_format cmds topic = match topic with
| None -> `Help (`Pager, None) (* help about the program. *)
| Some topic ->
    let topics = "topics" :: "patterns" :: "environment" :: cmds in
    let conv, _ = Cmdliner.Arg.enum (List.rev_map (fun s -> (s, s)) topics) in
    match conv topic with
    | `Error e -> `Error (false, e)
    | `Ok t when t = "topics" -> List.iter print_endline topics; `Ok ()
    | `Ok t when List.mem t cmds -> `Help (man_format, Some t)
    | `Ok t ->
        let page = (topic, 7, "", "", ""), [`S topic; `P "Say something";] in
        `Ok (Cmdliner.Manpage.print man_format Format.std_formatter page)

open Cmdliner;;

(* Help sections common to all commands *)

let copts_sect = "COMMON OPTIONS"
let help_secs = [
 `S copts_sect;
 `P "These options are common to all commands.";
 `S "MORE HELP";
 `P "Use `$(mname) $(i,COMMAND) --help' for help on a single command.";`Noblank;
 `P "Use `$(mname) help patterns' for help on patch matching."; `Noblank;
 `P "Use `$(mname) help environment' for help on environment variables.";
 `S "BUGS"; `P "Check bug reports at http://bugs.example.org.";]

(* Options common to all commands *)

let copts debug verb prehook = { debug; verb; prehook }
let copts_t =
  let docs = copts_sect in
  let debug =
    let doc = "Give only debug output." in
    Arg.(value & flag & info ["debug"] ~docs ~doc)
  in
  let verb =
    let doc = "Suppress informational output." in
    let quiet = Quiet, Arg.info ["q"; "quiet"] ~docs ~doc in
    let doc = "Give verbose output." in
    let verbose = Verbose, Arg.info ["v"; "verbose"] ~docs ~doc in
    Arg.(last & vflag_all [Normal] [quiet; verbose])
  in
  let prehook =
    let doc = "Specify command to run before this $(mname) command." in
    Arg.(value & opt (some string) None & info ["prehook"] ~docs ~doc)
  in
  Term.(const copts $ debug $ verb $ prehook)

(* Commands *)

let initialize_cmd =
  let repodir =
    let doc = "Run the program in repository directory $(docv)." in
    Arg.(value & opt file Filename.current_dir_name & info ["repodir"]
           ~docv:"DIR" ~doc)
  in
  let doc = "make the current directory a repository" in
  let man = [
    `S "DESCRIPTION";
    `P "Turns the current directory into a Darcs repository. Any
       existing files and subdirectories become ..."] @ help_secs
  in
  Term.(const initialize $ copts_t $ repodir),
  Term.info "initialize" ~sdocs:copts_sect ~doc ~man

let record_cmd =
  let pname =
    let doc = "Name of the patch." in
    Arg.(value & opt (some string) None & info ["m"; "patch-name"] ~docv:"NAME"
         ~doc)
  in
  let author =
    let doc = "Specifies the author's identity." in
    Arg.(value & opt (some string) None & info ["A"; "author"] ~docv:"EMAIL"
         ~doc)
  in
  let all =
    let doc = "Answer yes to all patches." in
    Arg.(value & flag & info ["a"; "all"] ~doc)
  in
  let ask_deps =
    let doc = "Ask for extra dependencies." in
    Arg.(value & flag & info ["ask-deps"] ~doc)
  in
  let files = Arg.(value & (pos_all file) [] & info [] ~docv:"FILE or DIR") in
  let doc = "create a patch from unrecorded changes" in
  let man =
    [`S "DESCRIPTION";
     `P "Creates a patch from changes in the working tree. If you specify
      a set of files ..."] @ help_secs
  in
  Term.(const record $ copts_t $ pname $ author $ all $ ask_deps $ files),
  Term.info "record" ~doc ~sdocs:copts_sect ~man

let help_cmd =
  let topic =
    let doc = "The topic to get help on. `topics' lists the topics." in
    Arg.(value & pos 0 (some string) None & info [] ~docv:"TOPIC" ~doc)
  in
  let doc = "display help about darcs and darcs commands" in
  let man =
    [`S "DESCRIPTION";
     `P "Prints help about darcs commands and other subjects..."] @ help_secs
  in
  Term.(ret
          (const help $ copts_t $ Term.man_format $ Term.choice_names $topic)),
  Term.info "help" ~doc ~man

let default_cmd =
  let doc = "a revision control system" in
  let man = help_secs in
  Term.(ret (const (fun _ -> `Help (`Pager, None)) $ copts_t)),
  Term.info "darcs" ~version:"1.6.1" ~sdocs:copts_sect ~doc ~man

let cmds = [initialize_cmd; record_cmd; help_cmd]

let () = match Term.eval_choice default_cmd cmds with
| `Error _ -> exit 1 | _ -> exit 0
]}
*)

(*---------------------------------------------------------------------------
   Copyright (c) 2011 Daniel C. Bünzli
   All rights reserved.

   Redistribution and use in source and binary forms, with or without
   modification, are permitted provided that the following conditions
   are met:

   1. Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.

   2. Redistributions in binary form must reproduce the above
      copyright notice, this list of conditions and the following
      disclaimer in the documentation and/or other materials provided
      with the distribution.

   3. Neither the name of Daniel C. Bünzli nor the names of
      contributors may be used to endorse or promote products derived
      from this software without specific prior written permission.

   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  ---------------------------------------------------------------------------*)

end = struct
#1 "vendored_cmdliner.ml"
(*---------------------------------------------------------------------------
   Copyright (c) 2011 Daniel C. Bünzli. All rights reserved.
   Distributed under a BSD3 license, see license at the end of the file.
   cmdliner release 0.9.8
  ---------------------------------------------------------------------------*)

let str = Printf.sprintf

(* Invalid_arg strings *)

let err_argv = "argv array must have at least one element"
let err_not_opt = "Option argument without name"
let err_not_pos = "Positional argument with a name"
let err_help s = "Term error, help requested for unknown command " ^ s
let err_empty_list = "Empty list"
let err_incomplete_enum = "Incomplete enumeration for the type"
let err_doc_string s =
  str "Variable substitution failed on documentation fragment `%s'" s

(* A few useful definitions. *)

let rev_compare n n' = compare n' n
let pr = Format.fprintf
let pr_str = Format.pp_print_string
let pr_char = Format.pp_print_char
let str_of_pp pp v = pp Format.str_formatter v; Format.flush_str_formatter ()
let quote s = str "`%s'" s
let alts_str ?(quoted = true) alts =
  let quote = if quoted then quote else (fun s -> s) in
  match alts with
  | [] -> invalid_arg err_empty_list
  | [a] -> (quote a)
  | [a; b] -> str "either %s or %s" (quote a) (quote b)
  | alts ->
      let rev_alts = List.rev alts in
      str "one of %s or %s"
        (String.concat ", " (List.rev_map quote (List.tl rev_alts)))
        (quote (List.hd rev_alts))

let pr_white_str spaces ppf s =  (* spaces and new lines with Format's funs *)
  let left = ref 0 and right = ref 0 and len = String.length s in
  let flush () =
    Format.pp_print_string ppf (String.sub s !left (!right - !left));
    incr right; left := !right;
  in
  while (!right <> len) do
    if s.[!right] = '\n' then (flush (); Format.pp_force_newline ppf ()) else
    if spaces && s.[!right] = ' ' then (flush (); Format.pp_print_space ppf ())
    else incr right;
  done;
  if !left <> len then flush ()

let pr_text = pr_white_str true
let pr_lines = pr_white_str false
let pr_to_temp_file pr v = try
  let exec = Filename.basename Sys.argv.(0) in
  let file, oc = Filename.open_temp_file exec "out" in
  let ppf = Format.formatter_of_out_channel oc in
  pr ppf v; Format.pp_print_flush ppf (); close_out oc;
  at_exit (fun () -> try Sys.remove file with Sys_error e -> ());
  Some file
with Sys_error _ -> None

(* Levenshtein distance, for making spelling suggestions in case of error. *)

let levenshtein_distance s t =
  (* As found here http://rosettacode.org/wiki/Levenshtein_distance#OCaml *)
  let minimum a b c = min a (min b c) in
  let m = String.length s in
  let n = String.length t in
  (* for all i and j, d.(i).(j) will hold the Levenshtein distance between
     the first i characters of s and the first j characters of t *)
  let d = Array.make_matrix (m+1) (n+1) 0 in
  for i = 0 to m do d.(i).(0) <- i done;
  for j = 0 to n do d.(0).(j) <- j done;
  for j = 1 to n do
    for i = 1 to m do
      if s.[i-1] = t.[j-1] then
        d.(i).(j) <- d.(i-1).(j-1)  (* no operation required *)
      else
        d.(i).(j) <- minimum
            (d.(i-1).(j) + 1)   (* a deletion *)
            (d.(i).(j-1) + 1)   (* an insertion *)
            (d.(i-1).(j-1) + 1) (* a substitution *)
    done;
  done;
  d.(m).(n)

let suggest s candidates =
  let add (min, acc) name =
    let d = levenshtein_distance s name in
    if d = min then min, (name :: acc) else
    if d < min then d, [name] else
    min, acc
  in
  let dist, suggs = List.fold_left add (max_int, []) candidates in
  if dist < 3 (* suggest only if not too far *) then suggs else []

(* Tries. This implementation also maps any non ambiguous prefix of a
   key to its value. *)

module Trie : sig
  type 'a t
  val empty : 'a t
  val is_empty : 'a t -> bool
  val add : 'a t -> string -> 'a -> 'a t
  val find : 'a t -> string -> [ `Ok of 'a | `Ambiguous | `Not_found ]
  val ambiguities : 'a t -> string -> string list
  val of_list : (string * 'a) list -> 'a t
end = struct
  module Cmap = Map.Make (Char)                           (* character maps. *)
  type 'a value =                         (* type for holding a bound value. *)
    | Pre of 'a                    (* value is bound by the prefix of a key. *)
    | Key of 'a                          (* value is bound by an entire key. *)
    | Amb                     (* no value bound because of ambiguous prefix. *)
    | Nil                            (* not bound (only for the empty trie). *)

  type 'a t = { v : 'a value; succs : 'a t Cmap.t }
  let empty = { v = Nil; succs = Cmap.empty }
  let is_empty t = t = empty

  (* N.B. If we replace a non-ambiguous key, it becomes ambiguous but it's
     not important for our use. Also the following is not tail recursive but
     the stack is bounded by key length. *)
  let add t k d =
    let rec aux t k len i d pre_d =
      if i = len then { v = Key d; succs = t.succs } else
      let v = match t.v with
      | Amb | Pre _ -> Amb | Key _ as v -> v | Nil -> pre_d
      in
      let succs =
        let t' = try Cmap.find k.[i] t.succs with Not_found -> empty in
        Cmap.add k.[i] (aux t' k len (i + 1) d pre_d) t.succs
      in
      { v; succs }
    in
    aux t k (String.length k) 0 d (Pre d (* allocate less *))

  let find_node t k =
    let rec aux t k len i =
      if i = len then t else
      aux (Cmap.find k.[i] t.succs) k len (i + 1)
    in
    aux t k (String.length k) 0

  let find t k =
    try match (find_node t k).v with
    | Key v | Pre v -> `Ok v | Amb -> `Ambiguous | Nil -> `Not_found
    with Not_found -> `Not_found

  let ambiguities t p =                        (* ambiguities of [p] in [t]. *)
    try
      let t = find_node t p in
      match t.v with
      | Key _ | Pre _ | Nil -> []
      | Amb ->
          let add_char s c = s ^ (String.make 1 c) in
          let rem_char s = String.sub s 0 ((String.length s) - 1) in
          let to_list m = Cmap.fold (fun k t acc -> (k,t) :: acc) m [] in
          let rec aux acc p = function
          | ((c, t) :: succs) :: rest ->
              let p' = add_char p c in
              let acc' = match t.v with
              | Pre _ | Amb -> acc
              | Key _ -> (p' :: acc)
              | Nil -> assert false
              in
              aux acc' p' ((to_list t.succs) :: succs :: rest)
          | [] :: [] -> acc
          | [] :: rest -> aux acc (rem_char p) rest
          | [] -> assert false
          in
          aux [] p (to_list t.succs :: [])
    with Not_found -> []

  let of_list l = List.fold_left (fun t (s, v) -> add t s v) empty l
end

(* The following types keep untyped information about arguments and
   terms. This data is used to parse the command line, report errors
   and format man page information. *)

type env_info =                (* information about an environment variable. *)
  { env_var : string;                                       (* the variable. *)
    env_doc : string;                                               (* help. *)
    env_docs : string; }              (* title of help section where listed. *)

type absence =        (* what happens if the argument is absent from the cl. *)
  | Error                                           (* an error is reported. *)
  | Val of string Lazy.t         (* if <> "", takes the given default value. *)

type opt_kind =                              (* kinds of optional arguments. *)
  | Flag                                      (* just a flag, without value. *)
  | Opt                                                (* value is required. *)
  | Opt_vopt of string     (* option value is optional, takes given default. *)

type pos_kind =                            (* kinds of positional arguments. *)
  | All                                         (* all positional arguments. *)
  | Nth of bool * int                                  (* specific position. *)
  | Left of bool * int                (* all args on the left of a position. *)
  | Right of bool * int              (* all args on the right of a position. *)

type arg_info =                (* information about a command line argument. *)
  { id : int;                               (* unique id for the argument. *)
    absent : absence;                              (* behaviour if absent. *)
    env_info : env_info option;                   (* environment variable. *)
    doc : string;                                                 (* help. *)
    docv : string;              (* variable name for the argument in help. *)
    docs : string;                  (* title of help section where listed. *)
    p_kind : pos_kind;                             (* positional arg kind. *)
    o_kind : opt_kind;                               (* optional arg kind. *)
    o_names : string list;                        (* names (for opt args). *)
    o_all : bool; }                          (* repeatable (for opt args). *)

let arg_id =        (* thread-safe UIDs, Oo.id (object end) was used before. *)
  let c = ref 0 in
  fun () ->
    let id = !c in
    incr c; if id > !c then assert false (* too many ids *) else id

let is_opt a = a.o_names <> []
let is_pos a = a.o_names = []

module Amap = Map.Make                                     (* arg info maps. *)
    (struct type t = arg_info let compare a a' = compare a.id a'.id end)

type arg =        (* unconverted argument data as found on the command line. *)
  | O of (int * string * (string option)) list (* (pos, name, value) of opt. *)
  | P of string list

type cmdline = arg Amap.t      (* command line, maps arg_infos to arg value. *)

type man_block = [                                 (* block of manpage text. *)
  | `S of string | `P of string | `Pre of string | `I of string * string
  | `Noblank ]

type term_info =
  { name : string;                                    (* name of the term. *)
    version : string option;                   (* version (for --version). *)
    tdoc : string;                        (* one line description of term. *)
    tdocs : string;       (* title of man section where listed (commands). *)
    sdocs : string;    (* standard options, title of section where listed. *)
    man : man_block list; }                              (* man page text. *)

type eval_info =                 (* informatin about the evaluation context. *)
  { term : term_info * arg_info list;               (* term being evaluated. *)
    main : term_info * arg_info list;                          (* main term. *)
    choices : (term_info * arg_info list) list;         (* all term choices. *)
    env : string -> string option }          (* environment variable lookup. *)

let eval_kind ei =                       (* evaluation with multiple terms ? *)
  if ei.choices = [] then `Simple else
  if (fst ei.term) == (fst ei.main) then `M_main else `M_choice

module Manpage = struct
  type title = string * int * string * string * string
  type block = man_block
  type t = title * block list

  let p_indent = 7                                  (* paragraph indentation. *)
  let l_indent = 4                                      (* label indentation. *)
  let escape subst esc buf s =
    let subst s =
      let len = String.length s in
      if not (len > 1 && s.[1] = ',') then (subst s) else
      if len = 2 then "" else
      esc s.[0] (String.sub s 2 (len - 2))
    in
    try
      Buffer.clear buf; Buffer.add_substitute buf subst s;
      let s = Buffer.contents buf in (* twice for $(i,$(mname)). *)
      Buffer.clear buf; Buffer.add_substitute buf subst s;
      Buffer.contents buf
    with Not_found -> invalid_arg (err_doc_string s)

  let pr_tokens ?(groff = false) ppf s =
    let is_space = function ' ' | '\n' | '\r' | '\t' -> true | _ -> false in
    let len = String.length s in
    let i = ref 0 in
    try while (true) do
        while (!i < len && is_space s.[!i]) do incr i done;
        let start = !i in
        if start = len then raise Exit;
        while (!i < len && not (is_space s.[!i]) && not (s.[!i] = '-')) do
          incr i
        done;
        pr_str ppf (String.sub s start (!i - start));
        if !i = len then raise Exit;
        if s.[!i] = '-' then
          (incr i; if groff then pr_str ppf "\\-" else pr_char ppf '-');
        if (!i < len && is_space s.[!i]) then
          (if groff then pr_char ppf ' ' else Format.pp_print_space ppf ())
      done with Exit -> ()

  (* Plain text output *)

  let plain_esc c s = match c with 'g' -> "" (* groff specific *) | _ ->  s
  let pr_indent ppf c = for i = 1 to c do pr_char ppf ' ' done
  let pr_plain_blocks subst ppf ts =
    let buf = Buffer.create 1024 in
    let escape t = escape subst plain_esc buf t in
    let pr_tokens ppf t = pr_tokens ppf (escape t) in
    let rec aux = function
    | [] -> ()
    | t :: ts ->
        begin match t with
        | `Noblank -> ()
        | `P s -> pr ppf "%a@[%a@]@," pr_indent p_indent pr_tokens s
        | `S s -> pr ppf "@[%a@]" pr_tokens s
        | `Pre s -> pr ppf "%a@[%a@]@," pr_indent p_indent pr_lines (escape s)
        | `I (label, s) ->
            let label = escape label in
            let ll = String.length label in
            pr ppf "@[%a@[%a@]" pr_indent p_indent pr_tokens label;
            if s = "" then () else
            if ll < l_indent then
              pr ppf "%a@[%a@]@]@," pr_indent (l_indent - ll) pr_tokens s
            else
            pr ppf "@\n%a@[%a@]@]@,"
              pr_indent (p_indent + l_indent) pr_tokens s
        end;
        begin match ts with
        | `Noblank :: ts -> aux ts
        | ts -> Format.pp_print_cut ppf (); aux ts
        end
    in
    aux ts

  let pr_plain_page subst ppf (_, text) =
    pr ppf "@[<v>%a@]" (pr_plain_blocks subst) text

  (* Groff output *)

  let groff_esc c s = match c with
  | 'i' -> (str "\\fI%s\\fR" s)
  | 'b' -> (str "\\fB%s\\fR" s)
  | 'p' -> "" (* plain text specific *)
  | _ -> s

  let pr_groff_lines ppf s =
    let left = ref 0 and right = ref 0 and len = String.length s in
    let flush () =
      Format.pp_print_string ppf (String.sub s !left (!right - !left));
      incr right; left := !right;
    in
    while (!right <> len) do
      if s.[!right] = '\n' then (flush (); Format.pp_force_newline ppf ()) else
      if s.[!right] = '-' then (flush (); pr_str ppf "\\-") else
      incr right;
    done;
    if !left <> len then flush ()

  let pr_groff_blocks subst ppf text =
    let buf = Buffer.create 1024 in
    let escape t = escape subst groff_esc buf t in
    let pr_tokens ppf t = pr_tokens ~groff:true ppf (escape t) in
    let pr_block = function
    | `P s -> pr ppf "@\n.P@\n%a" pr_tokens s
    | `Pre s -> pr ppf "@\n.P@\n.nf@\n%a@\n.fi" pr_groff_lines (escape s)
    | `S s -> pr ppf "@\n.SH %a" pr_tokens s
    | `Noblank -> pr ppf "@\n.sp -1"
    | `I (l, s) -> pr ppf "@\n.TP 4@\n%a@\n%a" pr_tokens l pr_tokens s
    in
    List.iter pr_block text

  let pr_groff_page subst ppf ((n, s, a1, a2, a3), t) =
    pr ppf ".\\\" Pipe this output to groff -man -Tutf8 | less@\n\
            .\\\"@\n\
            .TH \"%s\" %d \"%s\" \"%s\" \"%s\"@\n\
            .\\\" Disable hyphenation and ragged-right@\n\
            .nh@\n\
      .ad l\
      %a@?"
      n s a1 a2 a3 (pr_groff_blocks subst) t

  (* Printing to a pager *)

  let find_cmd cmds =
    let test, null = match Sys.os_type with
    | "Win32" -> "where", " NUL"
    | _ -> "type", "/dev/null"
    in
    let cmd c = Sys.command (str "%s %s 1>%s 2>%s" test c null null) = 0 in
    try Some (List.find cmd cmds) with Not_found -> None

  let pr_to_pager print ppf v =
    let pager =
      let cmds = ["less"; "more"] in
      let cmds = try (Sys.getenv "PAGER") :: cmds with Not_found -> cmds in
      let cmds = try (Sys.getenv "MANPAGER") :: cmds with Not_found -> cmds in
      find_cmd cmds
    in
    match pager with
    | None -> print `Plain ppf v
    | Some pager ->
        let cmd = match (find_cmd ["groff"; "nroff"]) with
        | None ->
            begin match pr_to_temp_file (print `Plain) v with
            | None -> None
            | Some f -> Some (str "%s < %s" pager f)
            end
        | Some c ->
            begin match pr_to_temp_file (print `Groff) v with
            | None -> None
            | Some f ->
                (* TODO use -Tutf8, but annoyingly maps U+002D to U+2212. *)
                let xroff = if c = "groff" then c ^ " -Tascii -P-c" else c in
                Some (str "%s -man < %s | %s" xroff f pager)
            end
        in
        match cmd with
        | None -> print `Plain ppf v
        | Some cmd -> if (Sys.command cmd) <> 0 then print `Plain ppf v

  let rec print ?(subst = fun x -> x) fmt ppf page = match fmt with
  | `Pager -> pr_to_pager (print ~subst) ppf page
  | `Plain -> pr_plain_page subst ppf page
  | `Groff -> pr_groff_page subst ppf page
end

module Help = struct
  let invocation ?(sep = ' ') ei = match eval_kind ei with
  | `Simple | `M_main -> (fst ei.main).name
  | `M_choice -> str "%s%c%s" (fst ei.main).name sep (fst ei.term).name

  let title ei =
    let prog = String.capitalize (fst ei.main).name in
    let name = String.uppercase (invocation ~sep:'-' ei) in
    let left_footer = prog ^ match (fst ei.main).version with
      | None -> "" | Some v -> str " %s" v
    in
    let center_header = str "%s Manual" prog in
    name, 1, "", left_footer, center_header

  let name_section ei =
    let tdoc d = if d = "" then "" else (str " - %s" d) in
    [`S "NAME"; `P (str "%s%s" (invocation ~sep:'-' ei)
                      (tdoc (fst ei.term).tdoc)); ]

  let synopsis ei = match eval_kind ei with
  | `M_main -> str "$(b,%s) $(i,COMMAND) ..." (invocation ei)
  | `Simple | `M_choice ->
      let rev_cmp (p, _) (p', _) = match p', p with        (* best effort. *)
      | p, All -> -1 | All, p -> 1
      | Left _, Right _ -> -1 | Right _, Left _ -> 1
      | Left (false, k), Nth (false, k')
      | Nth (false, k), Nth (false, k')
      | Nth (false, k), Right (false, k') -> if k <= k' then -1 else 1
      | Nth (false, k), Left (false, k')
      | Right (false, k), Nth (false, k') -> if k >= k' then 1 else -1
      | Left (true, k), Nth (true, k')
      | Nth (true, k), Nth (true, k')
      | Nth (true, k), Right (true, k') -> if k >= k' then -1 else 1
      | Nth (true, k), Left (true, k')
      | Right (true, k), Nth (true, k') -> if k <= k' then 1 else -1
      | p, p' -> compare p p'
      in
      let rec format_pos acc = function
      | a :: al ->
          if is_opt a then format_pos acc al else
          let v = if a.docv = "" then "$(i,ARG)" else str "$(i,%s)" a.docv in
          let v = if a.absent = Error then str "%s" v else str "[%s]" v in
          let v = v ^ match a.p_kind with Nth _ -> "" | _ -> "..." in
          format_pos ((a.p_kind, v) :: acc) al
      | [] -> acc
      in
      let args = List.sort rev_cmp (format_pos [] (snd ei.term)) in
      let args = String.concat " " (List.rev_map snd args) in
      str "$(b,%s) [$(i,OPTION)]... %s" (invocation ei) args

  let get_synopsis_section ei =
    let rec extract_synopsis syn = function
    | `S _ :: _ as man -> List.rev syn, man
    |  block :: rest -> extract_synopsis (block :: syn) rest
    | [] -> List.rev syn, []
    in
    match (fst ei.term).man with
    | `S "SYNOPSIS" as s :: rest -> extract_synopsis [s] rest (* user-defined *)
    | man -> [ `S "SYNOPSIS"; `P (synopsis ei); ], man           (* automatic *)

  let or_env a = match a.env_info with
  | None -> ""
  | Some v -> str " or $(i,%s) env" v.env_var

  let make_arg_label a =
    if is_pos a then str "$(i,%s)" a.docv else
    let fmt_name var = match a.o_kind with
    | Flag -> fun n -> str "$(b,%s)%s" n (or_env a)
    | Opt ->
        fun n ->
          if String.length n > 2 then str "$(b,%s)=$(i,%s)" n var else
          str "$(b,%s) $(i,%s)" n var
    | Opt_vopt _ ->
        fun n ->
          if String.length n > 2 then str "$(b,%s)[=$(i,%s)]" n var else
          str "$(b,%s) [$(i,%s)]" n var
    in
    let var = if a.docv = "" then "VAL" else a.docv in
    let names = List.sort compare a.o_names in
    let s = String.concat ", " (List.rev_map (fmt_name var) names) in
    s

  let arg_info_substs ~buf a doc =
    let subst = function
    | "docv" -> str "$(i,%s)" a.docv
    | "opt" when is_opt a ->
        let k = String.lowercase (List.hd (List.sort compare a.o_names)) in
        str "$(b,%s)" k
    | "env" when a.env_info <> None ->
        begin match a.env_info with
        | None -> assert false
        | Some v -> str "$(i,%s)" v.env_var
        end
    | s -> str "$(%s)" s in
    try
      Buffer.clear buf;
      Buffer.add_substitute buf subst doc;
      Buffer.contents buf
    with Not_found -> invalid_arg (err_doc_string doc)

  let make_arg_items ei =
    let buf = Buffer.create 200 in
    let cmp a a' =
      let c = compare a.docs a'.docs in
      if c <> 0 then c else
      match is_opt a, is_opt a' with
      | true, true ->
          let key names =
            let k = String.lowercase (List.hd (List.sort rev_compare names)) in
            if k.[1] = '-' then String.sub k 1 (String.length k - 1) else k
          in
          compare (key a.o_names) (key a'.o_names)
      | false, false ->
          compare (String.lowercase a.docv) (String.lowercase a'.docv)
      | true, false -> -1
      | false, true -> 1
    in
    let format a =
      let absent = match a.absent with
      | Error -> ""
      | Val v -> match Lazy.force v with
      | "" -> ""
      | v -> str "absent=%s%s" v (or_env a)
      in
      let optvopt = match a.o_kind with
      | Opt_vopt v -> str "default=%s" v
      | _ -> ""
      in
      let argvdoc = match optvopt, absent with
      | "", "" -> ""
      | s, "" | "", s -> str " (%s)" s
      | s, s' -> str " (%s) (%s)" s s'
      in
      (a.docs, `I (make_arg_label a ^ argvdoc, (arg_info_substs ~buf a a.doc)))
    in
    let is_arg_item a = not (is_pos a && (a.docv = "" || a.doc = "")) in
    let l = List.sort cmp (List.filter is_arg_item (snd ei.term)) in
    List.rev_map format l

  let make_env_items_rev ei =
    let buf = Buffer.create 200 in
    let cmp a a' =
      let e' = match a'.env_info with None -> assert false | Some a' -> a' in
      let e = match a.env_info with None -> assert false | Some a -> a in
      let c = compare e.env_docs e'.env_docs in
      if c <> 0 then c else
      compare e.env_var e'.env_var
    in
    let format a =
      let e = match a.env_info with None -> assert false | Some a -> a in
      (e.env_docs,
       `I (str "$(i,%s)" e.env_var, arg_info_substs ~buf a e.env_doc))
    in
    let is_env_item a = a.env_info <> None in
    let l = List.sort cmp (List.filter is_env_item (snd ei.term)) in
    List.rev_map format l

  let make_cmd_items ei = match eval_kind ei with
  | `Simple | `M_choice -> []
  | `M_main ->
      let add_cmd acc (ti, _) =
        (ti.tdocs, `I ((str "$(b,%s)" ti.name), ti.tdoc)) :: acc
      in
      List.sort rev_compare (List.fold_left add_cmd [] ei.choices)

  let text ei =                  (* man that code is particulary unreadable. *)
    let rec merge_items acc to_insert mark il = function
    | `S s as sec :: ts ->
        let acc = List.rev_append to_insert acc in
        let acc = if mark then sec :: `Orphan_mark :: acc else sec :: acc in
        let to_insert, il = List.partition (fun (n, _) -> n = s) il in
        let to_insert = List.rev_map (fun (_, i) -> i) to_insert in
        let to_insert = (to_insert :> [ `Orphan_mark | Manpage.block] list) in
        merge_items acc to_insert (s = "DESCRIPTION") il ts
    | t :: ts ->
        let t = (t :> [`Orphan_mark | Manpage.block]) in
        merge_items (t :: acc) to_insert mark il ts
    | [] ->
        let acc = List.rev_append to_insert acc in
        (if mark then `Orphan_mark :: acc else acc), il
    in
    let rec merge_orphans acc orphans = function
    | `Orphan_mark :: ts ->
        let rec merge acc s = function
        | [] -> (`S s) :: acc
        | (s', i) :: ss ->
            let i = (i :> Manpage.block) in
            if s = s' then merge (i :: acc) s ss else
            merge (i :: (`S s) :: acc) s' ss
        in
        let acc = match orphans with
        | [] -> acc | (s, _) :: _ -> merge acc s orphans
        in
        merge_orphans acc [] ts
    | (#Manpage.block as e) :: ts -> merge_orphans (e :: acc) orphans ts
    | [] -> acc
    in
    let cmds = make_cmd_items ei in
    let args = make_arg_items ei in
    let envs_rev = make_env_items_rev ei in
    let items_rev = List.rev_append cmds (List.rev_append args envs_rev) in
    let cmp (s, _) (s', _) = match s, s with
    | "ENVIRONMENT VARIABLES", _ -> 1  (* Put env vars at the end. *)
    | s, "ENVIRONMENT VARIABLES" -> -1
    | s, s' -> compare s s' (* other predefined sec. names order correctly *)
    in
    let items = List.rev (List.stable_sort cmp items_rev) in
    let synopsis, man = get_synopsis_section ei in
    let rev_text, orphans = merge_items [`Orphan_mark] [] false items man in
    synopsis @ merge_orphans [] orphans rev_text

  let ei_subst ei = function
  | "tname" -> (fst ei.term).name
  | "mname" -> (fst ei.main).name
  | s -> str "$(%s)" s

  let man ei =
    title ei, (name_section ei) @ (text ei)

  let print fmt ppf ei = Manpage.print ~subst:(ei_subst ei) fmt ppf (man ei)
  let pr_synopsis ppf ei =
    pr ppf "@[%s@]"
      (Manpage.escape (ei_subst ei)
         Manpage.plain_esc (Buffer.create 100) (synopsis ei))

  let pr_version ppf ei = match (fst ei.main).version with
  | None -> assert false
  | Some v -> pr ppf "@[%a@]@." pr_text v
end

(* Errors for the command line user *)

module Err = struct
  let invalid kind s exp = str "invalid %s %s, %s" kind (quote s) exp
  let invalid_val = invalid "value"
  let no kind s = str "no %s %s" (quote s) kind
  let not_dir s = str "%s is not a directory" (quote s)
  let is_dir s = str "%s is a directory" (quote s)
  let element kind s exp = str "invalid element in %s (`%s'): %s" kind s exp
  let sep_miss sep s = invalid_val s (str "missing a `%c' separator" sep)
  let unknown kind ?(hints = []) v =
    let did_you_mean s = str ", did you mean %s ?" s in
    let hints = match hints with [] -> "." | hs -> did_you_mean (alts_str hs) in
    str "unknown %s %s%s" kind (quote v) hints

  let ambiguous kind s ambs =
    str "%s %s ambiguous and could be %s" kind (quote s) (alts_str ambs)

  let pos_excess excess =
    str "too many arguments, don't know what to do with %s"
      (String.concat ", " (List.map quote excess))

  let flag_value f v =
    str "option %s is a flag, it cannot take the argument %s"
      (quote f) (quote v)

  let opt_value_missing f = str "option %s needs an argument" (quote f)
  let opt_parse_value f e = str "option %s: %s" (quote f) e
  let env_parse_value var e = str "environment variable %s: %s" (quote var) e
  let opt_repeated f f' =
    if f = f' then str "option %s cannot be repeated" (quote f) else
    str "options %s and %s cannot be present at the same time" (quote f)
      (quote f')

  let pos_parse_value a e =
    if a.docv = "" then e else match a.p_kind with
    | Nth _ -> str "%s argument: %s" a.docv e
    | _ -> str "%s... arguments: %s" a.docv e

  let arg_missing a =
    if is_opt a then
      let rec long_name = function
      | n :: l -> if (String.length n) > 2 || l = [] then n else long_name l
      | [] -> assert false
      in
      str "required option %s is missing" (long_name a.o_names)
    else
    if a.docv = "" then str "a required argument is missing" else
    str "required argument %s is missing" a.docv

  (* Error printers *)

  let print ppf ei e = pr ppf "%s: @[%a@]@." (fst ei.main).name pr_text e
  let pr_backtrace err ei e bt =
    let bt =
      let len = String.length bt in
      if len > 0 then String.sub bt 0 (len - 1) (* remove final '\n' *) else bt
    in
    pr err
      "%s: @[internal error, uncaught exception:@\n%a@]@."
      (fst ei.main).name pr_lines (str "%s\n%s" (Printexc.to_string e) bt)

  let pr_try_help ppf ei =
    let exec = Help.invocation ei in
    let main = (fst ei.main).name in
    if exec = main then
      pr ppf "@[<2>Try `%s --help' for more information.@]" exec
    else
    pr ppf "@[<2>Try `%s --help' or `%s --help' for more information.@]"
      exec main

  let pr_usage ppf ei e =
    pr ppf "@[<v>%s: @[%a@]@,@[Usage: @[%a@]@]@,%a@]@."
      (fst ei.main).name pr_text e Help.pr_synopsis ei pr_try_help ei
end

(* Command lines. A command line stores pre-parsed information about
   the command line's arguments in a more structured way. Given the
   [arg_info] values mentionned in a term and Sys.argv (whithout exec
   name) we parse the command line into a map of [arg_info] values to
   [arg] values. This map is used by the term's closures to retrieve
   and convert command line arguments (see the Arg module). *)

module Cmdline :sig
  exception Error of string
  val choose_term : term_info -> (term_info * 'a) list -> string list ->
    term_info * string list
  val create : ?peek_opts:bool -> arg_info list -> string list -> cmdline
  val opt_arg : cmdline -> arg_info -> (int * string * (string option)) list
  val pos_arg : cmdline -> arg_info -> string list
end = struct
  exception Error of string

  let opt_arg cl a = match try Amap.find a cl with Not_found -> assert false
  with O l -> l | _ -> assert false

  let pos_arg cl a = match try Amap.find a cl with Not_found -> assert false
  with P l -> l | _ -> assert false

  let choose_term ti choices = function
  | [] -> ti, []
  | maybe :: args' as args ->
      if String.length maybe > 1 && maybe.[0] = '-' then ti, args else
      let index =
        let add acc (choice, _) = Trie.add acc choice.name choice in
        List.fold_left add Trie.empty choices
      in
      match Trie.find index maybe with
      | `Ok choice -> choice, args'
      | `Not_found ->
        let all = Trie.ambiguities index "" in
        let hints = suggest maybe all in
        raise (Error (Err.unknown "command" ~hints maybe))
      | `Ambiguous ->
          let ambs = List.sort compare (Trie.ambiguities index maybe) in
          raise (Error (Err.ambiguous "command" maybe ambs))

  let arg_info_indexes al =
    (* from [al] returns a trie mapping the names of optional arguments to
       their arg_info, a list with all arg_info for positional arguments and
       a cmdline mapping each arg_info to an empty [arg]. *)
    let rec aux opti posi cl = function
    | a :: l ->
        if is_pos a then aux opti (a :: posi) (Amap.add a (P []) cl) l else
        let add t name = Trie.add t name a in
        aux (List.fold_left add opti a.o_names) posi (Amap.add a (O []) cl) l
    | [] -> opti, posi, cl
    in
    aux Trie.empty [] Amap.empty al

  let parse_opt_arg s =          (* (name,value) of opt arg, assert len > 1. *)
    let l = String.length s in
    if s.[1] <> '-' then
      if l = 2 then s, None else
      String.sub s 0 2, Some (String.sub s 2 (l - 2))
    else try
      let i = String.index s '=' in
      String.sub s 0 i, Some (String.sub s (i + 1) (l - i - 1))
    with Not_found -> s, None

  let parse_args ~peek_opts opti cl args =
    (* returns an updated [cl] cmdline according to the options found in [args]
       with the trie index [opti]. Positional arguments are returned in order
       in a list. *)
    let rec aux k opti cl pargs = function
    | [] -> cl, (List.rev pargs)
    | "--" :: args -> cl, (List.rev_append pargs args)
    | s :: args ->
        let is_opt s = String.length s > 1 && s.[0] = '-' in
        let is_short_opt s = String.length s = 2 && s.[0] = '-' in
        if not (is_opt s) then aux (k+1) opti cl (s :: pargs) args else
        let name, value = parse_opt_arg s in
        match Trie.find opti name with
        | `Ok a ->
            let value, args = match value, a.o_kind with
            | Some v, Flag when is_short_opt name -> None, ("-" ^ v) :: args
            | Some v, _ -> value, args
            | None, Flag -> value, args
            | None, _ ->
                match args with
                | v :: rest -> if is_opt v then None, args else Some v, rest
                | [] -> None, args
            in
            let arg = O ((k, name, value) :: opt_arg cl a) in
            aux (k+1) opti (Amap.add a arg cl) pargs args
        | `Not_found when peek_opts -> aux (k+1) opti cl pargs args (* skip *)
        | `Not_found ->
            let hints =
              if String.length s <= 2 then [] else
              let short_opt, long_opt =
                if s.[1] <> '-'
                then s, Printf.sprintf "-%s" s
                else String.sub s 1 (String.length s - 1), s
              in
              let short_opt, _ = parse_opt_arg short_opt in
              let long_opt, _ = parse_opt_arg long_opt in
              let all = Trie.ambiguities opti "-" in
              match List.mem short_opt all, suggest long_opt all with
              | false, [] -> []
              | false, l -> l
              | true, [] -> [short_opt]
              | true, l -> if List.mem short_opt l then l else short_opt :: l
            in
            raise (Error (Err.unknown "option" ~hints name))
        | `Ambiguous ->
            let ambs = List.sort compare (Trie.ambiguities opti name) in
            raise (Error (Err.ambiguous "option" name ambs))
    in
    aux 0 opti cl [] args

  let process_pos_args posi cl pargs =
    (* returns an updated [cl] cmdline in which each positional arg mentionned
       in the list index posi, is given a value according the list
       of positional arguments values [pargs]. *)
    if pargs = [] then cl else
    let rec take n acc l =
      if n = 0 then List.rev acc else
      take (n - 1) (List.hd l :: acc) (List.tl l)
    in
    let rec aux pargs last cl max_spec = function
    | a :: al ->
        let arg, max_spec = match a.p_kind with
        | All -> P pargs, last
        | Nth (rev, k) ->
            let k = if rev then last - k else k in
            let max_spec = max k max_spec in
            if k < 0 || k > last then P [], max_spec else
            P ([List.nth pargs k]), max_spec
        | Left (rev, k) ->
            let k = if rev then last - k else k in
            let max_spec = max k max_spec in
            if k <= 0 || k > last then P [], max_spec else
            P (take k [] pargs), max_spec
        | Right (rev, k) ->
            let k = if rev then last - k else k in
            if k < 0 || k >= last then P [], last else
            P (List.rev (take (last - k) [] (List.rev pargs))), last
        in
        aux pargs last (Amap.add a arg cl) max_spec al
    | [] -> cl, max_spec
    in
    let last = List.length pargs - 1 in
    let cl, max_spec = aux pargs last cl (-1) posi in
    if last <= max_spec then cl else
    let excess = List.rev (take (last - max_spec) [] (List.rev pargs)) in
    raise (Error (Err.pos_excess excess))

  let create ?(peek_opts = false) al args =
    let opti, posi, cl = arg_info_indexes al in
    let cl, pargs = parse_args ~peek_opts opti cl args in
    if peek_opts then cl (* skip positional arguments *) else
    process_pos_args posi cl pargs
end

module Arg = struct
  type 'a parser = string -> [ `Ok of 'a | `Error of string ]
  type 'a printer = Format.formatter -> 'a -> unit
  type 'a converter = 'a parser * 'a printer
  type env = env_info
  type 'a arg_converter = (eval_info -> cmdline -> 'a)
  type 'a t = arg_info list * 'a arg_converter
  type info = arg_info

  let env_var ?(docs = "ENVIRONMENT VARIABLES") ?(doc = "See option $(opt).")
      env_var
    =
    { env_var = env_var; env_doc = doc; env_docs = docs }

  let ( & ) f x = f x
  let parse_error e = raise (Cmdline.Error e)
  let some ?(none = "") (parse, print) =
    (fun s -> match parse s with `Ok v -> `Ok (Some v) | `Error _ as e -> e),
    (fun ppf v -> match v with None -> pr_str ppf none| Some v -> print ppf v)

  let info ?docs ?(docv = "") ?(doc = "") ?env names =
    let dash n = if String.length n = 1 then "-" ^ n else "--" ^ n in
    let docs = match docs with
    | None -> if names = [] then "ARGUMENTS" else "OPTIONS"
    | Some s -> s
    in
    { id = arg_id (); absent = Val (lazy "");
      env_info = env;
      doc = doc; docv = docv; docs = docs;
      p_kind = All; o_kind = Flag; o_names = List.rev_map dash names;
      o_all = false; }

  let env_bool_parse s = match String.lowercase s with
  | "" | "false" | "no" | "n" | "0" -> `Ok false
  | "true" | "yes" | "y" | "1" -> `Ok true
  | s -> `Error (Err.invalid_val s (alts_str ["true"; "yes"; "false"; "no" ]))

  let parse_to_list parser s = match parser s with
  | `Ok v -> `Ok [v]
  | `Error _ as e -> e

  let try_env ei a parse ~absent = match a.env_info with
  | None -> absent
  | Some env ->
      match ei.env env.env_var with
      | None -> absent
      | Some v ->
          match parse v with
          | `Ok v -> v
          | `Error e ->
              parse_error (Err.env_parse_value env.env_var e)

  let flag a =
    if is_pos a then invalid_arg err_not_opt else
    let convert ei cl = match Cmdline.opt_arg cl a with
    | [] -> try_env ei a env_bool_parse ~absent:false
    | [_, _, None] -> true
    | [_, f, Some v] -> parse_error (Err.flag_value f v)
    | (_, f, _) :: (_ ,g, _) :: _  -> parse_error (Err.opt_repeated f g)
    in
    [a], convert

  let flag_all a =
    if is_pos a then invalid_arg err_not_opt else
    let a = { a with o_all = true } in
    let convert ei cl = match Cmdline.opt_arg cl a with
    | [] -> try_env ei a (parse_to_list env_bool_parse) ~absent:[]
    | l ->
        let truth (_, f, v) = match v with
        | None -> true | Some v -> parse_error (Err.flag_value f v)
        in
        List.rev_map truth l
    in
    [a], convert

  let vflag v l =
    let convert _ cl =
      let rec aux fv = function
      | (v, a) :: rest ->
          begin match Cmdline.opt_arg cl a with
          | [] -> aux fv rest
          | [_, f, None] ->
              begin match fv with
              | None -> aux (Some (f, v)) rest
              | Some (g, _) -> parse_error (Err.opt_repeated g f)
              end
          | [_, f, Some v] -> parse_error (Err.flag_value f v)
          | (_, f, _) :: (_, g, _) :: _ -> parse_error (Err.opt_repeated g f)
          end
      | [] -> match fv with None -> v | Some (_, v) -> v
      in
      aux None l
    in
    let flag (_, a) = if is_pos a then invalid_arg err_not_opt else a in
    List.rev_map flag l, convert

  let vflag_all v l =
    let convert _ cl =
      let rec aux acc = function
      | (fv, a) :: rest ->
          begin match Cmdline.opt_arg cl a with
          | [] -> aux acc rest
          | l ->
              let fval (k, f, v) = match v with
              | None -> (k, fv) | Some v -> parse_error (Err.flag_value f v)
              in
              aux (List.rev_append (List.rev_map fval l) acc) rest
          end
      | [] ->
          if acc = [] then v else List.rev_map snd (List.sort rev_compare acc)
      in
      aux [] l
    in
    let flag (_, a) =
      if is_pos a then invalid_arg err_not_opt else { a with o_all = true }
    in
    List.rev_map flag l, convert

  let parse_opt_value parse f v = match parse v with
  | `Ok v -> v | `Error e -> parse_error (Err.opt_parse_value f e)

  let opt ?vopt (parse, print) v a =
    if is_pos a then invalid_arg err_not_opt else
    let a = { a with absent = Val (lazy (str_of_pp print v));
                     o_kind = match vopt with
                     | None -> Opt | Some dv -> Opt_vopt (str_of_pp print dv) }
    in
    let convert ei cl = match Cmdline.opt_arg cl a with
    | [] -> try_env ei a parse ~absent:v
    | [_, f, Some v] -> parse_opt_value parse f v
    | [_, f, None] ->
        begin match vopt with
        | None -> parse_error (Err.opt_value_missing f)
        | Some optv -> optv
        end
    | (_, f, _) :: (_, g, _) :: _ -> parse_error (Err.opt_repeated g f)
    in
    [a], convert

  let opt_all ?vopt (parse, print) v a =
    if is_pos a then invalid_arg err_not_opt else
    let a = { a with absent = Val (lazy ""); o_all = true;
                     o_kind = match vopt with
                     | None -> Opt | Some dv -> Opt_vopt (str_of_pp print dv) }
    in
    let convert ei cl = match Cmdline.opt_arg cl a with
    | [] -> try_env ei a (parse_to_list parse) ~absent:v
    | l ->
        let parse (k, f, v) = match v with
        | Some v -> (k, parse_opt_value parse f v)
        | None -> match vopt with
        | None -> parse_error (Err.opt_value_missing f)
        | Some dv -> (k, dv)
        in
        List.rev_map snd (List.sort rev_compare (List.rev_map parse l))
    in
    [a], convert

  (* Positional arguments *)

  let parse_pos_value parse a v = match parse v with
  | `Ok v -> v | `Error e -> parse_error (Err.pos_parse_value a e)

  let pos ?(rev = false) k (parse, print) v a =
    if is_opt a then invalid_arg err_not_pos else
    let a = { a with p_kind = Nth (rev, k);
                     absent = Val (lazy (str_of_pp print v)) }
    in
    let convert ei cl = match Cmdline.pos_arg cl a with
    | [] -> try_env ei a parse ~absent:v
    | [v] -> parse_pos_value parse a v
    | _ -> assert false
    in
    [a], convert

  let pos_list kind (parse, _) v a =
    if is_opt a then invalid_arg err_not_pos else
    let a = { a with p_kind = kind } in
    let convert ei cl = match Cmdline.pos_arg cl a with
    | [] -> try_env ei a (parse_to_list parse) ~absent:v
    | l -> List.rev (List.rev_map (parse_pos_value parse a) l)
    in
    [a], convert

  let pos_all c v a = pos_list All c v a
  let pos_left ?(rev = false) k = pos_list (Left (rev, k))
  let pos_right ?(rev = false) k = pos_list (Right (rev, k))

  (* Arguments as terms *)

  let absent_error al = List.rev_map (fun a -> { a with absent = Error }) al
  let value a = a
  let required (al, convert) =
    let al = absent_error al in
    let convert ei cl = match convert ei cl with
    | Some v -> v
    | None -> parse_error (Err.arg_missing (List.hd al))
    in
    al, convert

  let non_empty (al, convert) =
    let al = absent_error al in
    let convert ei cl = match convert ei cl with
    | [] -> parse_error (Err.arg_missing (List.hd al))
    | l -> l
    in
    al, convert

  let last (al, convert) =
    let convert ei cl = match convert ei cl with
    | [] -> parse_error (Err.arg_missing (List.hd al))
    | l -> List.hd (List.rev l)
    in
    al, convert

  (* Predefined converters. *)

  let bool =
    (fun s -> try `Ok (bool_of_string s) with Invalid_argument _ ->
        `Error (Err.invalid_val s (alts_str ["true"; "false"]))),
    Format.pp_print_bool

  let char =
    (fun s -> if String.length s = 1 then `Ok s.[0] else
      `Error (Err.invalid_val s "expected a character")),
    pr_char

  let parse_with t_of_str exp s =
    try `Ok (t_of_str s) with Failure _ -> `Error (Err.invalid_val s exp)

  let int =
    parse_with int_of_string "expected an integer", Format.pp_print_int

  let int32 =
    parse_with Int32.of_string "expected a 32-bit integer",
    (fun ppf -> pr ppf "%ld")

  let int64 =
    parse_with Int64.of_string "expected a 64-bit integer",
    (fun ppf -> pr ppf "%Ld")

  let nativeint =
    parse_with Nativeint.of_string "expected a processor-native integer",
    (fun ppf -> pr ppf "%nd")

  let float =
    parse_with float_of_string "expected a floating point number",
    Format.pp_print_float

  let string = (fun s -> `Ok s), pr_str
  let enum sl =
    if sl = [] then invalid_arg err_empty_list else
    let t = Trie.of_list sl in
    let parse s = match Trie.find t s with
    | `Ok _ as r -> r
    | `Ambiguous ->
        let ambs = List.sort compare (Trie.ambiguities t s) in
        `Error (Err.ambiguous "enum value" s ambs)
    | `Not_found ->
        let alts = List.rev (List.rev_map (fun (s, _) -> s) sl) in
        `Error (Err.invalid_val s ("expected " ^ (alts_str alts)))
    in
    let print ppf v =
      let sl_inv = List.rev_map (fun (s,v) -> (v,s)) sl in
      try pr_str ppf (List.assoc v sl_inv)
      with Not_found -> invalid_arg err_incomplete_enum
    in
    parse, print

  let file =
    (fun s -> if Sys.file_exists s then `Ok s else
      `Error (Err.no "file or directory" s)),
    pr_str

  let dir =
    (fun s ->
       if Sys.file_exists s then
         if Sys.is_directory s then `Ok s else `Error (Err.not_dir s)
       else
       `Error (Err.no "directory" s)),
    pr_str

  let non_dir_file =
    (fun s ->
       if Sys.file_exists s then
         if not (Sys.is_directory s) then `Ok s else `Error (Err.is_dir s)
       else
       `Error (Err.no "file" s)),
    pr_str

  let split_and_parse sep parse s =
    let parse sub = match parse sub with
    | `Error e -> failwith e | `Ok v -> v in
    let rec split accum j =
      let i = try String.rindex_from s j sep with Not_found -> -1 in
      if (i = -1) then
        let p = String.sub s 0 (j + 1) in
        if p <> "" then parse p :: accum else accum
      else
      let p = String.sub s (i + 1) (j - i) in
      let accum' = if p <> "" then parse p :: accum else accum in
      split accum' (i - 1)
    in
    split [] (String.length s - 1)

  let list ?(sep = ',') (parse, pr_e) =
    let parse s = try `Ok (split_and_parse sep parse s) with
    | Failure e -> `Error (Err.element "list" s e)
    in
    let rec print ppf = function
    | v :: l -> pr_e ppf v; if (l <> []) then (pr_char ppf sep; print ppf l)
    | [] -> ()
    in
    parse, print

  let array ?(sep = ',') (parse, pr_e) =
    let parse s = try `Ok (Array.of_list (split_and_parse sep parse s)) with
    | Failure e -> `Error (Err.element "array" s e)
    in
    let print ppf v =
      let max = Array.length v - 1 in
      for i = 0 to max do pr_e ppf v.(i); if i <> max then pr_char ppf sep done
    in
    parse, print

  let split_left sep s =
    try
      let i = String.index s sep in
      let len = String.length s in
      Some ((String.sub s 0 i), (String.sub s (i + 1) (len - i - 1)))
    with Not_found -> None

  let pair ?(sep = ',') (pa0, pr0) (pa1, pr1) =
    let parser s = match split_left sep s with
    | None -> `Error (Err.sep_miss sep s)
    | Some (v0, v1) ->
        match pa0 v0, pa1 v1 with
        | `Ok v0, `Ok v1 -> `Ok (v0, v1)
        | `Error e, _ | _, `Error e -> `Error (Err.element "pair" s e)
    in
    let printer ppf (v0, v1) = pr ppf "%a%c%a" pr0 v0 sep pr1 v1 in
    parser, printer

  let t2 = pair
  let t3 ?(sep = ',') (pa0, pr0) (pa1, pr1) (pa2, pr2) =
    let parse s = match split_left sep s with
    | None -> `Error (Err.sep_miss sep s)
    | Some (v0, s) ->
        match split_left sep s with
        | None -> `Error (Err.sep_miss sep s)
        | Some (v1, v2) ->
            match pa0 v0, pa1 v1, pa2 v2 with
            | `Ok v0, `Ok v1, `Ok v2 -> `Ok (v0, v1, v2)
            | `Error e, _, _ | _, `Error e, _ | _, _, `Error e ->
                `Error (Err.element "triple" s e)
    in
    let print ppf (v0, v1, v2) =
      pr ppf "%a%c%a%c%a" pr0 v0 sep pr1 v1 sep pr2 v2
    in
    parse, print

  let t4 ?(sep = ',') (pa0, pr0) (pa1, pr1) (pa2, pr2) (pa3, pr3) =
    let parse s = match split_left sep s with
    | None -> `Error (Err.sep_miss sep s)
    | Some(v0, s) ->
        match split_left sep s with
        | None -> `Error (Err.sep_miss sep s)
        | Some (v1, s) ->
            match split_left sep s with
            | None -> `Error (Err.sep_miss sep s)
            | Some (v2, v3) ->
                match pa0 v0, pa1 v1, pa2 v2, pa3 v3 with
                | `Ok v1, `Ok v2, `Ok v3, `Ok v4 -> `Ok (v1, v2, v3, v4)
                | `Error e, _, _, _ | _, `Error e, _, _ | _, _, `Error e, _
                | _, _, _, `Error e -> `Error (Err.element "quadruple" s e)
    in
    let print ppf (v0, v1, v2, v3) =
      pr ppf "%a%c%a%c%a%c%a" pr0 v0 sep pr1 v1 sep pr2 v2 sep pr3 v3
    in
    parse, print

  (* Documentation formatting helpers *)

  let doc_quote = quote
  let doc_alts = alts_str
  let doc_alts_enum ?quoted enum = alts_str ?quoted (List.map fst enum)
end

module Term = struct
  type info = term_info
  type +'a t = arg_info list * (eval_info -> cmdline -> 'a)
  type 'a result = [
    | `Ok of 'a | `Error of [`Parse | `Term | `Exn ] | `Version | `Help ]

  exception Term of
      [ `Help of [`Pager | `Plain | `Groff] * string option
      | `Error of bool * string ]

  let info  ?(sdocs = "OPTIONS") ?(man = []) ?(docs = "COMMANDS") ?(doc = "")
      ?version name =
    { name = name; version = version; tdoc = doc; tdocs = docs; sdocs = sdocs;
      man = man }

  let name ti = ti.name
  let const v = [], (fun _ _ -> v)
  let pure (* deprecated *) = const
  let app (al, f) (al', v) =
    List.rev_append al al',
    fun ei cl -> (f ei cl) (v ei cl)

  let ( $ ) = app

  type 'a ret =
    [ `Help of [`Pager | `Plain | `Groff] * string option
    | `Error of (bool * string)
    | `Ok of 'a ]

  let ret (al, v) =
    al, fun ei cl -> match v ei cl with
    | `Ok v -> v
    | `Error (u,e) -> raise (Term (`Error (u,e)))
    | `Help h -> raise (Term (`Help h))

  let main_name = [], (fun ei _ -> (fst ei.main).name)
  let choice_names =
    [], fun ei _ -> List.rev_map (fun e -> (fst e).name) ei.choices

  let man_format =
    let fmts = ["pager", `Pager; "groff", `Groff; "plain", `Plain] in
    let doc = "Show output in format $(docv) (pager, plain or groff)."in
    Arg.(value & opt (enum fmts) `Pager & info ["man-format"] ~docv:"FMT" ~doc)

  (* Evaluation *)

  let remove_exec argv =
    try List.tl (Array.to_list argv) with Failure _ -> invalid_arg err_argv

  let add_std_opts ei =
    let docs = (fst ei.term).sdocs in
    let args, v_lookup =
      if (fst ei.main).version = None then [], None else
      let (a, lookup) =
        Arg.flag (Arg.info ["version"] ~docs ~doc:"Show version information.")
      in
      a, Some lookup
    in
    let args, h_lookup =
      let (a, lookup) =
        let fmt = Arg.enum ["pager",`Pager; "groff",`Groff; "plain",`Plain] in
        let doc = "Show this help in format $(docv) (pager, plain or groff)."in
        let a = Arg.info ["help"] ~docv:"FMT" ~docs ~doc in
        Arg.opt ~vopt:(Some `Pager) (Arg.some fmt) None a
      in
      List.rev_append a args, lookup
    in
    h_lookup, v_lookup,
    { ei with term = (fst ei.term), List.rev_append args (snd ei.term) }

  let eval_term help err ei f args =
    let help_arg, vers_arg, ei = add_std_opts ei in
    try
      let cl = Cmdline.create (snd ei.term) args in
      match help_arg ei cl, vers_arg with
      | Some fmt, _ -> Help.print fmt help ei; `Help
      | None, Some v_arg when v_arg ei cl -> Help.pr_version help ei; `Version
      | _ -> `Ok (f ei cl)
    with
    | Cmdline.Error e -> Err.pr_usage err ei e; `Error `Parse
    | Term (`Error (usage, e)) ->
        if usage then Err.pr_usage err ei e else Err.print err ei e;
        `Error `Term
    | Term (`Help (fmt, cmd)) ->
        let ei = match cmd with
        | Some cmd ->
            let cmd =
              try List.find (fun (i, _) -> i.name = cmd) ei.choices
              with Not_found -> invalid_arg (err_help cmd)
            in
            {ei with term = cmd }
        | None -> { ei with term = ei.main }
        in
        let _, _, ei = add_std_opts ei in
        Help.print fmt help ei; `Help

  let env_default v = try Some (Sys.getenv v) with Not_found -> None

  let eval ?(help = Format.std_formatter) ?(err = Format.err_formatter)
      ?(catch = true) ?(env = env_default) ?(argv = Sys.argv) ((al, f), ti) =
    let term = ti, al in
    let ei = { term = term; main = term; choices = []; env = env } in
    try eval_term help err ei f (remove_exec argv) with
    | e when catch ->
        Err.pr_backtrace err ei e (Printexc.get_backtrace ()); `Error `Exn

  let eval_choice ?(help = Format.std_formatter) ?(err = Format.err_formatter)
      ?(catch = true) ?(env = env_default) ?(argv = Sys.argv)
      (((al, f) as t), ti) choices =
    let ei_choices = List.rev_map (fun ((al, _), ti) -> ti, al) choices in
    let main = (ti, al) in
    let ei = { term = main; main = main; choices = ei_choices; env = env } in
    try
      let chosen, args = Cmdline.choose_term ti ei_choices (remove_exec argv) in
      let find_chosen (_, ti) = ti = chosen in
      let (al, f), _ = List.find find_chosen ((t, ti) :: choices) in
      let ei = { ei with term = (chosen, al) } in
      eval_term help err ei f args
    with
    | Cmdline.Error e ->                    (* may be raised by choose_term. *)
        Err.pr_usage err ei e; `Error `Parse
    | e when catch ->
        Err.pr_backtrace err ei e (Printexc.get_backtrace ()); `Error `Exn

  let eval_peek_opts ?(version_opt = false) ?(env = env_default)
      ?(argv = Sys.argv) (al, f) =
    let args = remove_exec argv in
    let version = if version_opt then Some "dummy" else None in
    let term = info ?version "dummy", al in
    let ei = { term = term; main = term; choices = []; env = env } in
    let help_arg, vers_arg, ei = add_std_opts ei in
    try
      let cl = Cmdline.create ~peek_opts:true (snd ei.term) args in
      match help_arg ei cl, vers_arg with
      | Some fmt, _ ->
          (try (Some (f ei cl), `Help) with e -> None, `Help)
      | None, Some v_arg when v_arg ei cl ->
          (try (Some (f ei cl), `Version) with e -> None, `Version)
      | _ ->
          let v = f ei cl in
          Some v, `Ok v
    with
    | Cmdline.Error _ -> None, (`Error `Parse)
    | Term _ -> None, (`Error `Term)
    | e -> None, (`Error `Exn)
end

(*---------------------------------------------------------------------------
   Copyright (c) 2011 Daniel C. Bünzli
   All rights reserved.

   Redistribution and use in source and binary forms, with or without
   modification, are permitted provided that the following conditions
   are met:

   1. Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.

   2. Redistributions in binary form must reproduce the above
      copyright notice, this list of conditions and the following
      disclaimer in the documentation and/or other materials provided
      with the distribution.

   3. Neither the name of Daniel C. Bünzli nor the names of
      contributors may be used to endorse or promote products derived
      from this software without specific prior written permission.

   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  ---------------------------------------------------------------------------*)

end
module Refmt_args
= struct
#1 "refmt_args.ml"
module Cmdliner = Vendored_cmdliner
open Cmdliner

let interface =
  let doc = "parse AST as an interface" in
  Arg.(value & opt (bool) false & info ["i"; "interface"] ~doc)

let recoverable =
  let doc = "enable recoverable parser" in
  Arg.(value & flag & info ["r"; "recoverable"] ~doc)

let explicit_arity =
  let doc =
    "if a constructor's argument is a tuple, always interpret it as \
     multiple arguments"
  in
  Arg.(value & flag & info ["e"; "assume-explicit-arity"] ~doc)

let parse_ast =
  let docv = "FORM" in
  let doc = "parse AST in FORM, which is one of: (ml | re | \
             binary (for compiler input) | \
             binary_reason (for interchange between Reason versions))"
  in
  let opts = Arg.enum ["ml", `ML; "re", `Reason; "binary", `Binary;
                       "binary_reason", `BinaryReason; "auto", `Auto]
  in
  Arg.(value & opt (some opts) None & info ["parse"] ~docv ~doc)

let print =
  let docv = "FORM" in
  let doc = "print AST in FORM, which is one of: (ml | re (default) | \
             binary (for compiler input) | \
             binary_reason (for interchange between Reason versions) | \
             ast (print human readable AST directly) | none)"
  in
  let opts = Arg.enum ["ml", `ML; "re", `Reason; "binary", `Binary;
                       "binary_reason", `BinaryReason; "ast", `AST;
                       "none", `None]
  in
  Arg.(value & opt opts `Reason & info ["p"; "print"] ~docv ~doc)

let print_width =
  let docv = "COLS" in
  let doc = "wrapping width for printing the AST" in
  Arg.(value & opt (int) (80) & info ["w"; "print-width"] ~docv ~doc)

let heuristics_file =
  let doc =
    "load path as a heuristics file to specify which constructors carry a tuple \
     rather than multiple arguments. Mostly used in removing [@implicit_arity] introduced from \
     OCaml conversion.\n\t\texample.txt:\n\t\tConstructor1\n\t\tConstructor2"
  in
  Arg.(value & opt (some file) None & info ["h"; "heuristics-file"] ~doc)

let in_place =
  let doc = "reformat a file in-place" in
  Arg.(value & flag & info ["in-place"] ~doc)

let input =
  let docv = "FILENAMES" in
  let doc = "input files; if empty, assume stdin" in
  Arg.(value & (pos_all non_dir_file []) & info [] ~docv ~doc)

end
#1 "refmt_impl.ml"
(*
 * Copyright (c) 2015-present, Facebook, Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *)

module Cmdliner = Vendored_cmdliner
open Cmdliner

let read_lines file =
  let list = ref [] in
  let chan = open_in_bin file in
  try
    while true do
      list := input_line chan :: !list
    done;
    []
  with End_of_file ->
    close_in chan;
    List.rev !list

let refmt
    interface
    is_recoverable
    explicit_arity
    parse_ast
    print
    print_width
    heuristics_file
    in_place
    input_files
  =
  let refmt_single input_file =
    let (use_stdin, input_file) = match input_file with
      | Some name -> (false, name)
      | None -> (true, "")
    in
    let eol = match use_stdin, input_file with
      | (true, _) -> Eol_detect.default_eol
      | (false, name) -> Eol_detect.get_eol_for_file name
    in
    let parse_ast = match parse_ast, use_stdin with
      | (Some x, _) -> x
      | (None, false) -> `Auto
      | (None, true) -> `Reason (* default *)
    in
    let constructorLists = match heuristics_file with
      | Some f_name -> read_lines f_name
      | None -> []
    in
    let interface = match interface with
      | true -> true
      | false -> (Filename.check_suffix input_file ".rei" || Filename.check_suffix input_file ".mli")
    in
    let output_file =
      match in_place, use_stdin with
      | (true, true) -> Printer_maker.err "Cannot write in place to stdin."
      | (true,    _) -> Some input_file
      | (false,   _) -> None
    in
    let (module Printer : Printer_maker.PRINTER) =
      if interface then (module Reason_interface_printer)
      else (module Reason_implementation_printer)
    in
    Reason_config.configure ~r:is_recoverable;
    Location.input_name := input_file;
    let _ = Reason_pprint_ast.configure
        ~width: print_width
        ~assumeExplicitArity: explicit_arity
        ~constructorLists
    in
    let (ast, parsedAsML) =
      Printer.parse ~use_stdin parse_ast input_file
    in
    let output_chan = Printer_maker.prepare_output_file output_file in
    (* If you run into trouble with this (or need to use std_formatter by
       itself at the same time for some reason), try breaking this out so that
       it's not possible to call Format.formatter_of_out_channel on stdout. *)
    let output_formatter = Eol_convert.get_formatter output_chan eol in
    (
      Printer.print print input_file parsedAsML output_chan output_formatter ast;
      (* Also closes all open boxes. *)
      Format.pp_print_flush output_formatter ();
      flush output_chan;
      Printer_maker.close_output_file output_file output_chan;
    )
  in
  try
    match input_files with
    | [] -> `Ok (refmt_single None)
    | _ -> `Ok (List.iter (fun file -> refmt_single (Some file)) input_files)
  with
  | Printer_maker.Invalid_config msg -> `Error (true, msg)
  | exn ->
          Location.report_exception Format.err_formatter exn;
          exit 1

let top_level_info =
  let doc = "Reason's Parser & Pretty-printer" in
  let man = [`S "DESCRIPTION"; `P "refmt lets you format Reason files, parse them, and convert them between OCaml syntax and Reason syntax."] in
let version = "Reason " ^ Package.version ^ " @ " ^ Package.git_short_version
  in
  Term.info "refmt" ~version ~doc ~man

let refmt_t =
  let open Term in
  let open Refmt_args in
  const refmt $ interface
              $ recoverable
              $ explicit_arity
              $ parse_ast
              $ print
              $ print_width
              $ heuristics_file
              $ in_place
              $ input

let () =
  match Term.eval ((Term.ret refmt_t), top_level_info) with
  | `Error _ -> exit 1
  | _ -> exit 0
